天天看点

Java安全——消息摘要

标签(空格分隔): java 安全

[toc]

消息摘要(message digest)又称为数字摘要(digital digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。 消息摘要采用单向hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(finger print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。 <<百度百科>>

消息摘要其实是我们日常开发中经常遇到的,比如md5算法就是一种摘要。它是java安全提供者体系中最简单的标准引擎。本文不会讨论算法本身,只关注java语言体系中的实现和使用方法。具体算法原理,后续撰文学习并补充。

消息摘要通过messagedigest类实现。消息摘要通过getinstance()方法获取算法实例。通过update()方法为消息摘要增加内容字节。根据digest()方法利用累计的内容字节计算最后的摘要。

下面的test列出了一些细节:

输出结果如下:

消息摘要实现是通过java自己sun的实现来做的。我们常见的是md5和sha算法。

考虑到消息摘要的不安全性——拿到原文并知道算法,就可以得到正确的消息摘要。人们又加入了密钥元素,得到了安全消息摘要——mac(message authentication code)。mac的特点是仅通过原文是无法计算出安全消息摘要的。还需要一个双方都知道的消息密钥。如果有人修改了消息本体,又修改了消息摘要,但是因为没有使用密钥,那么将被发现破坏了数据。计算mac的方法有很多,但是核心java api没有相关实现。java的实现主要是通过jce提供者来实现的。mac类对应消息摘要的messagedigest类。计算消息摘要时需要一个密钥。密钥的管理是另一个话题了。这里主要讲mac的算法,jce实现主要基于hmacsha1和hmacmd5。具体provider提供了哪些mac相关的算法,它们比较如何,见下面的代码:

输出如下:

这里使用的key是通过keygenerator生成的。在实际应用中,应该有一方来生成并导出到可管理的keystore,使用方载入keystore再进行摘要生成和校验。