MySQLでApache互換のパスワードを生成する

MySQLでApache互換のパスワードを生成する

現在、古い Web サーバーを移行中です。

古いサーバーは、MySQL テーブルに保存されmod_auth_mysql有効化されたユーザーによる基本認証を使用します。

パスワードはApacheの組み込みの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

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 のみで目的の出力が得られます。

答え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 なし)、パスワードがこのように保存されている列を使用してユーザー テーブルを拡張することになります。少し冗長ですが、機能するはずです。

関連情報