問題描述
安裝新鮮的 wordpress 時,應該做的一件事是更新 wp-config.php 中的鹽。
該部分看起來像這樣
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
如果客户端確實更改這些鹽或者常量不存在,wordpress 將會將這些值保存在數據庫內。
為了生成鹽,它使用 wp_generate_password(64, true, true)這樣做的代碼可以在 1993 年的可插拔中找到。
現在的問題是:
-
wp_generate_password與推薦的https://api.wordpress.org/secret-key/1.1/salt/產生的鹽一樣安全 -
通過在數據庫中使用鹽,這種方法可能會降低安全性。
-
是否有任何安全隱患,無法設置值,並讓它們隨機生成數據庫?
最佳解決方案
- Is
wp_generate_password()as safe as the salts generated by the recommendedhttps://api.wordpress.org/secret-key/1.1/salt/?
這些細節由於顯而易見的原因無法回答,內部人員不知道。如果我們可以回答這個問題,那麼將會知道允許逆向工程的細節。這可能導致安全性下降。請注意,有人仍然可以嘗試為此 Url 設置一個請求數量,然後嘗試逆向工程,以查看哪些氣泡到表面。
- Is there any downgrade in security by having the salts in the database as this method falls back to that?
是。您不想將安全詳細信息/身份驗證憑據保存在其他人可以訪問的任何地方。這包括:
-
版本控制
-
命令行歷史
-
數據庫或文件備份
-
…
將您的身份驗證憑據和相關數據 (例如”salt”) 保存在.env 文件 (參見 Dotenv package) 中,在您的部署服務秘密安全港中,在單獨的配置文件 (例如 AWS 憑證文件) 中,因此僅在一個位置。
- Does it have any security implications to not set the values and let them be generated randomly on the fly
to the db?
是。在 Cookie 中也使用了身份驗證常數,您將無效用户登錄會話,無效您的用户 Cookie 。這些是常數的原因:他們應該堅持不要更改每個請求。
編輯:正如 @gmazzap 指出的那樣,我不是在説保存到數據庫的值,而是關於 「生成的」 常量。如果將其保存到數據庫中,請參閲有關安全性的第 2 點。
要進一步添加,請從 @Mark Kaplun 的 the link 中閲讀並詳細閲讀 @gmazzap 答案 (並同時升級) 。
附加註意/提醒:始終向 API 服務器的檢索數據添加一些自己的偽隨機字符。永遠不會將您的憑據或數據庫放在手中。您不會相信人們往往會發送電子郵件,保存在 usb-sticks,他們的私人保管箱帳户或沒有密碼的筆記本電腦上的硬盤上
編輯:在 @stephenharris 在 [聊天] 中指出,有一個有趣的 blog post around that topic 比我們的答案更詳細。
次佳解決方案
Is wp_generate_password()as safe as the salts generated by the recommended https://api.wordpress.org/secret-key/1.1/salt/
作為 @kaiser said,API 鹽生成的內部細節是未知的,但是最重要的是,API 返回一個 64 個字符的字符串,其中每個字符是 wp_generate_password()使用的 92 個可能的字形之一。
請注意,如果服務器具有 PHP 7,則使用 PHP 7 CSPRNG 生成用於選擇其中一個 92 個字形的隨機整數,並且我懷疑該 API 將具有更強的功能。在較舊的 PHP 版本中,隨機值由 mt_rand 提供。
考慮到這一點,考慮到密碼的強度更多地依賴於加密算法,然後使用鹽,我可以説,是的,wp_generate_password 非常可能與 API 產生的鹽一樣安全。
Is there any downgrade in security by having the salts in the database as this method falls back to that.
對於這一點,我同意 @kaiser 。
假設有人獲取數據庫轉儲副本,完成備份。在該數據庫轉儲中,他們可以看到您的用户密碼,但加密。
如果他們可以使用鹽,那麼他們更容易駭客你的網站。
此外,通過瞭解所使用的鹽,用户 ID 和用户元 (存儲會話令牌的位置),非常容易為任何用户重現非隨機值,而無需知道”decrypted” 密碼。
當然,如果惡意用户獲取數據庫的副本,您的安全性是非常危險的,但是通過在 db 中存儲鹽,您可以使惡意用户的生命更輕鬆。
Does it have any security implications to not set the values and let them be generated randomly on the fly to the db?
如果沒有設置鹽,它們僅在 WPA 第一次嘗試訪問它們時生成 wp_generate_password(),然後存儲到數據庫中,並在隨後的請求中將它們從那裏拉出。
如前所述,由 wp_generate_password()產生的鹽本身並不糟糕,但是由於它們存儲在 db 中,所以在先前所説的情況下,安全性的含義是:如果有人可以訪問您的數據庫副本,那麼 db 副本含有鹽。
然而,當 non-secure 值用於鹽時,真正的安全隱患是。事實上,如果在配置中設置了弱值,WP 將不會產生任何值,但會使用該弱值。總之,如果選擇在配置中沒有鹽和弱鹽,前者肯定會更好。
請注意,在最近版本的 WP(不確定是哪個確切版本) 中,默認值'put your unique phrase here'被忽略,因此如果 wp-config.php 包含任何鹽的值,WordPress 將忽略它,並使用 wp_generate_password()生成的值優於弱值,但比存儲在配置中的強值更差 (因為在 db 中存儲鹽) 。即使使用相同的鹽值多次使用鹽,也可使用自動產生的值。
説明
-
在更改之前,鹽的更改將註銷登錄您的站點的任何用户,包括在您更改時未登錄的用户,但在更改前登錄時選擇了”remember me” 選項。
-
當使用”installer”(沒有手動創建
wp-config.php) 安裝 WordPress 時,會產生從 API 引出值的鹽值。
第三種解決方案
-
這取決於機器上可以實現的隨機性。我不會重新確定詳細信息,但是如果您的機器的隨機性不夠好,那麼 wordpress.org API 就是這樣。
-
可能不會。如果有人有這樣的訪問您的數據庫或代碼,那麼你是烤麪包在任何情況下,得到鹽是你面臨的最不重要的問題。
-
這樣做的原因是什麼?從數據庫中獲取這 8 個值將使每個頁面的服務速度稍微慢一點,而不會為您的安全性增加任何價值。
編輯:為什麼隨機性 (熵) 是重要的
首先,也許這個 https://security.stackexchange.com/questions/61676/why-do-wordpress-installations-retrieve-the-crypto-secrets-remotely-on-installat 會比我更好地解釋它
問題是不應該猜到鹽,因為它們是通過在大多數操作系統上的一些隨機數發生器進行中繼而產生的。但是並不是所有的隨機生成器都是相等的,如果你的生成器不把它們作為輸入的一些值,那麼它會產生相同的數字序列,因此任何檢查操作系統的行為的人都可以説出第一個將生成 1000 個數字,將其用作鹽,並可以更容易地猜測您的密碼。
這在共享主機環境中尤其成問題,其中所有站點使用相同的隨機生成器,因此可以訪問隨機生成的數字的序列,並且基於 OS 的知識,並且其使用的隨機算法可以猜測下一個和以前生成的數字。
旁註:這就是為什麼智能手機和其他軟件要求您在初始化設備/軟件時進行一些隨機輸入的原因。該隨機輸入用作隨機數生成的基礎,並確保每個設備將生成不同的數字序列。
使用 wordpress.org 作為隨機數字生成器的優點是,知道由它生成的數字是不可能的,因為您不知道使用哪種算法,如何初始化哪些算法,以及哪裏按照你目前的順序。
但是作為我所説的問題,轉發外部服務也是一個安全問題。我發現這是邊界偏執狂,因為這種攻擊大道需要大多數攻擊者缺乏 (在攻擊 wordpress 網站的背景下) 的複雜性,我不會擔心隨機發生器的質量,但如果你這樣做,你必須做的是自己生成鹽,也許是使用一些與服務器無關的隨機生成器軟件,並更新配置文件。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。