如何将用户名和密码存储到WordPress选项数据库中的API?

时间:2011-08-05 作者:Scott

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

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

所以我的问题是如何存储这些敏感信息?散列已经过时,所以它必须是某种加密。

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

3 个回复
最合适的回答,由SO网友:marfarma 整理而成

虽然我同意前面的回答,但要回答您实际提出的问题,我想到的是在wp config中使用这些常量之一。php:

define(\'AUTH_KEY\',        \'redacted\');
define(\'SECURE_AUTH_KEY\', \'redacted\');
define(\'LOGGED_IN_KEY\',   \'redacted\');
define(\'NONCE_KEY\',       \'redacted\');
它们在wordpress安装中是独一无二的,并且是wordpress中现有密钥的唯一选项。另一种方法是添加您自己的类似常量,该常量是通过将其中一个常量与管理员电子邮件地址或类似内容进行哈希运算构建的,然后将其存储在隐藏的设置选项中,以防止在安装插件后有人意外修改密钥时丢失密钥。危险在于,如果它们在初始安装时不是唯一的,但管理员/站点所有者决定事后纠正故障,则它们不应意外破坏您的密码加密。

至于加密/解密功能,谷歌快速搜索会返回以下列表,其中包含符合要求的代码: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

SO网友:EAMann

这正是OAuth设计的初衷。

OAuth homepage:

For Service Provider developers...

如果你支持。。。

如果您是代表用户存储受保护的数据,他们不应该在web上传播密码来访问它。使用OAuth允许用户访问其数据,同时保护其帐户凭据。

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

用户登录后,服务器(您的系统)将创建一个安全密钥,他们的系统(WordPress)可以使用该密钥与API进行交互。此密钥对于用户帐户和站点是唯一的,它允许应用程序(在WordPress上)代表用户使用API进行操作,而无需每次传递其身份验证信息

如果您想看到这方面的示例,请查看Jetpack.

当你激活插件时,它会抱怨它没有连接。当您“连接”它时,您可以通过WordPress输入凭据。com和建立WordPress及其API之间的OAuth交互。

但是你只需要做一次,然后用你的WordPress。com用户名/密码从不存储在本地WordPress数据库中。

SO网友:cgogolin

这是一个重要的问题,因为许多服务仍然不支持OAuth,并且将密码存储在选项数据库中可以让每个Wordpress插件都能读取它们(请参阅我上面的评论)。

这不是(目前)这个问题的真正答案,但也太长了,无法发表评论。我希望就此展开讨论,以期为这个“无法解决”的问题找到“最佳”的可能解决方案。

让我认为加密密码是可能的基本想法如下:

There is one piece of secret information every user has: their Wordpress password. It should be possible to store credentials to third party services encrypted with a secret derived form that password and only decrypt them when the user is logged in.

通过这种方式,至少可以使从Wordpress文件和数据库的副本中窃取密码成为可能。它无法解决其他插件窃取凭据的问题,因为每个插件都可以在登录时捕获纯文本密码。

实际上,解密相当容易:假设我们已经在数据库中存储了第三方服务的加密版本,我们可以挂接到\'authenticate\' 筛选或覆盖wp_authenticate() 函数,生成纯文本用户密码的附加哈希(通过wp_hash_password()), 将散列密码作为加密密钥存储在某个私有位置,直到用户注销(使用\'wp_logout\' 钩子删除密钥),并在每次需要第三方密码解密数据库中的加密值时使用它。

虽然我觉得这应该是可行的,但仍有几个问题没有解决:

如何加密?可能会存储纯文本密码,直到用户注销并再次登录,然后在\'authenticate\'. 系统可能会提示用户登录,以保持登录时间,直到这种情况发生将密钥存储在何处,以及如何在注销期间将其删除?我是否正确理解\'authenticate\' 是否仅在用户实际登录时运行catch 这样的密码会更改,然后必须使用从新密码派生的密钥对第三方密码进行重新加密

结束