PHP crypt() - 返回的是md5哈希值。

3

crypt()函数的文档(http://php.net/manual/de/function.crypt.php)展示了MD5哈希的以下示例:

$1$rasmusle$rISCgZzpwk3UhDidwXvin0

我知道"$1$"是前缀,包含了哈希为MD5哈希的信息。

但是其余的字符串如何成为MD5哈希呢?通常应该是一个32个字符的字符串(0-9, a-f),对吧?

我知道这可能是个愚蠢的问题,但我还是想问一下。


2
你期望得到的是一个十六进制编码的字符串,但实际上你得到的是一个base64编码的字符串。它们都代表哈希函数的二进制输出。此外:$ID$SALT$HASH。你应该使用password_hash(),而不是MD5。 - Sammitch
1
@Sammitch 虽然 password_hash()crypt() 更好,但它在 PHP 5.5 之前是不可用的。例如,我仍会使用 PHP 5.3 或 5.4 更新多个网站,并且我一定想在那里使用 password_hash() - PurkkaKoodari
3
@Pietu1998 - 这里有一个适用于 PHP 5.3.7 及以上版本的用户空间密码实现 password_*。请注意,本翻译尽力保持原意,但不对准确性或语言流畅性做保证。 - Mark Baker
1
@Pietu1998 请参考上面Mark的链接。值得注意的是,password_compat也是由编写password_hash()的同一人编写的,甚至在文档页面中有链接。 - Sammitch
1个回答

3
通常情况下,MD5哈希值应该是一个32位的字符串(由0-9和a-f组成),对吧?但严格来说,这并不正确。从技术角度来看,MD5哈希值是一个128位的数字值。你熟悉的形式只是该数字的十六进制表示法。通常选择这种表示法是因为它们易于作为字符串进行交换(而128位整数难以处理,毕竟,一个典型的整数变量通常只能容纳64位)。请参考以下示例:
  1. md5("test") 的十六进制表示法(基数为16):098f6bcd4621d373cade4e832627b4f6
  2. md5("test") 的base 64表示法:CY9rzUYh03PK3k6DJie09g==
  3. md5("test") 的十进制表示法(基数为10):12707736894140473154801792860916528374
  4. md5("test") 的base 27表示法(很少使用,只是为了证明我的观点):ko21h9o9h8bc1hgmao4e69bn6f
这些字符串表示同一个数字值,只是用不同的进制。

强调“md5”不仅限于十六进制表示,可以使用任何字母或数字进行表示。 - dognose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接