理解盐函数中的字符替换

时间:2014-08-11 17:28:06

标签: php cryptography salt

我在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()有关。

2 个答案:

答案 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的成功没有任何有意义的影响。