密码散列函数一览(MDx-SHA家族)
2023-06-07 18:21:50 阿炯

密码散列函数(英语:Cryptographic hash function),又译为加密散列函数、密码散列函数、加密散列函数,是散列函数的一种。它被认为是一种单向函数,也就是说极其难以由散列函数输出的结果,回推输入的资料是什么。这样的单向函数被称为“现代密码学的驮马”。这种散列函数的输入资料,通常被称为消息(message),而它的输出结果,经常被称为消息摘要(message digest)或摘要(digest)。


在信息安全中,有许多重要的应用,都使用了密码散列函数来实现,例如数字签名,消息认证码。

工作中的密码散列函数(特定的,SHA-1)。注意,源输入再微小的变化(“over”这个词)也会使所产生的输出发生急剧变化,通过所谓的雪崩效应的原理。


特性

一个理想的密码散列函数应该有四个主要的特性:
1.对于任何一个给定的消息,它都很容易就能运算出散列数值。
2.难以由一个已知的散列数值,去推算出原始的消息。
3.在不更动散列数值的前提下,修改消息内容是不可行的。
4.对于两个不同的消息,只有极低的几率会产生相同的散列数值。


MDx家族

MD2讯息摘要算法(英语:MD2 Message-Digest Algorithm)是由Ronald Rivest在1989年设计的密码杂凑函数,该算法针对8位计算机进行了优化。128位的MD2哈希值通常表示为32位的十六进制数字。


MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行,其摘要长度为128位。这个算法影响了后来的算法如MD5、SHA家族和RIPEMD等。1991年Den Boer和Bosselaers发表了一篇文章指出MD4的短处,2004年8月王小云报告在计算MD4时可能发生杂凑冲撞。

MD4算法的变体有eD2k Hash算法,被用于eDonkey网络的eD2k链接之中,eDonkey2000、eMule等eD2k网络客户端可通过此算法识别文件。一般128位长的MD4散列被表示为32位的十六进制数字。


MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16个字符(BYTES))的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范。将数据(如一段文字)运算变为另一固定长度值,是散列算法的基础原理。

1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的资料,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞攻击,因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

1992年8月,罗纳德·李维斯特向互联网工程任务组(IETF)提交了一份重要文件,描述了这种算法的原理。由于这种算法的公开性和安全性,在90年代被广泛使用在各种程序语言中,用以确保资料传递无误等。

MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。曾被用于文件校验、SSL/TLS、IPsec、SSH,但MD5早已被发现有明显的缺陷。

MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。个MD5运算— 由类似的64次循环构成,分成4组16次。F 一个非线性函数;一个函数运算一次。Mi 表示一个 32-bits 的输入数据,Ki 表示一个 32-bits 常数,用来完成每次不同的计算。

2004年的国际密码讨论年会(CRYPTO)尾声,王小云及其研究同事展示了寻找MD5、SHA-0及其他相关散列函数的散列冲撞的新方法。所谓散列冲撞指两个完全不同的消息经散列函数计算得出完全相同的散列值。根据鸽巢原理,以有长度限制的散列函数计算没有长度限制的消息是必然会有冲撞情况出现的。在此之前,已有一些研究者在有约束条件下找到多对哈希冲撞。2009年,中国科学院的谢涛和冯登国仅用了220.96的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。2011年,RFC 6151 禁止MD5用作密钥散列消息认证码。


MD6消息摘要算法是一个密码散列函数。它使用默克尔树形式的结构,允许对很长的输入并行进行大量散列计算。作者称,在英特尔酷睿2双核CPU上,MD6-256的性能为每字节28个时钟周期,并可证明的有抗差分密码分析能力。参考实现的源代码在MIT许可证下发布。据介绍,在16核CPU架构上对长消息的处理速度可能超过1 GB/秒。

2008年12月,Fortify Software的Douglas Held在原始MD6哈希算法的参考实现中发现了缓冲区溢出问题。此错误后由罗纳德·李维斯特于2009年2月19日公布,Fortify的报告发布前已发布更正的参考实现。

MD6被提交到NIST SHA-3竞赛。但2009年7月1日,Rivest在NIST上评论说,由于速度问题,MD6尚未准备好成为SHA-3的候选者。在所提交的证明能抵抗差分攻击的MD6版本中发现了一个缺陷,且无法为速度更快的减法版本提供同样的证明。尽管Rivest在MD6网站上也表示未正式撤回,MD6没有进入SHA-3竞赛的第二轮。2011年9月,MD6网站上发布了一篇论文,提供了改进的证明,以及更快的减少回数并可抗差分攻击的版本。


SHA家族

安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的几率很高。

SHA家族的算法,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,是美国的政府标准,其分别是:

SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。

SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后继者。但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1。

SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2目前没有出现明显的弱点。虽然至今尚未出现对SHA-2有效的攻击,但它的算法跟SHA-1基本上仍然相似。

SHA-3:2015年正式发布,由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。


