我目前正在遷移舊的網頁伺服器。
舊伺服器使用基本驗證,使用者儲存在 mysql 表中並mod_auth_mysql
啟用。
密碼儲存在 sha1 函數中的 apaches 中,SELECT sha1('secret')
適用於mod_auth_mysql
不幸的mod_auth_mysql
是不再支持。這就是為什麼我找到了mod_authn_dbd
替代方案。
https://documentation.help/httpd-2.4-es/mod_authn_dbd.html
我已經設法讓一切正常運行,直到我可以使用基本身份驗證和固定密碼登錄
<Location />
AuthType Basic
AuthName "Test"
AuthBasicProvider dbd
Require valid-user
AuthDBDUserPWQuery "SELECT '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=' FROM users WHERE user = %s"
</Location>
我只將 sha1 哈希值儲存在用戶表中。而舊的mod_auth_mysql
接受由 mysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
) mod_authn_dbd 產生的雜湊值則不然。
根據https://documentation.help/httpd-2.4-es/password_cryptions.html
SHA1 "{SHA}" + Base64 編碼的密碼 SHA-1 摘要。
接受 htpasswd 產生的密碼。
htpasswd -bns user test
user:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
現在我需要將該值a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
(儲存在我的資料庫中用於密碼測試)轉換為qUqP5cyxm6YcTAhz05Hph5gvu9M=
(密碼測試的接受值)在mysql內
我已經嘗試過了
SELECT to_base64(sha1('test')), to_base64(ucase(sha1('test'))), to_base64(lcase(sha1('test')));`
但沒有一個能產生預期的結果。
我要么需要一種方法將現有的密碼雜湊轉換為預期格式,要么說服mod_authn_dbd
接受我現有的 sha1 雜湊。
任何幫助,將不勝感激
答案1
您用 PHP 範例回答了您自己的問題。 PHP 中的 pack() 函數將二進位資料的十六進位表示形式(SHA-1 雜湊值通常顯示為人類可讀的)轉換為其原始二進位(非人類可讀)形式。您需要針對生成的 SHA-1 雜湊的二進位形式執行 to_base64(),如下所示:
mysql> SELECT to_base64(unhex(sha1('test')));
+--------------------------------+
| to_base64(unhex(sha1('test'))) |
+--------------------------------+
| qUqP5cyxm6YcTAhz05Hph5gvu9M= |
+--------------------------------+
1 row in set (0.00 sec)
在這種情況下,您將僅使用 MySQL 來獲得所需的輸出。
答案2
這不是我的問題的直接答案,但可能是一種解決方法,我發現一篇部落格文章中有人遇到了同樣的問題。
http://nileshbansal.blogspot.com/2008/06/password-encryption-mysql-apache-and.html
在評論中有一個關於如何使用 php 建立 htpasswd 相容哈希的連結。我確認這給出了與htpasswd -bns
命令相同的結果
function sha1_to_htpasswd ( $user, $sha )
{
return $user . ':{SHA}' . base64_encode( pack( "H" . strlen( $sha ), $sha ) );
}
如果沒有人知道更好的解決方案(只有 mysql 而沒有 php),我可能會用這樣儲存密碼的欄位來擴充我的使用者表。有點多餘,但應該可以。