Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP密码和盐-请进一步澄清_Php_Encryption_Salt_Mcrypt - Fatal编程技术网

PHP密码和盐-请进一步澄清

PHP密码和盐-请进一步澄清,php,encryption,salt,mcrypt,Php,Encryption,Salt,Mcrypt,我昨天在这里得到了一些非常好的答案。我把我得到的东西放在一起,我认为这将是一个相当安全的算法。我在使用河豚时遇到了一个问题,因为它的for循环会产生盐 我使用base64字符和for循环来获得一个随机字符串。我想将生成的字符串作为salt插入crypt函数 因为关于河豚的文档非常稀少,PHP文档甚至都没有提到它,所以我在这里有点像是在暗中刺伤 真正奇怪的是,如果按现在的方式运行此代码,它将不会失败。从for循环上方移除“$2a$07$”或从crypt函数中移除“$2a$07$”,它将间歇地返回一

我昨天在这里得到了一些非常好的答案。我把我得到的东西放在一起,我认为这将是一个相当安全的算法。我在使用河豚时遇到了一个问题,因为它的for循环会产生盐

我使用base64字符和for循环来获得一个随机字符串。我想将生成的字符串作为salt插入crypt函数

因为关于河豚的文档非常稀少,PHP文档甚至都没有提到它,所以我在这里有点像是在暗中刺伤

真正奇怪的是,如果按现在的方式运行此代码,它将不会失败。从for循环上方移除“$2a$07$”或从crypt函数中移除“$2a$07$”,它将间歇地返回一个加密字符串。我对blowfish的理解是,加密字符串必须以“$2a$07$”开头,以“$”结尾,因此在crypt函数中需要连接。我真的不需要for循环上方的开始字符串,只想去掉它

我还想澄清在数据库中存储随机盐的最佳实践,或者通过在数据库中存储crypt函数的输出来存储随机盐的最佳实践

昨天,没有真正的代码被抛出,只是讨论。今天我想把一些代码放在一起,并有一些相当安全的地方。如果有人能想出一个更好的算法,我总是开放的

$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$salt = '$2a$07$';

for($i=0; $i<60; $i++)
{
    $salt .= $base64[rand(0,63)];
}

return crypt('password', '$2a$07$'.$salt.'$');
$base64='abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzo123456789+/';
$salt='2a$07$';

对于($i=0;$i来说,
crypt()
似乎不喜欢salt中的
+
字符,以及许多其他特殊字符(
*
%
等)。如果你过滤掉它们,它应该在每次尝试中都会起作用(无需重复salt id字符串).

我知道这个问题现在已经是一个古老的历史了,但是为了让通过搜索谷歌找到它的人受益,在这个问题的答案中有一个关于bcrypt/EksBlowfish盐如何工作的非常详细的描述:


简而言之,正如caf所说,它使用由
[a-zA-Z0-9./]
组成的base64字母表,其中
$
为空(不是0)终止/填充字符。如果您使用超出该范围的任何字符,或过早使用
$
,它将出错或无法解释整个salt。

您是在将
$2a$07$
预加两次salt值,这是故意的吗?是的。这就是我发布的原因。如果删除其中任何一个字符串,则会导致错误pt函数将随机返回一个加密字符串。我想从for循环上方删除该字符串,并将该字符串保留在crypt函数中。当我删除它时,crypt函数失败。如果按原样运行此代码,它不会失败。删除这两个$2a$07$字符串中的任何一个,它都会失败。对文档的快速检查表明blowfish的salt必须是16个字符长;您是否尝试过缩短salt的长度?我也从PHP站点上的一位贡献用户那里找到了这个问题。“blowfish不使用16个字符的salt,它使用16个字节的salt。“我不知道如果你两次附加salt id为什么会起作用,但第二个id中的$可能会使它在附加salt id或类似id之后停止解析salt。\u哇,kb,你是对的。它没有失败过一次。我只是删除了base64字符串中的最后两个字符。salt的有效字符是
[a-zA-Z0-9./]
-实际上,这应该在PHP文档中说明。