Php 理解salt函数中的字符替换

Php 理解salt函数中的字符替换,php,cryptography,salt,Php,Cryptography,Salt,我在网上找到了下面的代码,想知道为什么在base64编码mcrypt_create_iv()的返回值后,autor会替换所有的+符号 salt随后被传递到crypt()以生成密码散列。所以我的假设是,用替换所有+与crypt()有关 没有更多的上下文,我只能猜测,但我可以给你一个很可能的理由: 在许多设置中,密码散列以类似method+iterations+salt+hash的格式存储。 如果以这种方式存储,而不是将盐放在数据库中的单独列中,则需要一种将盐(和其他细节)从散列中分离出来的方法。如

我在网上找到了下面的代码,想知道为什么在base64编码mcrypt_create_iv()的返回值后,autor会替换所有的
+
符号


salt随后被传递到crypt()以生成密码散列。所以我的假设是,用
替换所有
+
与crypt()有关

没有更多的上下文,我只能猜测,但我可以给你一个很可能的理由:

在许多设置中,密码散列以类似
method+iterations+salt+hash
的格式存储。 如果以这种方式存储,而不是将盐放在数据库中的单独列中,则需要一种将盐(和其他细节)从散列中分离出来的方法。如果它在
+
上分裂,那么盐中的额外加号将破坏该方法


通过将hash、salt和方法存储在各自的列中,或者根据位置而不是特定字符进行拆分,可以避免这种情况。然而,您似乎使用的方法无论如何都很好。替换一个特定字符不会对一个好的salt/hash的成功产生任何有意义的影响。

因此我的假设是,将all+替换为。与crypt()有关。

是的

从文档中:

CRYPT_STD_DES-基于DES的标准哈希,包含字母表“/0-9A-Za-z”中的两个字符salt。在salt中使用无效字符将导致crypt()失败

CRYPT_EXT_DES-扩展的基于DES的哈希。“salt”是一个9个字符的字符串,由下划线、4个字节的迭代计数和4个字节的salt组成。这些字符编码为可打印字符,每个字符6位,最低有效字符优先。值0到63编码为“/0-9A-Za-z”。在salt中使用无效字符将导致crypt()失败


所以salt必须在字母表
/0-9A-Za-z

中,可能是因为使用了
+
Fred这样的字符,你能详细说明一下吗,举个例子?谢谢。这个
$salt=sprintf('2y$%02d$,$cost')取自我的一个脚本,该脚本无效,将生成一个适当的salt。但是,正在使用
$salt=sprintf(“$2y$%02d$+”,$cost)将生成
*0
;那不好。这个剧本是从我自己的回答中借用来的。我确信我还有另一个脚本可以用作示例,但这将花费我更多的时间来查找/测试。在这个示例中,salt是作为查询字符串的一部分通过http/s传输的吗?(顺便说一句,这永远不应该这样做,但是…)如果是这样,一些http客户端和服务器会将
+
解释为一个空格。这是非标准行为,特别是针对Url的RFC,但确实发生了(例如在Chrome中)。作者看起来很困惑,因为他们希望生成22个Base64字符,但指定22个字节而不是16个。谢谢。那么,由于盐生成函数不能替换=符号,因此盐生成函数必须是不足的。
    $salt = mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
    $salt = base64_encode($salt);
    $salt = str_replace('+', '.', $salt);