2015-09-30 111 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

相关问题