【问题标题】:PHP crypt() - Returned md5 hashPHP crypt() - 返回 md5 哈希
【发布时间】:2015-05-12 17:46:26
【问题描述】:

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

$1$rasmusle$rISCgZzpwk3UhDidwXvin0

我明白,“$1$”是前缀,其中包含哈希是 MD5 哈希的信息。

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

我敢肯定,这是一个愚蠢的问题,但我还是想问。

【问题讨论】:

  • 你期待的是一个十六进制编码的字符串,你得到的是一个 base64 编码的字符串。它们都代表散列函数的二进制输出。另外:$ID$SALT$HASH应该使用的是password_hash(),当然不是 MD5。
  • @Sammitch 虽然password_hash() 肯定比crypt() 好,但它在PHP 5.5 之前不可用。例如,我仍然使用 PHP 5.3 或 5.4 更新多个站点,我肯定想在那里使用password_hash()
  • @Pietu1998 - 5.3.7 以上的 PHP 版本有一个 userland implementation of password_*
  • @Pietu1998 请参阅上面的 Mark 链接。还值得注意的是,password_compat 是由编写 password_hash() 的同一个人编写的,它甚至可以从文档页面链接到。

标签: php md5 crypt


【解决方案1】:

通常它应该是一个 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”不限于十六进制表示。
猜你喜欢
  • 2020-06-01
  • 2015-11-14
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2014-05-19
  • 2019-10-10
  • 1970-01-01
相关资源
最近更新 更多