crypt()
的输出长度是多少?
md5()
的输出长度为128位,生成一个包含32个字符的字符串,因此在数据库中将其放入 char(32)
列中,那么 crypt()
呢?
注意:以那种方式提出问题是完全不受限制的,请参见http://php.net/crypt
更多细节:
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
相关的问题:
crypt() 函数依赖于可用的加密方法。PHP 最常用的方法是 MD5,它总是返回 32 个字符。其他方法如 DES 和 Blowfish 返回长度可变的字符串。
您需要知道在您的服务器上 crypt() 函数使用的是哪种方法。