在字符串上使用md5始终会生成字母数字加密结果,即:无符号。
然而,当我使用php crypt()函数,特别是CRYPT_MD5(并且它已启用,我已经检查过)时,它返回的假定md5哈希看起来不像md5哈希。
例如:
如果我md5字符串'password',我得到:
$pass = md5('password');
echo $pass;
//5f4dcc3b5aa765d61d8327deb882cf99
如果我使用CRYPT_MD5,它由'$ 1 $'前缀表示,'$'后缀表示盐为'salt':
$pass = crypt('password', '$1$salt$');
echo $pass;
//$1$salt$qJH7.N4xYta3aEG/dfqo/0
现在,所使用的算法和盐显示为预期,'$ 1 $'表示使用了CRYPT_MD5,并且盐在$符号之间显示为“盐”。
然而..在最后一个$符号之后的哈希密码看起来不像md5 ......它有斜线和全停止。
为什么这样哈希呢?这不是真正的md5吗?
请问您是否需要我澄清这些内容。啊。
答案 0 :(得分:10)
有关crypt算法的更多详细信息,请参阅http://www.gnu.org/software/libtool/manual/libc/crypt.html
答案 1 :(得分:1)
你是对的,5f4dcc3b5aa765d61d8327deb882cf99是字符串“password”的MD5。它没有添加盐,但你可以通过服用MD5(“密码”。“$ salt”)轻松添加一个。
但是,PHP crypt()函数可以使用各种不同的哈希值来计算哈希值。当您使用“$ 1 $”为盐添加前缀时,您将获得带有MD5的哈希值。当你用$ 2 $加前缀时,你会得到一个带有河豚的地穴,这样更安全。
“$ 1 $”以输出为前缀,以便验证散列。如果没有包含,则无法从存储的哈希中知道应该使用哪种算法!这些信息必须存储在其他地方。为了省去这个麻烦,PHP在哈希输出中包含了算法。
因此,为了验证哈希值,您将用户提供的密码作为密码,并将所有内容作为salt获取第三个元素,并且您可以看到获得的结果是否与存储的结果相匹配。
你的困惑的下一部分是MD5()函数给你一个十六进制哈希,而crypt()函数给你一个在Base64编码的哈希。那是因为Base64更有效率。
简单?
答案 2 :(得分:0)
它是一个MD5哈希,没有正确格式化为字符串。不应该给你一个问题。
答案 3 :(得分:-1)
这些是我的想法 - 不确定是否正确。 md5计算哈希值,而crypt执行加密 - 虽然使用md5风格。 散列是单向的,并为任意长度输入提供固定长度的结果。 加密是双向的,不会给出固定长度的结果。
我的猜测是md5哈希rfc可能定义了使用[a-z],[A-Z],[0-9]的结果,而加密没有这样的限制。