私は醜いサーバーの問題を抱えています、そして私はこれに関する詳細を見落とさないようにしています。
私の仮想メールユーザーのパスワードは、MySQLのENCRYPT機能とともに保存されます。私の基本的な考え方は、古いマシンから仮想ユーザーのテーブルをダンプしてから、新しいマシンにインポートすることでした。
念のためENCRYPT、もう一度文字列を保存しようとしましたが、保存されているデータが異なります。これは、思ったとおりにユーザーをエクスポート/インポートできないことを意味しますか?
Datajamがすでに説明したことは正しいです。ここにいくつかのさらなる説明があります。
関数にソルトを指定しない場合ENCRYPT()、ランダムなソルトが生成され、文字列の暗号化に使用されます。ソルトは2バイト/文字です。
最初にENCRYPT()、同じ文字列で2回実行すると、異なる値が得られることを示します(ランダムソルトが異なるため)
mysql> SELECT ENCRYPT('hello');
+------------------+
| ENCRYPT('hello') |
+------------------+
| 5Q5CiJWj4GItY |
+------------------+
1 row in set (0.02 sec)
mysql> SELECT ENCRYPT('hello');
+------------------+
| ENCRYPT('hello') |
+------------------+
| 7QHPY3iSLVdas |
+------------------+
1 row in set (0.00 sec)
ここで、最後のエントリを使用しENCRYPT()て、ソルトとしてすでに持っている値を再度使用しようとすると、同じ結果が返されます。
mysql> SELECT ENCRYPT('hello', '7QHPY3iSLVdas');
+-----------------------------------+
| ENCRYPT('hello', '7QHPY3iSLVdas') |
+-----------------------------------+
| 7QHPY3iSLVdas |
+-----------------------------------+
1 row in set (0.00 sec)
同じソルトで文字列(パスワード)を間違えた場合、異なる値を取得することを証明するためだけに。この例では、最初の2つの文字(単なるソルト)は同じままであることに注意してください。
mysql> SELECT ENCRYPT('helloX', '7QHPY3iSLVdas');
+------------------------------------+
| ENCRYPT('helloX', '7QHPY3iSLVdas') |
+------------------------------------+
| 7QKDSis4DZnCU |
+------------------------------------+
1 row in set (0.01 sec)
この情報を使用して、ENCRYPT()両方のMySQLサーバーで同じソルトを指定する関数を実行して、同じ結果が返されるようにする必要があります。そうでない場合、crypt()の実装は2つの間で異なる可能性があります。
これは古い投稿だと理解していますが、同様の問題が発生した場合は、暗号化されたすべてのパスワードを再構築する必要はありません。塩は最初の2文字です。
ENCRYPT関数は、まさにその理由で入力をランダムな値でソルトする可能性があります。同じデータを2回暗号化して、異なる暗号文を生成する必要があります。
MySQLのENCRYPT()関数には、ハッシュアルゴリズムで使用されるソルトを定義するためのオプションの2番目の引数があります。ソルトを指定しない場合、同じ入力文字列であっても、結果は異なります。
データベースを移行していて、同じハッシュを保持したい場合は、同じソルト値も使用していることを確認してください。ENCRYPT()同じ入力文字列とソルト値で同じ結果が得られるはずです。