我在Web上找到了以下代码,并且想知道为什么autor在base64编码mcrypt_create_iv()的返回值之后会替换所有+
个符号。
$salt = mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
$salt = base64_encode($salt);
$salt = str_replace('+', '.', $salt);
稍后将salt传递给crypt()以生成密码哈希。所以我的假设是,用+
替换所有.
与crypt()有关。
答案 0 :(得分:2)
So my assumption is, the replacement of all + with . has to do with crypt().
是的,确实如此。
来自crypt
文档:
CRYPT_STD_DES - 标准的基于DES的哈希,字母“./ 0-9A-Za-z”中包含两个字符的盐。在salt中使用无效字符将导致crypt()失败。
CRYPT_EXT_DES - 基于DES的扩展哈希。 “salt”是一个9个字符的字符串,由下划线后跟4个字节的迭代计数和4个字节的盐组成。它们被编码为可打印字符,每个字符6位,最不重要字符。值0到63被编码为“./ 0-9A-Za-z”。在salt中使用无效字符将导致crypt()失败。
所以盐必须在字母./0-9A-Za-z
答案 1 :(得分:1)
没有更多的背景,我只能猜测,但我可以给你一个非常可能的理由:
在许多设置中,密码哈希以method+iterations+salt+hash
之类的格式存储。
如果以这种方式存储,而不是将salt放在数据库中的单独列中,则需要一种方法将salt(和其他详细信息)从哈希中分离出来。如果它在+
上分裂,那么盐中的额外加载会破坏该方法。
可以通过将哈希,salt和方法存储在自己的列中,或者通过基于位置而不是特定字符进行拆分来避免这种情况。但是,无论如何,您似乎使用的方法都很好。替换一个特定字符对良好的salt / hash的成功没有任何有意义的影响。