Java了解消息摘要算法
- 什么是消息摘要算法
- 现行的消息摘要算法
- MD系列
- 发展历史
- MD2算法
- MD4算法
- MD5算法
- 后续
- SHA系列
- 发展历史
- SHA-0 与 SHA-1
- SHA-2
- 后续
- 国密算法SM3
- 发布
- 后续
- HMAC系列
- 发展历史
- 背景
- 发展
- 后续
- 本文小结
- 疑问
- 后续
什么是消息摘要算法
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,可以被解密逆向的只有CRC32算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
简单点来说就是:通过明文获取对应的密文。并且除去少数的消息摘要算法,其他的基本是不可逆的,也就是密文无法解密得到明文。而且一般来说密文比明文小的多。
现行的消息摘要算法
现行的用得比较多的,应该是MD系列、SHA系列、国密SM3、HMAC系列消息摘要算法比较多。为什么是系列?请听我慢慢道来。
MD系列
MD(Message Digest 消息摘要)应该是最早被广泛使用的消息摘要算法了。现在我们最熟悉的应该就是MD5算法了,比如存储密码或者一般的敏感数据时,基本都使用MD5算法。但这个系列之前还有几个版本:MD2、MD4
发展历史
该系列算法(主要是MD5)目前被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等方面。
MD2算法
Rivest在1989年开发出MD2算法 。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。
然后,以一个16位的校验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。
后来,Rogier和Chauvaud发现如果忽略了校验和MD2将产生冲突。MD2算法加密后结果是唯一的(即不同信息加密后的结果不同) 。
MD4算法
为了加强算法的安全性,Rivest在1990年又开发出MD4算法 。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)。
然后,一个以64位二进制表示的信息的最初长度被添加进来。
信息被处理成512位damgard/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。
Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。
Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果) 。
MD5算法
1991年,Rivest开发出技术上更为趋近成熟的MD5算法。1992宣布替代之前的MD4算法,它在MD4的基础上增加了"安全带"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。
在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。
后续
不过比较可惜的是,1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
SHA系列
SHA(Secure Hash Algorithm - 安全散列算法),是由美国国家安全局(NSA)设计发布的摘要算法。
最初载明的算法于1993年发布,称做安全杂凑标准(Secure Hash Standard),FIPS PUB 180,故而这个版本常被称为SHA-0。
发展历史
SHA-0 与 SHA-1
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-2
NIST(National Institute of Standards and Technology - 美国国家标准与技术研究院)发布了三个额外的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-1一样的公众密码社群做详细的检验,也就是说,该算法内部的逻辑并未公布,所以它们的密码安全性还不被大家广泛的信任。
Gilbert和Handschuh在2003年曾对这些新变种作过一些研究,声称他们没有找到弱点。
国密算法SM3
是的,我们国家也有对应的摘要算法,我们称之为SM3。其实不能说系列,因为只有一个摘要算法,也就是上面说的SM3。
国密算法是国家密码局制定标准的一系列算法。其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法等等。到目前为止已经有:SM1(对标AES)、SM2(对标RSA)、SM3(对标SHA-256)、SM4(自研"DES/AES"算法)、SM7(分组加密)、SM9(基于标识的非对称算法)等算法了。
上述的六种算法,除了SM1和SM7未公开以外,其他的实现方式及步骤都可以在国家密码管理局的文档中找到。
发布
现在我们说回到SM3,在国家密码局的2010年12月17日的国家密码管理局关于发布《SM3密码杂凑算法》公告中,发布了SM3算法,其实现算法内部逻辑在网站的公告中有给出。
在SM3的说明文档中是这么描述的:
本文本规定了SM3密码杂凑算法的计算方法和计算步骤,并给出了运算示例。
本文本适用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。
同时,本文本还可为安全产品生产商提供产品和技术的标准定位以及标准化的参考,提高安全产品的可信性与互操作性。
后续
后续自然是跟SHA-2一样,还没有人宣布破解。
HMAC系列
该系列原简称为MAC(Message Authentication Code - 消息认证码),不过由于其基于Hash运算的算法,所以也叫HMAC(Hash-based Message Authentication Code - 基于哈希运算消息认证码)。
发展历史
背景
由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥(注意这里的基于,表明HMAC算法是基于现行的Hash函数的,也就是上面提到的两个系列)进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。
随着Internet的不断发展,网络安全问题日益突出。为了确保接收方所接收到的报文数据的完整性,人们采用消息认证来验证上述性质。用来对消息进行认证的主要方式有以下3种:
消息认证码(带密钥的HAMC,以密钥和数据生成摘要)
散列函数(上述的无密钥单向摘要算法,以数据生成摘要)
消息加密(将整个消息加密,生成的密文作为摘要)。
消息认证码:它是一个需要密钥的算法,可以对可变长度的消息进行认证,把输出的结果作为认证符,用来验证消息是否完整或者已被篡改(简单来说有点像加盐,把密钥也放到散列函数里)
散列函数:它是将任意长度的消息映射成为定长的散列值的函数,以该散列值消息摘要)作为认证符。(上述提到的都已被宣布破解,SHA-2系列除外,因为其没有公开算法细节)
消息加密:它将整个消息的密文作为认证符。(肉眼可见代价很大)
发展
近年来,人们越来越感兴趣于利用散列函数来设计MAC,原因有二:
1、一般的散列函数的软件执行速度比分组密码的要快。
2、密码散列函数的库代码来源广泛。这个广泛指的是,MAC算法可以跟任意的散列函数结合。
根据上述的散列函数就可以知道,可以根据上述的系列的单个算法,获得一个HMAC的算法。
比如MAC算法跟MD系列组合,可以得到HmacMD2、HmacMD4、HmacMD5三种算法
跟SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512等五种。
自然也可以跟SM3算法结合。
HMAC是一种利用密码学中的散列函数来进行消息认证的一种机制,所能提供的消息认证包括两方面内容:
①消息完整性认证:能够证明消息内容在传送过程没有被修改。
②信源身份认证:因为通信双方共享了认证的密钥,接收方能够认证发送该数据的信源与所宣称的一致,即能够可靠地确认接收的消息与发送的一致。(有点类似于RSA非对称加密算法,可以根据数据内的信息,以确定信息是谁发过来的)
后续
HMAC是当前许多安全协议所选用的提供认证服务的方式,应用十分广泛,并且经受住了多种形式攻击的考验。并且就算上述的所有算法都被破解,只要有新的散列函数出现,我们就可以与之结合,产生新的HMAC算法。
本文小结
消息摘要算法有众多的系列:MD系列,SHA系列、HMAC系列、以及独苗国密SM3。消息摘要算法从第一个MD2算法发布以来,不足四十年,公布内部逻辑的算法大都都被证实并不太安全。
疑问
但是为什么现在还是有人用那些不安全的算法?
为什么没有人用破解工具,输入摘要自动破解出对应的信息呢?反而到现在大部分的破解都是通过彩虹表来获得呢?
我唯一能想到的答案是:破解的代价与回报。
这个很好理解,如果破解一个摘要数据的代价大到无法承受,那么我为什么不用彩虹表蒙一下呢。
比如破解一个摘要的时间需要十几台电脑,没日没夜一年半载才能破解出来,那对于成千上万的数据,破解完要多久。况且我们没法保证对方生成的摘要没有自定义更改过。比如我生成的摘要,我自己再对这个摘要做了一些处理,比如换位、替换等等,那么破解这种数据得到的明文,自然毫无用处的。
后续
Java各种摘要算法的工具类:在Java环境下
各种常见摘要算法的工具类
Java自定义变换产生摘要数据:摘要的变换
以及彩虹表攻击
的防范