2011-04-14 43 views
3

我有一個ugly server issue,我想盡量不要忽略任何細節。爲什麼MySQL的ENCRYPT在每個調用中返回不同的結果?

我的虛擬郵件用戶密碼與MySQL的ENCRYPT函數一起存儲。我的基本想法是將我的虛擬用戶的表從舊機器中轉儲出來,然後將其導入新機器中。

只是爲了仔細檢查,我試圖存儲一個字符串ENCRYPT然後再次存儲的數據是不同的。這是否意味着我不能像我想的那樣簡單地導出/導入用戶?

+0

'使用Unix crypt()系統調用加密str並返回一個二進制字符串。「 - 您的問題應該是'crypt()'的輸出是否因系統而異,或者從分發到分佈。 – 2011-04-14 10:55:14

+0

@皮卡我剛剛閱讀手冊說什麼,但當我在同一臺機器上嘗試兩次相同的字符串,它給了我不同的結果。對不起,我可憐的知識,但電子郵件是在盒子上最重要的服務,所以我應該非常謹慎。 – fabrik 2011-04-14 10:59:54

+0

啊!我對自己的crypt()一無所知,所以我不能回答這個問題。也許增加一些標籤來吸引合適的人?想起Linux的''Unix'和'crypt'。 – 2011-04-14 11:03:43

回答

5

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()的實現可能在兩者之間有所不同。

+0

@詹姆斯ç不幸的是我什麼都不知道什麼是'hello',這就是我的問題。我不想解密這些加密的字符串,但我想,以確保我的新導入的數據庫將接受原始密碼。 – fabrik 2011-04-14 12:38:27

+0

如果您運行在兩臺服務器上'ENCRYPT(「富」,「棒」)'和接收相同的值回他們兩個那麼舊的密碼將在新機器上運行。未添加 – 2011-04-14 12:43:19

+0

@詹姆斯ç鹽原來如此加密的字符串是隨機的,看起來像什麼都沒有留下,但建立的立方體,然後嘗試,如果它的工作。謝謝你,詹姆斯 – fabrik 2011-04-14 12:50:53

0

由於這個原因,ENCRYPT函數很可能會使輸入具有隨機值 - 您要想要加密相同的數據兩次以給出不同的密文。

+0

不幸的是,不添加鹽時,密碼被保存:( – fabrik 2011-04-14 11:06:05

0

MySQL的ENCRYPT()函數有一個可選的第二個參數來定義哈希算法使用的salt。如果你不提供鹽,那麼結果將會不同,即使對於相同的輸入字符串。

如果您正在遷移數據庫並希望保留相同的散列,請確保您也使用相同的salt值。 ENCRYPT()應該使用相同的輸入字符串和鹽值給出相同的結果。

+0

謝謝你的答案,但遺憾的是,當密碼是沒有添加鹽存儲。 – fabrik 2011-04-14 11:14:46

1

我知道這是一箇舊的帖子,但如果你有類似的問題,你不需要重建所有的加密密碼。鹽是前兩個字符。

相關問題