【发布时间】:2014-08-12 01:50:00
【问题描述】:
我在网上找到了以下代码,想知道为什么在对 mcrypt_create_iv() 的返回值进行 base64 编码后,作者确实替换了所有 + 符号。
$salt = mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
$salt = base64_encode($salt);
$salt = str_replace('+', '.', $salt);
盐稍后被传递给 crypt() 以生成密码哈希。所以我的假设是,用. 替换所有+ 与crypt() 有关。
【问题讨论】:
-
可能是因为使用
+或<这样的字符可能会对 PHP 解析它们的方式产生不利影响;我以前见过这种情况。 -
Fred,你能详细说明一下,举个例子吗?谢谢。
-
这个
$salt=sprintf('$2y$%02d$',$cost);例如取自我的一个无效脚本,它会生成适当的盐。但是,使用$salt=sprintf('$2y$%02d$+',$cost);会生成*0;这不好。有问题的脚本是从我自己使用的这个答案stackoverflow.com/a/13153865 借来的。我确定我还有另一个脚本可以用作示例,但这会花费我更多的时间来查找/测试。 -
在示例中,盐是否作为查询字符串的一部分通过 http/s 传输? (这不应该这样做,顺便说一句,但是......)如果是这样,一些http客户端和服务器会将
+解释为空格。这是非标准行为,特别是针对 Url 的 RFC,但确实会发生(例如在 Chrome 中)。 -
作者看起来很困惑,因为他们想生成 22 个 Base64 字符,但指定的是 22 个字节而不是 16 个。
标签: php cryptography salt