问题描述

我正在开发一个插件,我很可能会在公共插件库中发布它,以便其他人可以使用它。

该插件将使用 API​​并使用您需要传递用户名和密码的 API 。所以我的插件需要将这些登录凭据存储在数据库中。我不想将它们存储在纯文本中,尽管 API 需要纯文本。

所以我的问题是如何存储这些敏感的信息?哈希是出来的,所以它必须是某种加密。

在 WordPress 中有一个可以使用的唯一键,这将不同于博客到博客?我应该使用哪些 php 函数进行加密和解密?我正在寻找的功能将更可能在所有的 WP 安装。

最佳解决方案

虽然我同意以前的答案,为了回答你实际提出的问题,需要注意的是使用这些常量之一用于 wp-config.php:


define('AUTH_KEY',        'redacted');
define('SECURE_AUTH_KEY', 'redacted');
define('LOGGED_IN_KEY',   'redacted');
define('NONCE_KEY',       'redacted');

它们意味着在 WordPress 安装中是独一无二的,并且是关于在 WordPress 中找到的 pre-existing 密钥的唯一选项。替代的是添加您自己的类似的常量,它们通过将其中一个与管理员电子邮件地址或类似的方式进行哈希建立,然后将其存储在隐藏的设置选项中,以防止在您的密码之后意外修改密钥时丢失密钥插件已安装。危险在于,如果在初始安装时不是唯一的,但是管理员/站点所有者决定在事件发生之后纠正故障,则不应意外中断您的密码加密。

至于加密/解密功能 – 快速的 Google 搜索返回以下列表,其代码似乎符合账单:http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-strong-encryption-decryption-php-functions/


function encrypt($input_string, $key){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $h_key = hash('sha256', $key, TRUE);
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $h_key, $input_string, MCRYPT_MODE_ECB, $iv));
}

function decrypt($encrypted_input_string, $key){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $h_key = hash('sha256', $key, TRUE);
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $h_key, base64_decode($encrypted_input_string), MCRYPT_MODE_ECB, $iv));
}

这里有一些 AES 加密文档:http://www.chilkatsoft.com/p/php_aes.asp

次佳解决方案

这正是 OAuth 设计的情况。

OAuth homepage

For Service Provider developers…

If you’re supporting…

  • web applications
  • server-side APIs
  • mashups

If you’re storing protected data on your users’ behalf, they shouldn’t be spreading their passwords around the web to get access to it. Use OAuth to give your users access to their data while protecting their account credentials.

OAuth 的优点是您不需要存储用户的密码。当他们第一次设置插件时,他们被要求通过应用程序登录用户名和密码 (通常是与 API 同一个服务器上托管的页面,并加载在页面重定向,thickbox 或者 iframe 中) 。

用户登录后,服务器 (您的系统) 将创建一个安全密钥,使其系统 (WordPress) 可以使用该 API 与 API 进行接口。该密钥对于用户帐户和站点是唯一的 – 并且它给予应用程序 (在 WordPress 上) 的权限,以代表用户身份执行 API,而不会每次都传递其身份验证信息。

如果你想看到一个这样的例子,请查看 Jetpack

当您激活插件时,它会抱怨其未连接。当您使用”connect” 时,您可以通过 WordPress.com 输入凭据,并设置 WordPress 与其 API 之间的 OAuth 交互。

但您只需执行一次,并且您的 WordPress.com 用户名/密码永远不会存储在本地 WordPress 数据库中。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。