問題描述
我正在開發一個插件,我很可能會在公共插件庫中發佈它,以便其他人可以使用它。
該插件將使用 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 設計的情況。
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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。