12.2.?口令哈希函数

12.2.1. crypt()
12.2.2. gen_salt()

函数crypt()和gen_salt()是特别设计用来做口令哈希的。crypt()完成哈希,而gen_salt()负责为前者准备算法参数。

crypt()中的算法在以下方面不同于通常的MD5或SHA1哈希算法:

  1. 它们很慢。由于数据量很小,这是增加蛮力口令破解难度的唯一方法。

  2. 它们使用一个随机值(称为salt),这样具有相同口令的用户将得到不同的密文口令。这也是针对逆转算法的一种额外保护。

  3. 它们会在结果中包括算法类型,这样用不同算法哈希的口令能共存。

  4. 有些算法是自适应的 — 这意味着当计算机变得更快时,可以调整该算法变得更慢,而不会产生与现有口令的不兼容。

表?12.1.?crypt()支持的算法

算法最大口令长度是否自适应Salt位数输出长度描述
bf72yes12860基Blowfish,变体2a。
md5无限制no4834基于MD5的加密。
xdes8yes2420扩展的DES。
des8no1213原生UNIX加密。

12.2.1.?crypt()

crypt(password text, salt text) returns text

计算password的一个crypt(3) 风格的哈希。在存储一个新口令时,需要使用gen_salt()产生一个新的salt值。要检查一个口令,把存储的哈希值作为salt,并且测试结果是否匹配存储的值。

设置一个新口令的示例:

UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));

认证的示例:

SELECT (pswhash = crypt('entered password', pswhash)) AS pswmatch FROM ... ;

如果输入的口令正确,返回true。

12.2.2.?gen_salt()

gen_salt(type text [, iter_count integer ]) returns text

产生一个在crypt()中使用的随机salt字符串。该salt字符串告诉crypt()要使用哪种算法。

type参数指定哈希算法,可接受的类型是:des、xdes、md5以及bf。

iter_count参数可以为使用迭代计数的算法指定迭代计数。计数越高,哈希口令花的时间更长因而需要更多时间攻破。不过使用太高的计数会导致计算哈希的时间高达数年 — 这是不切实际的。如果iter_count参数被忽略,将使用默认的迭代计数。允许的iter_count值与算法相关,如下表所示。

表?12.2.?crypt()的迭代计数

算法默认值最小值最大值
xdes725116777215
bf6431

对xdes算法还有额外的限制:迭代计数必须是奇数。

要选取一个合适的迭代计数,最初DES加密被设计成在当时的硬件上每秒钟完成4次哈希,低于每秒4次哈希的速度很可能会损害可用性,而超过每秒100次哈希又可能太快了。

下表给出了不同哈希算法的相对慢度的综述。该表展示了在假设口令只含有小写字母或者大小写字母及数字的情况下,在一个8字符口令中尝试所有字符组合所需要的时间。在crypt-bf项中,斜线之后的数字是gen_salt的iter_count参数。

表?12.3.?哈希算法速度

算法次哈希/秒对于[a-z]对于[A-Za-z0-9]相对于md5 hash的持续时间
crypt-bf/817924 年3927 年100k
crypt-bf/736482 年1929 年50k
crypt-bf/671681 年982 年25k
crypt-bf/513504188 天521 年12.5k
crypt-md517158415 天41 年1k
crypt-des23221568157.5 分108 天7
sha13777427290 分68 天4
md5 (hash)15008550422.5 分17 天1

注意

  • 使用的机器是一台Intel Mobile Core i3。

  • crypt-des和crypt-md5算法的数据是取自John the Ripper v1.6.38 -test。

  • md5 hash的数据来自于mdcrack 1.2。

  • sha1的数据来自于lcrack-20031130-beta。

  • crypt-bf的数据是采用在1000个8字符口令上循环的简单程序采集到的。这种方法能展示不同迭代次数的速度。

注意“尝试所有组合”并非是实际中会采用的方式。通常口令破解都是在词典的帮助下完成的,词典中会包含常用词以及它们的多种变化。因此,甚至有些像词的口令被破解的时间可能会大大小于上面建议的数字。

XML 地图 | Sitemap 地图