PHP.crypt()的结果对于不同的字符串和盐是相同的
因为我使用的是旧版本的PHP,所以必须使用PHP.crypt()的结果对于不同的字符串和盐是相同的,php,security,cryptography,password-encryption,crypt,Php,Security,Cryptography,Password Encryption,Crypt,因为我使用的是旧版本的PHP,所以必须使用.crypt()。我正在测试一些密码验证,服务器正在验证错误的密码是否正确。然后我决定进行最基本的测试,我仍然有这个问题: <?php echo crypt("cryptcryptcrypt","salt"); echo "<br>"; echo crypt("cryptcryptcrypta","salta"); ?> 为什么会这样 出于测试目的,我正在使用,因此您可能会发现这在回答…引用以下内容时很有用: 标准的基于DES
.crypt()
。我正在测试一些密码验证,服务器正在验证错误的密码是否正确。然后我决定进行最基本的测试,我仍然有这个问题:
<?php
echo crypt("cryptcryptcrypt","salt");
echo "<br>";
echo crypt("cryptcryptcrypta","salta");
?>
为什么会这样
出于测试目的,我正在使用,因此您可能会发现这在回答…引用以下内容时很有用: 标准的基于DES的crypt()返回salt作为输出的前两个字符。它还只使用str的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的salt时) 您提供的salt只有4或5个字符长,这使得crypt使用基于DES的标准算法。因此,只使用前9个字符的密码,并且只使用前两个字符的salt。因此,您的哈希值是相等的。你真的应该更新你的PHP版本,这样你就可以使用现代的密码散列函数了。如果不可能,请尝试使用与PHP版本3及更高版本兼容的。如果不可能,请继续阅读 您需要以正确的格式将salt传递给crypt函数。根据文档中的示例:
if (CRYPT_BLOWFISH == 1) {
echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA256 == 1) {
echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA512 == 1) {
echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}
哈希的开头定义了要使用的算法。您还需要确保为每个用户使用随机唯一的salt。引用:
标准的基于DES的crypt()返回salt作为输出的前两个字符。它还只使用str的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的salt时)
您提供的salt只有4或5个字符长,这使得crypt使用基于DES的标准算法。因此,只使用前9个字符的密码,并且只使用前两个字符的salt。因此,您的哈希值是相等的。你真的应该更新你的PHP版本,这样你就可以使用现代的密码散列函数了。如果不可能,请尝试使用与PHP版本3及更高版本兼容的。如果不可能,请继续阅读
您需要以正确的格式将salt传递给crypt函数。根据文档中的示例:
if (CRYPT_BLOWFISH == 1) {
echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA256 == 1) {
echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA512 == 1) {
echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}
哈希的开头定义了要使用的算法。您还需要确保为每个用户使用随机唯一的salt。
它也只使用str的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的salt时)。
解释了部分问题。为什么它们为两种不同的盐生成相同的输出是另一个问题。@sberry,盐应该是不同的吗?@1615903,很遗憾,我没有5.3.7。它也只使用str的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时).
解释了部分问题。为什么它们为两种不同的盐生成相同的输出是另一个完全不同的问题。@sberry,盐应该是不同的吗?@1615903,很遗憾,我没有5.3.7。你的问题是“为什么会发生这种情况”,所以我回答了这个问题-我现在修改了我的答案,加入了改善情况的建议。是的!很好:)。但这也很好吗<代码>$password=crypt($password,$6$rounds=5000.$salt.$)代码>这需要对需要PHP5.3.2的SHA-512的支持,我觉得您使用的是旧版本。你有哪个PHP版本?@Mirabilis-这取决于你的PHP版本,对于5.3.7你可以使用,对于5.3你可以将兼容包中的算法从2y
更改为2a
,对于更小的版本你应该使用上面提到的@1615903,我有PHP版本5.2.17-MIT-BACKPORT-GnuTLS。你的问题是“为什么会发生这种情况”所以我回答说-我现在修改了我的答案,加入了改善情况的建议。是的!很好:)。但这也很好吗?$password=crypt($password,$6$rounds=5000.$salt.$)
这需要对SHA-512的支持,SHA-512需要PHP5.3.2,我觉得您使用的是旧版本。您有哪一个PHP版本?@Mirabilis-这确实取决于您的PHP版本,对于5.3.7,您可以使用,对于5.3,您可以将兼容包中的算法从2y
更改为2a
,并且对于更小的版本,您应该使用上面提到的@1615903,我有PHP版本5.2.17-MIT-BACKPORT-GnuTLS。