我有一個ugly server issue,我想盡量不要忽略任何細節。爲什麼MySQL的ENCRYPT在每個調用中返回不同的結果?
我的虛擬郵件用戶密碼與MySQL的ENCRYPT
函數一起存儲。我的基本想法是將我的虛擬用戶的表從舊機器中轉儲出來,然後將其導入新機器中。
只是爲了仔細檢查,我試圖存儲一個字符串ENCRYPT
然後再次存儲的數據是不同的。這是否意味着我不能像我想的那樣簡單地導出/導入用戶?
我有一個ugly server issue,我想盡量不要忽略任何細節。爲什麼MySQL的ENCRYPT在每個調用中返回不同的結果?
我的虛擬郵件用戶密碼與MySQL的ENCRYPT
函數一起存儲。我的基本想法是將我的虛擬用戶的表從舊機器中轉儲出來,然後將其導入新機器中。
只是爲了仔細檢查,我試圖存儲一個字符串ENCRYPT
然後再次存儲的數據是不同的。這是否意味着我不能像我想的那樣簡單地導出/導入用戶?
Datajam已經描述的是正確的。這裏有一些進一步的解釋。
如果您不提供ENCRYPT()
函數的鹽,則會生成一個隨機函數用於加密字符串。鹽只有兩個字節/字符。
首先,我將證明,如果我有相同的字符串運行ENCRYPT()
兩次,如果我用的是最後一項,並嘗試ENCRYPT()
它會給不同的值(因爲隨機鹽不同)
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)
現在再次使用我們已經爲鹽,我們將得到同樣的結果返回值:
mysql> SELECT ENCRYPT('hello', '7QHPY3iSLVdas');
+-----------------------------------+
| ENCRYPT('hello', '7QHPY3iSLVdas') |
+-----------------------------------+
| 7QHPY3iSLVdas |
+-----------------------------------+
1 row in set (0.00 sec)
只是爲了證明,如果我們得到的字符串(密碼)錯誤的相同的鹽,我們會得到不同的值。注意在這個例子中,兩個第一個字符(它們只是鹽)保持不變。
mysql> SELECT ENCRYPT('helloX', '7QHPY3iSLVdas');
+------------------------------------+
| ENCRYPT('helloX', '7QHPY3iSLVdas') |
+------------------------------------+
| 7QKDSis4DZnCU |
+------------------------------------+
1 row in set (0.01 sec)
利用這些信息,你應該嘗試運行ENCRYPT()
功能均的MySQL服務器指定相同的鹽與你都應該得到同樣的結果回來。如果不是,那麼crypt()的實現可能在兩者之間有所不同。
由於這個原因,ENCRYPT函數很可能會使輸入具有隨機值 - 您要想要加密相同的數據兩次以給出不同的密文。
不幸的是,不添加鹽時,密碼被保存:( – fabrik 2011-04-14 11:06:05
MySQL的ENCRYPT()
函數有一個可選的第二個參數來定義哈希算法使用的salt。如果你不提供鹽,那麼結果將會不同,即使對於相同的輸入字符串。
如果您正在遷移數據庫並希望保留相同的散列,請確保您也使用相同的salt值。 ENCRYPT()
應該使用相同的輸入字符串和鹽值給出相同的結果。
謝謝你的答案,但遺憾的是,當密碼是沒有添加鹽存儲。 – fabrik 2011-04-14 11:14:46
我知道這是一箇舊的帖子,但如果你有類似的問題,你不需要重建所有的加密密碼。鹽是前兩個字符。
'使用Unix crypt()系統調用加密str並返回一個二進制字符串。「 - 您的問題應該是'crypt()'的輸出是否因系統而異,或者從分發到分佈。 – 2011-04-14 10:55:14
@皮卡我剛剛閱讀手冊說什麼,但當我在同一臺機器上嘗試兩次相同的字符串,它給了我不同的結果。對不起,我可憐的知識,但電子郵件是在盒子上最重要的服務,所以我應該非常謹慎。 – fabrik 2011-04-14 10:59:54
啊!我對自己的crypt()一無所知,所以我不能回答這個問題。也許增加一些標籤來吸引合適的人?想起Linux的''Unix'和'crypt'。 – 2011-04-14 11:03:43