產生 apache 與 mysql 相容的密碼

產生 apache 與 mysql 相容的密碼

我目前正在遷移舊的網頁伺服器。

舊伺服器使用基本驗證,使用者儲存在 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),我可能會用這樣儲存密碼的欄位來擴充我的使用者表。有點多餘,但應該可以。

相關內容