我目前正在开发一个插件,很可能我会在公共插件存储库中发布它,以便其他人可以使用它。
该插件将使用API,并且要使用此API,您需要传递用户名和密码。因此,我的插件需要将这些登录凭据存储在数据库中。尽管API需要使用纯文本格式,但我不想将它们存储为纯文本格式。
所以我的问题是如何存储这些敏感信息?散列不存在,因此必须进行某种加密。
在WordPress中,有一个可以使用的唯一密钥,该密钥因博客而异?我应该使用哪些PHP函数进行加密和解密?我正在寻找可以在所有WP安装中正常工作的功能。
我目前正在开发一个插件,很可能我会在公共插件存储库中发布它,以便其他人可以使用它。
该插件将使用API,并且要使用此API,您需要传递用户名和密码。因此,我的插件需要将这些登录凭据存储在数据库中。尽管API需要使用纯文本格式,但我不想将它们存储为纯文本格式。
所以我的问题是如何存储这些敏感信息?散列不存在,因此必须进行某种加密。
在WordPress中,有一个可以使用的唯一密钥,该密钥因博客而异?我应该使用哪些PHP函数进行加密和解密?我正在寻找可以在所有WP安装中正常工作的功能。
Answers:
尽管我同意前面的答案,但要回答您实际提出的问题,想到的是对wp-config.php使用以下常量之一:
define('AUTH_KEY','rededed'); define('SECURE_AUTH_KEY','rededed'); define('LOGGED_IN_KEY','rededed'); define('NONCE_KEY','rededed');
它们在整个wordpress安装中是唯一的-并且是在wordpress中找到预先存在的密钥的唯一选项。备用方法是添加您自己的类似常量,该常量是通过将其中一个相对于管理员电子邮件地址或类似哈希值进行哈希处理而构建的-然后将其存储在隐藏的设置选项中-以防止有人在您修改后意外修改密钥而丢失密钥插件已安装。危险是,如果它们在初始安装时不是唯一的,但是管理员/站点所有者决定在事后纠正错误,那么他们就不要无意间破坏了您的密码加密。
至于加密/解密功能-快速的Google搜索会返回以下列表,并列出符合要求的代码:http : //maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-strong-加密解密php功能/
函数crypto($ 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); 返回base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$ h_key,$ input_string,MCRYPT_MODE_ECB,$ iv)); } 函数crypto($ 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); 返回修剪(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主页上:
对于服务提供商开发人员...
如果您支持...
- 网络应用
- 服务器端API
- 混搭
如果您代表用户存储受保护的数据,则不应在网络上散布密码以获取访问权限。使用OAuth可让您的用户访问其数据,同时保护其帐户凭据。
OAuth的优点是您不需要存储用户密码。首次设置插件时,系统会要求他们使用用户名和密码通过应用程序登录(通常,该页面与API托管在同一服务器上,并加载到页面重定向,thickbox或iframe中) 。
用户登录后,服务器(您的系统)将创建一个安全密钥,其系统(WordPress)可以使用该密钥与API交互。该密钥对于用户帐户和网站而言是唯一的-并赋予应用程序(在WordPress上)代表用户使用API进行操作的权限,而无需每次都传递其身份验证信息。
如果您想看到一个实际的例子,请查看Jetpack。
当您激活插件时,它会抱怨其未连接。当您“连接”它时,您可以通过WordPress.com输入凭据,并设置WordPress及其API之间的OAuth交互。
但是您只需要执行一次,您的WordPress.com用户名/密码就永远不会存储在本地WordPress数据库中。
这是一个重要的问题,因为许多服务仍然不支持OAuth,并且在选项数据库中存储密码使密码对于每个Wordpress插件都是可读的(请参见上面的评论)。
这还不是问题的真正答案,但评论太久。我希望对此进行讨论,以期提出解决此“无法解决”问题的“最佳”解决方案。
使我认为可以加密密码的基本思想如下:
每个用户都有一个秘密信息:他们的Wordpress密码。应该可以将凭据存储到使用秘密派生形式(通过该密码)进行加密的第三方服务,并且仅在用户登录时才对其进行解密。
这样,应该至少有可能使它无法从Wordpress文件和数据库的副本中窃取密码。它不能解决其他插件窃取凭据的问题,因为每个插件都可以在登录期间捕获纯文本密码。
解密实际上很容易:假设我们已经在数据库中存储了第三方服务的加密版本,我们可以连接到'authenticate'
过滤器或通过覆盖wp_authenticate()
函数,生成纯文本用户密码的盐化哈希(通过的手段wp_hash_password()
),商店,哈希密码作为加密密钥某处私人,直到用户注销(使用'wp_logout'
钩删除键),并用它每次我们需要第三方密码数据库解密加密值的时间。
虽然我认为应该可以进行这项工作,但是仍然存在一些未解决的问题:
'authenticate'
。可能会提示用户登录以保留时间,直到发生这种情况。'authenticate'
仅在用户实际登录时才运行?