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

11

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

md5() 的输出长度为128位,生成一个包含32个字符的字符串,因此在数据库中将其放入 char(32) 列中,那么 crypt() 呢?

4个回答

21

注意:以那种方式提出问题是完全不受限制的,请参见http://php.net/crypt

更多细节:

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

例子:

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

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

如果你使用PHP的crypt函数,特别是MD5(最好称为md5crypt、MD5(Unix)、FreeBSD MD5、Cisco-IOS MD5;Hashcat模式500),并且使用空盐值,输出长度为:

 26 :: 3 (`$1$`) + 0 (empty salt) + 1 (`$`) + 22 (hash - 128 bits, base 64)
如果在系统上使用PHP的crypt默认为MD5并且没有指定salt,则crypt将生成salt。这个salt通常长度为8个字符。输出的长度如下:
 34 :: 3 (`$1$`) + 8 (salt) + 1 (`$`) + 22 (hash)

在这种情况下,你的数据库表列char(32)会根据你使用的数据库服务器而报告插入错误或截断。

但是MD5例子是无意义的,我选择它是因为你在问题中提到了它,但是你不应该使用MD5与crypt(请参见:Md5crypt Password scrambler is no longer considered safe by author)。

相反,让我们来看一下Blowfish哈希(CRYPT_BLOWFISH)。它具有两位数字的cost参数,并且始终具有22个盐长度(如果提供较短的盐,则用$填充):

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

对于Blowfish密码哈希算法(bcrypt,OpenBSD Blowfish; Hashcat模式3200),其长度固定为60个字符。

正如您所看到的,输出长度取决于使用的哈希算法、盐的长度甚至一些哈希特定参数,比如成本。

例如,如果您选择使用999 999 999轮和16字节长的盐进行SHA512哈希,则输出长度为:

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

这个例子可能有点极端,只是为了说明问题。


其他与 crypt 相关的问题:


@Gumbo,这个答案有什么问题吗? - Baba
1
我希望有更多的解释。例如,返回的字符串如何构建以及输入如何影响输出。 - Gumbo

0
返回哈希字符串或短于13个字符的字符串,保证在失败时与盐值不同。
crypt()将返回使用标准Unix基于DES的算法或系统上可能可用的替代算法的哈希字符串。
一些操作系统支持多种类型的哈希。实际上,有时标准的基于DES的算法被MD5-based算法所取代。哈希类型由盐值参数触发。在5.3之前,PHP会根据系统的crypt()在安装时确定可用的算法。如果没有提供盐值,PHP将自动生成一个标准的两个字符(DES)盐值或十二个字符(MD5),具体取决于MD5 crypt()的可用性。PHP设置了一个名为CRYPT_SALT_LENGTH的常量,该常量指示可用哈希允许的最长有效盐值。
阅读更多:http://php.net/crypt

0

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


0

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

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


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