Php 使用'提供用于加密的salt;crypt()';isn';t影响输出+;关于地穴的问题

Php 使用'提供用于加密的salt;crypt()';isn';t影响输出+;关于地穴的问题,php,crypt,Php,Crypt,我在一个PHP页面中有这段代码,我正在运行多次。每次我刷新页面时,salt都会发生变化(应该如此),但散列输出保持不变 $iv = mcrypt_create_iv(22); $ro = rand(6, 9); $salt = '$2y$'.$ro.'$'.$iv.'$'; echo $salt; echo '<br />'; $crypt = crypt('test', $salt); echo $crypt; $iv=mcrypt\u create\u iv(22); $ro=

我在一个PHP页面中有这段代码,我正在运行多次。每次我刷新页面时,salt都会发生变化(应该如此),但散列输出保持不变

$iv = mcrypt_create_iv(22);
$ro = rand(6, 9);
$salt = '$2y$'.$ro.'$'.$iv.'$';
echo $salt;
echo '<br />';
$crypt = crypt('test', $salt);
echo $crypt;
$iv=mcrypt\u create\u iv(22);
$ro=兰特(6,9);
$salt='2y$。$ro.$'.$iv.$';
回声$盐;
回声“
”; $crypt=crypt('test',$salt); echo$crypt;
随机salt是否应该影响输出,并使其在每次刷新页面时,crypt结果也发生变化

我还有一些关于
crypt()
的一般性问题

您有没有办法在这个函数中使用特定的哈希算法?我想使用河豚算法

salt的长度/格式是否会影响它选择的算法

最后,blowfish算法的salt长度应该始终为22个字符,还是只是最大值

顺便说一句,如果有人想知道(如果这对回答这些问题很重要,而且不明显),我计划使用类似于存储散列密码的东西

谢谢你的关注

系统上的crypt()函数不支持“2y”算法。至少基于LinuxGlibc2.7的系统只知道DES,2a$(河豚),5$(SHA-256)和6$(SHA-512)。因此,crypt()函数假定为DES,只将前两个字符“$2”作为salt。这当然产生了相同的产出

请尝试SHA-512以获取安全密码哈希:

$salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9));
$salt = '$6$';
for($i=0; $i < 8; $i++) { $salt .= $salt_chars[array_rand($salt_chars)]; }
echo "salt=$salt\n";

$crypt = crypt('test', $salt);
echo "crypt=$crypt\n";
$salt\u chars=array\u merge(范围('A','Z')、范围('A','Z')、范围(0,9));
$salt='6$';
对于($i=0;$i<8;$i++){$salt.=$salt\u chars[array\u rand($salt\u chars)];}
echo“salt=$salt\n”;
$crypt=crypt('test',$salt);
echo“crypt=$crypt\n”;
关于你的第二个问题,你可以选择一个算法,比如用河豚的“$2a$”(而不是上面的$6$)作为开始。阅读“人2地下室”了解详细信息。对于某些算法,您还可以将更多参数(如“rounds=4000”)编码到salt中

根据crypt()手册页,salt在$id$后面最多可以包含16个字符。 较长的字符将被自动截断,并产生与前16个字符相同的输出

顺便说一句,即使在/etc/shadow中,使用SHA-512算法的密码也只使用8个字符的salt。由于salt只会使rainbow表攻击更加困难,这似乎就足够了。

系统上的crypt()函数不支持“2y”算法。至少基于LinuxGlibc2.7的系统只知道DES,2a$(河豚),5$(SHA-256)和6$(SHA-512)。因此,crypt()函数假定为DES,只将前两个字符“$2”作为salt。这当然产生了相同的产出

请尝试SHA-512以获取安全密码哈希:

$salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9));
$salt = '$6$';
for($i=0; $i < 8; $i++) { $salt .= $salt_chars[array_rand($salt_chars)]; }
echo "salt=$salt\n";

$crypt = crypt('test', $salt);
echo "crypt=$crypt\n";
$salt\u chars=array\u merge(范围('A','Z')、范围('A','Z')、范围(0,9));
$salt='6$';
对于($i=0;$i<8;$i++){$salt.=$salt\u chars[array\u rand($salt\u chars)];}
echo“salt=$salt\n”;
$crypt=crypt('test',$salt);
echo“crypt=$crypt\n”;
关于你的第二个问题,你可以选择一个算法,比如用河豚的“$2a$”(而不是上面的$6$)作为开始。阅读“人2地下室”了解详细信息。对于某些算法,您还可以将更多参数(如“rounds=4000”)编码到salt中

根据crypt()手册页,salt在$id$后面最多可以包含16个字符。 较长的字符将被自动截断,并产生与前16个字符相同的输出

顺便说一句,即使在/etc/shadow中,使用SHA-512算法的密码也只使用8个字符的salt。因为盐只会使彩虹桌的攻击更难,这似乎足够了