2015-09-30 169 views
0

在存入數據庫之前,我使用PHP的crypt()函數對密碼進行加密。現在如果密碼包含數字,則具有相同子字符串的所有密碼將生成相同的加密。例如,下面的所有密碼都會生成相同的加密。使用crypt()函數生成相同加密的不同密碼

echo crypt('abcdefg123','mykey').'<br>'; 
echo crypt('abcdefg123','mykey').'<br>'; 
echo crypt('abcdefg123456','mykey').'<br>'; 

加密的密碼結果是

myeWT99Ku6TaM 

我在做什麼錯?或者它是一個錯誤?

+0

僅使用前8個字符來生成散列。由於所有輸入中的前8個字符相同,因此您將得到相同的結果。此外,生成的散列將<= 13個字符 – Tushar

+0

我也建議你檢查這個密碼散列在PHP中:http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing -passwords-in -php – Night2

+0

'crypt()'不提供[加密](https://paragonie.com/blog/2015/08/you-wouldnt-base64-a-password-cryptography-decoded),它提供密碼散列。密碼哈希是密碼學,但它不是加密。 –

回答

2

crypt函數以salt作爲第二個參數。 salt有特殊的格式描述here
您已經提供了一個salt,它被識別爲標準DES算法。

標準的基於DES的crypt()返回salt作爲輸出的前兩個字符。 它也只使用str的前八個字符,所以以相同的八個字符開頭的較長的字符串將生成相同的結果(當使用相同的鹽時)

提供適當的鹽。例如,試試這個爲MD5:

echo crypt('abcdefg123','$1$mykeyabcd$').'<br>'; 
echo crypt('abcdefg123','$1$mykeyabcd$').'<br>'; 
echo crypt('abcdefg123456','$1$mykeyabcd$').'<br>'; 
+0

前兩個產生相同的結果 – user1690835

+0

@ user1690835當然,他們這樣做。前兩個輸入字符串是相同的。 –

+0

Yeldar Kurmangaliyev好的。抱歉 – user1690835

0

我認爲這是因爲鹽。 默認情況下,您可以在crypt函數中使用CRYPT_STD_DES散列類型,並且此類型使用兩個字符salt,但是使用5個字母salt。

在鹽中使用無效字符將導致crypt()失敗。 http://php.net/manual/ru/function.crypt.php

相關問題