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