函数对比
下表中的中继散列值(internal state)表示对每个资料区块压缩散列过后的中继值(internal hash sum)。
SHA函数对比
算法和变体输出散列值长度
(bits)
中继散列值长度
(bits)
资料区块长度
(bits)
最大输入消息长度
(bits)
循环次数使用到的运算符碰撞攻击
(bits)
性能示例
(MiB/s)
MD5(作为参考)128128
(4 × 32)
512无限64And, Xor, Rot, Add (mod 232), Or≤18
(发现碰撞)
335
SHA-0160160
(5 × 32)
512264 − 180And, Xor, Rot, Add (mod 232), Or<34
(发现碰撞)
-
SHA-1160160
(5 × 32)
512264 − 180<63
(发现碰撞)
192
SHA-2SHA-224
SHA-256
224
256
256
(8 × 32)
512264 − 164And, Xor, Rot, Add (mod 232), Or, Shr112
128
139
SHA-384
SHA-512
SHA-512/224
SHA-512/256
384
512
224
256
512
(8 × 64)
10242128 − 180And, Xor, Rot, Add (mod 264), Or, Shr192
256
112
128
154
SHA-3SHA3-224
SHA3-256
SHA3-384
SHA3-512
224
256
384
512
1600
(5 × 5 × 64)
1152
1088
832
576
无限24And, Xor, Rot, Not112
128
192
256
-
SHAKE128
SHAKE256
d (arbitrary)
d (arbitrary)
1344
1088
min(d/2, 128)
min(d/2, 256)
-


SHAd函数是一个简单的相同SHA函数的重述:
SHAd-256(m)=SHA-256(SHA-256(m))。它会克服有关延伸长度攻击的问题。


SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦资料处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

2005年,密码分析人员发现了对SHA-1的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自2010年以来,许多组织建议用SHA-2或SHA-3来替换SHA-1。Microsoft、Google以及Mozilla都宣布,它们旗下的浏览器将在2017年停止接受使用SHA-1算法签名的SSL证书。

2017年2月23日,CWI Amsterdam与Google宣布了一个成功的SHA-1碰撞攻击,发布了两份内容不同但SHA-1散列值相同的PDF文件作为概念证明。

2020年,针对SHA-1的选择前缀冲突攻击已经实际可行。建议尽可能用SHA-2或SHA-3取代SHA-1。

SHA-1最初载明的算法于1993年发布,称做安全散列标准(Secure Hash Standard),FIPS PUB 180。这个版本现在常被称为SHA-0。它在发布之后很快就被NSA撤回,并且由1995年发布的修订版本FIPS PUB 180-1(通常称为SHA-1)取代。SHA-1和SHA-0的算法只在压缩函数的消息转换部分差了一个比特的循环位移。根据NSA的说法,它修正了一个在原始算法中会降低散列安全性的弱点。然而NSA并没有提供任何进一步的解释或证明该弱点已被修正。而后SHA-0和SHA-1的弱点相继被攻破,SHA-1似乎是显得比SHA-0有抵抗性,这多少证实了NSA当初修正算法以增进安全性的声明。

SHA-0和SHA-1可将一个最大2^64比特的消息,转换成一串160位的消息摘要;其设计原理相似于MIT教授Ronald L. Rivest所设计的密码学散列算法MD4和MD5。



SHA-1压缩算法中的一个循环。A, B, C, D和E是这个state中的32位文字;F是会变化的非线性函数;<<<n代表bit向左循环移动n个位置。n因操作而异。田代表modulo 2^32之下的加法。Kt是一个常量。Wt代表经过拓展后的原文。


SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发[3],由美国国家标准与技术研究院(NIST)在2001年发布。属于SHA算法之一,是SHA-1的后继者。其下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。

NIST发布了三个额外的SHA变体,这三个函数都将消息对应到更长的消息摘要。以它们的摘要长度(以比特计算)加在原名后面来命名:SHA-256,SHA-384和SHA-512。它们发布于2001年的FIPS PUB 180-2草稿中,随即通过审查和评论。包含SHA-1的FIPS PUB 180-2,于2002年以官方标准发布。2004年2月,发布了一次FIPS PUB 180-2的变更通知,加入了一个额外的变种SHA-224,这是为了符合双密钥3DES所需的密钥长度而定义。

SHA-256和SHA-512是很新的散列函数,前者以定义一个word为32位,后者则定义一个word为64位。它们分别使用了不同的偏移量,或用不同的常量,然而实际上二者结构是相同的,只在循环执行的次数上有所差异。SHA-224以及SHA-384则是前述二种散列函数的截短版,利用不同的初始值做计算。



SHA-2的第t个加密循环。图中的深蓝色方块是事先定义好的非线性函数。ABCDEFGH一开始分别是八个初始值,Kt是第t个密钥,Wt是本区块产生第t个word。原消息被切成固定长度的区块,对每一个区块,产生n个word(n视算法而定),透过重复运作循环n次对ABCDEFGH这八个工作区段循环加密。最后一次循环所产生的八段字符串合起来即是此区块对应到的散列字符串。若原消息包含数个区块,则最后还要将这些区块产生的散列字符串加以混合才能产生最后的散列字符串。


SHA-3(第三代安全散列算法,英语:Secure Hash Algorithm 3),之前名为Keccak(/ˈkɛtʃæk/或/kɛtʃɑːk/))算法,设计者宣称在 Intel Core 2 的CPU上面,此算法的性能是12.6时钟周期每字节(cycles per byte)。

SHA-3 在2015年8月5日由 NIST 通过 FIPS 202 正式发表。

Keccak 是一个加密散列算法,由 Guido Bertoni,Joan Daemen,Michaël Peeters,以及Gilles Van Assche在RadioGatún上设计。

2012年10月2日,Keccak 被选为NIST散列函数竞赛的胜利者。SHA-2目前没有出现明显的弱点。由于对MD5、SHA-0和SHA-1出现成功的破解,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的 SHA-3。

2014年,NIST 发布了 FIPS 202 的草案 "SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions"。

2015年8月5日,FIPS 202 最终被 NIST 批准。

本文总结自:维基百科