11

PHP 的输出长度是crypt()多少?

md5()输出是 128 位并产生一个 32 个字符的字符串,所以在数据库中你把它放在一个char(32)列中,那crypt()呢?

4

4 回答 4

21

注意:以这种方式提问是完全有限的,请参阅http://php.net/crypt

更多细节:

  • 成功时,返回字符串的长度可以在 13 到 123 之间变化。
  • 输出长度取决于使用的哈希算法。在您的问题中仍未定义。
  • 输出长度取决于传递给函数的盐。在您的问题中仍未定义。
  • crypt总是返回散列字符串或短于 13 个字符的字符串,并保证在失败时与 salt 不同。

例子:

让我们从一个简单的crypt调用和一个有效的基于 DES 的哈希的有效的两字符盐开始:

 13 :: 2 (salt) + 11 (hash - 64 bits, base 64)

如果您使用 PHP crypt,特别是 MD5(这里更好地命名为:md5crypt、MD5(Unix)、FreeBSD MD5、Cisco-IOS MD5;Hashcat 模式 500)和一个空 salt,则输出长度为:

 26 :: 3 (`$1$`) + 0 (empty salt) + 1 (`$`) + 22 (hash - 128 bits, base 64)

如果在 PHPcrypt默认为上述 MD5 并且称为未指定盐的系统上,crypt将生成盐。这种盐的长度通常为 8 个字符。那么输出长度为:

 34 :: 3 (`$1$`) + 8 (salt) + 1 (`$`) + 22 (hash)

在这种情况下,您的数据库表列char(32)将在插入或截断时报告错误 - 取决于您使用的数据库服务器。

但是 MD5 示例没有实际意义,我之所以选择它是因为您的问题中有它,但是您不应该将 MD5 用于crypt(请参阅:Md5crypt Password scrambler is not become safe by author)。

相反,让我们看看 Blowfish 散列 ( CRYPT_BLOWFISH)。它有一个两位数的成本参数,并且盐长度始终为 22(如果给出较短的盐,则用$s 填充):

 60 :: 4 (`$2y$`) + 3 (cost `$`) + 22 (salt) + 1 (`$`) + 53 (hash)

对于 Blowfish crypt 哈希算法(bcrypt,OpenBSD Blowfish;Hashcat 模式 3200),固定长度为 60。

如您所见,输出长度取决于使用的哈希算法、盐的长度,甚至一些哈希特定的参数,如cost

例如,如果您选择具有 999 999 999 轮和 16 字节长盐的 SHA512,则输出长度为:

123 :: 3 (`$6$`) + 17 (`rounds=999999999$`) + 16 (salt) + 1 (`$`) + 86 (hash)

这个例子可能有点极端,只是为了展示图片。


其他crypt相关问题:

于 2012-11-04T21:16:06.077 回答
0

返回散列字符串或小于 13 个字符的字符串,并保证在失败时与 salt 不同。

crypt() 将使用基于标准 Unix DES 的算法或系统上可能可用的替代算法返回一个散列字符串。

一些操作系统支持不止一种类型的哈希。事实上,有时标准的基于 DES 的算法会被基于 MD5 的算法所取代。哈希类型由 salt 参数触发。在 5.3 之前,PHP 会在安装时根据系统的 crypt() 确定可用的算法。如果没有提供盐,PHP 将根据 MD5 crypt() 的可用性自动生成标准的两字符 (DES) 盐或十二字符 (MD5)。PHP 设置一个名为 CRYPT_SALT_LENGTH 的常量,它指示可用哈希允许的最长有效盐。

阅读更多: http: //php.net/crypt

于 2012-11-04T21:19:09.007 回答
0

正如您在文档中看到的,'''crypt()''' 函数与各种不同的散列算法一起使用。因此长度可以不同,并且取决于默认散列算法,该算法可以由文档中描述的常量确定。

于 2012-11-04T21:19:29.830 回答
0

crypt() 依赖于可用的加密方法。PHP 最常用的方法是 MD5,它总是返回 32 个字符。DES 和 Blowfish 等其他方法返回可变长度的字符串。

您需要知道 crypt() 函数在您的服务器中使用的方法。

于 2012-11-04T21:20:18.023 回答