- 浏览: 51469 次
-
文章分类
最新评论
密码学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
Java 加密解密之消息摘要算法(MD5 SHA MAC)
消息摘要
消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。
HASH函数的抗冲突性使得如果一段明文稍有变化,哪怕只更改该段落的一个字母,通过哈希算法作用后都将产生不同的值。而HASH算法的单向性使得要找到到哈希值相同的两个不同的输入消息,在计算上是不可能的。所以数据的哈希值,即消息摘要,可以检验数据的完整性。哈希函数的这种对不同的输入能够生成不同的值的特性使得无法找到两个具有相同哈希值的输入。因此,如果两个文档经哈希转换后成为相同的值,就可以肯定它们是同一文档。所以,当希望有效地比较两个数据块时,就可以比较它们的哈希值。例如,可以通过比较邮件发送前和发送后的哈希值来验证该邮件在传递时是否修改。
消息摘要算法
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络相同上使用。由于其加密计算的工作量相当可观,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的。近年来,随着计算机相同性能的飞速改善,加密速度不再成为限制这种加密技术发展的桎梏,因而消息摘要算法应用的领域不断增加。
消息摘要算法的特点:
① 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。
② 消息摘要看起来是“随机的”。这些比特看上去是胡乱的杂凑在一起的。
③ 一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。
④ 消息摘要函数是无陷门的单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息。
⑤ 好的摘要算法,无法找到两条消息,是它们的摘要相同。
现有的消息摘要算法
消息摘要算法包含MD、SHA和MAC三大系列,常用于验证数据的完整性,是数据签名算法的核心算法。
MAC与MD和SHA不同,MAC是含有密钥的散列函数算法,我们也常把MAC称为HMAC。
JDK对消息摘要算法的支持
JDK6支持MD2/MD5/SHA/SHA256/SHA384/SHA512/HmacMD5/HmacSHA1/ HmacSHA256/HmacSHA384/HmacSHA512
使用到十六进制工具类Hex.java 见:java byte数组与十六进制字符串互转
MD和SHA系列的java实现:
DigestUtils.java
- importjava.security.MessageDigest;
- importjava.security.NoSuchAlgorithmException;
- /**
- *referenceapachecommons<a
- *href="http://commons.apache.org/codec/">http://commons.apache.org/codec/</a>
- *
- *supportMD2/MD5/SHA/SHA256/SHA384/SHA512
- *@authorAub
- *
- */
- publicclassDigestUtils{
- /**
- *根据给定摘要算法创建一个消息摘要实例
- *
- *@paramalgorithm
- *摘要算法名
- *@return消息摘要实例
- *@seeMessageDigest#getInstance(String)
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- staticMessageDigestgetDigest(Stringalgorithm){
- try{
- returnMessageDigest.getInstance(algorithm);
- }catch(NoSuchAlgorithmExceptione){
- thrownewRuntimeException(e.getMessage());
- }
- }
- /**
- *获取MD5消息摘要实例
- *
- *@returnMD5消息摘要实例
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- privatestaticMessageDigestgetMd5Digest(){
- returngetDigest("MD5");
- }
- /**
- *获取SHA-1消息摘要实例
- *
- *@returnSHA-1消息摘要实例
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- privatestaticMessageDigestgetShaDigest(){
- returngetDigest("SHA");
- }
- /**
- *获取SHA-256消息摘要实例
- *
- *@returnSHA-256消息摘要实例
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- privatestaticMessageDigestgetSha256Digest(){
- returngetDigest("SHA-256");
- }
- /**
- *获取SHA-384消息摘要实例
- *
- *@returnSHA-384消息摘要实例
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- privatestaticMessageDigestgetSha384Digest(){
- returngetDigest("SHA-384");
- }
- /**
- *获取SHA-512消息摘要实例
- *
- *@returnSHA-512消息摘要实例
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- privatestaticMessageDigestgetSha512Digest(){
- returngetDigest("SHA-512");
- }
- /**
- *使用MD5消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeMD5(byte[]data){
- returngetMd5Digest().digest(data);
- }
- /**
- *使用MD5消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@return消息摘要(长度为32的十六进制字符串)
- */
- publicstaticStringencodeMD5Hex(byte[]data){
- returnHex.encodeHexStr(encodeMD5(data));
- }
- /**
- *使用SHA-1消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@returnSHA-1消息摘要(长度为20的字节数组)
- */
- publicstaticbyte[]encodeSHA(byte[]data){
- returngetShaDigest().digest(data);
- }
- /**
- *使用SHA-1消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@returnSHA-1消息摘要(长度为40的十六进制字符串)
- */
- publicstaticStringencodeSHAHex(byte[]data){
- returnHex.encodeHexStr(getShaDigest().digest(data));
- }
- /**
- *使用SHA-256消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@returnSHA-256消息摘要(长度为32的字节数组)
- */
- publicstaticbyte[]encodeSHA256(byte[]data){
- returngetSha256Digest().digest(data);
- }
- /**
- *使用SHA-256消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@returnSHA-256消息摘要(长度为64的十六进制字符串)
- */
- publicstaticStringencodeSHA256Hex(byte[]data){
- returnHex.encodeHexStr(encodeSHA256(data));
- }
- /**
- *使用SHA-384消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@returnSHA-384消息摘要(长度为43的字节数组)
- */
- publicstaticbyte[]encodeSHA384(byte[]data){
- returngetSha384Digest().digest(data);
- }
- /**
- *使用SHA-384消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@returnSHA-384消息摘要(长度为86的十六进制字符串)
- */
- publicstaticStringencodeSHA384Hex(byte[]data){
- returnHex.encodeHexStr(encodeSHA384(data));
- }
- /**
- *使用SHA-512消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@returnSHA-512消息摘要(长度为64的字节数组)
- */
- publicstaticbyte[]encodeSHA512(byte[]data){
- returngetSha512Digest().digest(data);
- }
- /**
- *使用SHA-512消息摘要算法计算消息摘要
- *
- *@paramdata
- *做消息摘要的数据
- *@returnSHA-512消息摘要(长度为128的十六进制字符串)
- */
- publicstaticStringencodeSHA512Hex(byte[]data){
- returnHex.encodeHexStr(encodeSHA512(data));
- }
- }
参考org.apache.commons.codec.digest.DigestUtils
下载地址:http://commons.apache.org/codec/download_codec.cgi
MAC系列的java实现
Hmac.java
- importjava.security.InvalidKeyException;
- importjava.security.Key;
- importjava.security.NoSuchAlgorithmException;
- importjavax.crypto.KeyGenerator;
- importjavax.crypto.Mac;
- importjavax.crypto.SecretKey;
- importjavax.crypto.spec.SecretKeySpec;
- /**
- *Hmac<br/>
- *algorithmHmacMD5/HmacSHA/HmacSHA256/HmacSHA384/HmacSHA512
- *@authorAub
- */
- publicclassHmac{
- /**
- *根据给定密钥生成算法创建密钥
- *
- *@paramalgorithm
- *密钥算法
- *@return密钥
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- privatestaticbyte[]getHmacKey(Stringalgorithm){
- //初始化KeyGenerator
- KeyGeneratorkeyGenerator=null;
- try{
- keyGenerator=KeyGenerator.getInstance(algorithm);
- }catch(NoSuchAlgorithmExceptione){
- thrownewRuntimeException(e.getMessage());
- }
- //产生密钥
- SecretKeysecretKey=keyGenerator.generateKey();
- //获得密钥
- returnsecretKey.getEncoded();
- }
- /**
- *获取HmaMD5的密钥
- *
- *@returnHmaMD5的密钥
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- publicstaticbyte[]getHmaMD5key(){
- returngetHmacKey("HmacMD5");
- }
- /**
- *获取HmaSHA的密钥
- *
- *@returnHmaSHA的密钥
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- publicstaticbyte[]getHmaSHAkey(){
- returngetHmacKey("HmacSHA1");
- }
- /**
- *获取HmaSHA256的密钥
- *
- *@returnHmaSHA256的密钥
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- publicstaticbyte[]getHmaSHA256key(){
- returngetHmacKey("HmacSHA256");
- }
- /**
- *获取HmaSHA384的密钥
- *
- *@returnHmaSHA384的密钥
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- publicstaticbyte[]getHmaSHA384key(){
- returngetHmacKey("HmacSHA384");
- }
- /**
- *获取HmaSHA512的密钥
- *
- *@returnHmaSHA384的密钥
- *@throwsRuntimeException
- *当{@linkjava.security.NoSuchAlgorithmException}发生时
- */
- publicstaticbyte[]getHmaSHA512key(){
- returngetHmacKey("HmacSHA512");
- }
- /**
- *转换密钥
- *
- *@paramkey二进制密钥
- *@paramalgorithm密钥算法
- *@return密钥
- */
- privatestaticKeytoKey(byte[]key,Stringalgorithm){
- //生成密钥
- returnnewSecretKeySpec(key,algorithm);
- }
- /**
- *使用HmacMD5消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacMD5(byte[]data,Keykey){
- Macmac=null;
- try{
- mac=Mac.getInstance("HmacMD5");
- mac.init(key);
- }catch(NoSuchAlgorithmExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }catch(InvalidKeyExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }
- returnmac.doFinal(data);
- }
- /**
- *使用HmacMD5消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacMD5(byte[]data,byte[]key){
- Keyk=toKey(key,"HmacMD5");
- returnencodeHmacMD5(data,k);
- }
- /**
- *使用HmacSHA消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacSHA(byte[]data,Keykey){
- Macmac=null;
- try{
- mac=Mac.getInstance("HmacSHA1");
- mac.init(key);
- }catch(NoSuchAlgorithmExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }catch(InvalidKeyExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }
- returnmac.doFinal(data);
- }
- /**
- *使用HmacSHA消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacSHA(byte[]data,byte[]key){
- Keyk=toKey(key,"HmacSHA1");
- returnencodeHmacSHA(data,k);
- }
- /**
- *使用HmacSHA256消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacSHA256(byte[]data,Keykey){
- Macmac=null;
- try{
- mac=Mac.getInstance("HmacSHA256");
- mac.init(key);
- }catch(NoSuchAlgorithmExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }catch(InvalidKeyExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }
- returnmac.doFinal(data);
- }
- /**
- *使用HmacSHA256消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacSHA256(byte[]data,byte[]key){
- Keyk=toKey(key,"HmacSHA256");
- returnencodeHmacSHA256(data,k);
- }
- /**
- *使用HmacSHA384消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacSHA384(byte[]data,Keykey){
- Macmac=null;
- try{
- mac=Mac.getInstance("HmacSHA384");
- mac.init(key);
- }catch(NoSuchAlgorithmExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }catch(InvalidKeyExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }
- returnmac.doFinal(data);
- }
- /**
- *使用HmacSHA384消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacSHA384(byte[]data,byte[]key){
- Keyk=toKey(key,"HmacSHA384");
- returnencodeHmacSHA384(data,k);
- }
- /**
- *使用HmacSHA512消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacSHA512(byte[]data,Keykey){
- Macmac=null;
- try{
- mac=Mac.getInstance("HmacSHA512");
- mac.init(key);
- }catch(NoSuchAlgorithmExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }catch(InvalidKeyExceptione){
- e.printStackTrace();
- returnnewbyte[0];
- }
- returnmac.doFinal(data);
- }
- /**
- *使用HmacSHA512消息摘要算法计算消息摘要
- *
- *@paramdata做消息摘要的数据
- *@paramkey密钥
- *@return消息摘要(长度为16的字节数组)
- */
- publicstaticbyte[]encodeHmacSHA512(byte[]data,byte[]key){
- Keyk=toKey(key,"HmacSHA512");
- returnencodeHmacSHA512(data,k);
- }
- privatestaticStringshowByteArray(byte[]data){
- if(null==data){
- returnnull;
- }
- StringBuildersb=newStringBuilder("{");
- for(byteb:data){
- sb.append(b).append(",");
- }
- sb.deleteCharAt(sb.length()-1);
- sb.append("}");
- returnsb.toString();
- }
- publicstaticvoidmain(String[]args){
- //byte[]key=getHmaMD5key();
- //byte[]key=getHmaSHAkey();
- //byte[]key=getHmaSHA256key();
- //byte[]key=getHmaSHA384key();
- byte[]key=getHmaSHA512key();
- System.out.println("加密密钥:byte[]:"+showByteArray(key).length());
- Stringdata="Mac数据";
- System.out.println("加密前数据:string:"+data);
- System.out.println("加密前数据:byte[]:"+showByteArray(data.getBytes()));
- System.out.println();
- //byte[]encodeData=encodeHmacMD5(data.getBytes(),key);
- //byte[]encodeData=encodeHmacSHA(data.getBytes(),key);
- //byte[]encodeData=encodeHmacSHA256(data.getBytes(),key);
- //byte[]encodeData=encodeHmacSHA384(data.getBytes(),key);
- byte[]encodeData=encodeHmacSHA512(data.getBytes(),key);
- System.out.println("加密后数据:byte[]:"+showByteArray(encodeData).length());
- System.out.println("加密后数据:byte[]:"+encodeData.length);
- System.out.println("加密后数据:hexStr:"+Hex.encodeHexStr(encodeData));
- System.out.println();
- }
- }
相关推荐
《深入浅出密码学——常用加密技术原理与应用》是一本深入探讨密码学核心理论与实践的教材。这本书旨在帮助读者理解并掌握密码学的基本概念、算法和应用,为网络安全和信息安全领域提供坚实的理论基础。密码学是信息...
常见的 Hash 算法包括 MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1 等。 Hash 算法的应用场景包括文件或字符串一致性校验、数字签名、鉴权协议等。 五、加密算法的选择 在选择加密算法时,需要...
在给定的压缩包文件中,包含了几个常见的加密解密算法及其相关的源代码,包括SHA1、CRC32、IDEA和AES。接下来,我们将深入探讨这些算法的工作原理、应用以及它们在信息安全中的重要性。 首先,SHA1(安全哈希算法1...
在IT安全领域,LabVIEW也可以用来实现加密算法,如MD5(Message-Digest Algorithm 5)和HMAC(Hash-based Message Authentication Code)。这两个概念是数据安全中的重要组成部分,用于保护信息的完整性和验证数据...
在现代密码学中,更推荐使用像SHA-256或更安全的哈希算法,结合盐值和迭代次数以增加安全性。 在MD5Demo这个项目中,你可能会找到一个完整的示例,演示如何在C# Winform应用程序中实现MD5加密功能。这个示例可能...
常见的消息摘要算法有 SHA-1、MD5 等。 2. 签名和验证:数字签名算法包括签名和验证两个步骤。签名时使用私钥和待签名数据,验证时使用公钥、签名值和待签名数据。 五、Java 实现 Java 提供了多种加密算法和数字...
SSL/TLS协议结合了多种密码学技术,包括加密算法、消息摘要算法(哈希算法)以及数字签名等,确保了通信的安全性。 1. 加密算法: 加密算法是SSL/TLS协议的核心组成部分,分为对称加密和非对称加密两种。 - 对称...
总的来说,理解并掌握MD5、AES和SHA等加密算法,对于开发安全的微信小程序至关重要。通过学习和实践,开发者可以有效地保护用户数据,防止数据泄露,提升应用的安全性。同时,适应微信小程序的开发环境,找到合适的...
本实例将探讨一些常见的加密解密算法及其在Java中的实现。以下是一些关键知识点: 1. **对称加密算法**:这类算法使用相同的密钥进行加密和解密,如DES(Data Encryption Standard)、3DES(Triple DES)和AES...
《深入浅出密码学——常用加密技术原理与应用》是一本专为初学者和有一定基础的读者设计的密码学入门书籍。密码学是信息安全领域的核心组成部分,它涉及到数据的加密、解密、数字签名以及身份认证等多个方面。本书...
《深入浅出密码学——常用加密技术原理与应用》是一本深入探讨密码学的中文书籍,旨在帮助读者理解和掌握加密技术的基本原理及其在现实生活中的应用。密码学是信息安全领域的一个重要分支,它研究如何保障信息的安全...
Java加密解密工具包,通常用于保护敏感数据的安全,防止未经授权的访问或篡改。这个名为"JCT"的工具包提供了丰富的功能,使得开发者在Java应用中集成加密和解密操作变得更加简单。下面我们将详细探讨Java加密的相关...
在密码学领域,数据安全是至关重要的,而Java作为一种广泛使用的编程语言,提供了丰富的库来实现各种加密算法。本文将详细解析标题所提及的AES、DES、MD5、SHA1和RSA加密流程,并结合给定的Java实现进行讨论。 1. *...
在这篇文档中,我们主要介绍了三种常用加密解密算法:DES算法、RSA算法以及MD5算法,并简要分析了它们的使用规则和安全性。 首先,DES(Data Encryption Standard,数据加密标准)算法是一种经典的对称密钥加密技术...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的信息映射为固定长度的输出,通常...提供的RAR文件“MD5加密”可能包含了JavaScript和Java的MD5加密解密代码示例,供开发者学习和参考。
### JAVA_对文件进行MD5加密 在计算机科学与信息安全领域中,MD5(Message-Digest Algorithm 5)是一种广泛使用的散列函数,能够将任意长度的数据映射为一个固定长度(通常是128位)的十六进制数值。这种算法在数据...
这个算法由Ronald Rivest在1991年设计,主要用于数据完整性校验和密码学领域。 MD5算法的核心在于它的四轮循环运算,每轮包含16次基本操作,总共64步。这些操作包括了非线性函数、位操作(如与、或、非、异或)、位...
“台湾密码学教程”可能涵盖了这些基础知识,并深入讨论了密码分析、密码协议设计、密码学在互联网安全中的应用,以及最新的密码学研究成果,如量子密码学和抗量子的加密算法。学习这个教程,你将了解如何评估加密...
在标题"MD5客户端加密解密js"中,提到的是MD5算法在JavaScript环境中的应用,即在浏览器端进行数据的加密和解密。这通常是出于保护敏感信息的目的,比如在用户输入密码时进行前端加密,然后再发送到服务器,以此降低...
由于MD5的局限性,现在更推荐使用更安全的哈希算法,如SHA-256或更高级别的SHA家族成员。然而,对于理解哈希函数的基本原理和在C++中如何实现,学习MD5仍然是很有价值的。 总的来说,MD5在C++中的应用主要是通过...