mysqlでapache互換のパスワードを生成する

Aug 17 2020

現在、古いウェブサーバーを移行中です。

古いサーバーは、mysqlテーブルに保存され、mod_auth_mysql有効になっているユーザーに対して基本認証を使用します。

アパッチで保存されたパスワードイストはSHA1機能で構築する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_mysqlmysql(SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3)によって生成された古い受け入れられたハッシュはそうではありませんが、mod_authn_dbdはそうではありません。

による https://documentation.help/httpd-2.4-es/password_encryptions.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 Rouben Aug 17 2020 at 21:27

あなたはPHPの例であなた自身の質問に答えました。PHPのpack()関数は、バイナリデータの16進表現(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だけで目的の出力が得られます。

JürgenSteinblock Aug 17 2020 at 21:07

これは私の質問に対する直接の答えではありませんが、誰かが同じ問題に遭遇したブログ投稿を見つけた回避策かもしれません。

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なし)、パスワードがこのように格納されている列でユーザーテーブルを適切に拡張します。少し冗長ですが、動作するはずです。