4

次のSQLを使用してメールボックスのパスワードをmysqlデータベースに保存するメールサーバーがあります。

ENCRYPT([PASSWORT], concat(_utf8"$1$", right(md5(rand()), 8), _utf8"$"))

しかし、データベースにはソルトは保存されていません。

このデータベースを中心にログインプロセスを構築する必要がありますが、ソルトが不足しているため、保存されているパスワードを比較するのは困難です。パスワードハッシュが次の形式でソルトを保持していることに気づきました。

$1$[SALT]$[PASSWORD-HASH]

ログインを構築するために同等のパスワードハッシュを作成するにはどうすればよいですか?

Dovecotは、保存されているパスワードを使用してユーザーにログインできますが、どのようにしたらよいでしょうか。

4

1 に答える 1

5

MySQLENCRYPT()関数は、さまざまなパスワード ハッシュ アルゴリズムを実装するcrypt(3) Unix ライブラリ関数を呼び出します。salt使用する特定のアルゴリズムは、ドル記号で囲まれたアルゴリズム識別子で始まるパラメーターによって選択されます。たとえば、で始まるソルトは、Poul Henning-Kamp による古い MD5 ベースのハッシュ スキームに$1$対応します。

(アルゴリズムを選択するこのかなり奇妙な方法の理由は歴史的なものです; 1976 年からの元の DES ベースの crypt(3) 設計は、代替のハッシュ アルゴリズムをサポートしていませんでした。古いパスワード データベースとの互換性を維持するためです. 結果として得られるシステムは、一見すると奇妙に見えますが、非常に優れた柔軟性を備えています.)

いずれにせよ、すべての crypt(3) ハッシュ アルゴリズム (元の DES ベースのものを含む) は、常に出力の先頭にソルト (およびそれに埋め込まれたアルゴリズム識別子) を含み、末尾に追加された余分なデータを無視します。塩投入。したがって、パスワード ハッシュを検証するには、元のハッシュをENCRYPT()ソルトとして入力し、それが出力と等しいかどうかを確認します。

SELECT user_id,
  password_hash = ENCRYPT('password', password_hash) AS password_is_correct
FROM user_table WHERE user_id = 12345;
于 2013-02-10T20:03:14.733 に答える