java基础---->摘要算法的介绍
本文内容纲要:
-SHA算法
-MD算法
-MAC算法
-友情链接
数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。今天,我们就开始java中摘要算法的学习。
项目结构如下:
SHA算法
安全哈希算法(SecureHashAlgorithm)主要适用于数字签名标准(DigitalSignatureStandardDSS)里面定义的数字签名算法(DigitalSignatureAlgorithmDSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
一、HuhxSHA.java
packagecom.huhx.md;
importjava.security.MessageDigest;
importorg.apache.commons.codec.binary.Hex;
importorg.apache.commons.codec.digest.DigestUtils;
importorg.bouncycastle.crypto.Digest;
importorg.bouncycastle.crypto.digests.SHA1Digest;
importorg.junit.Test;
/**
*wirter:huhx
*/
publicclassHuhxSHA{
privatestaticStringsrc="http://www.cnblogs.com/huhx";
//jdk版本的sha算法
@Test
publicvoidjdkSHA1(){
try{
MessageDigestmessageDigest=MessageDigest.getInstance("SHA");
messageDigest.update(src.getBytes());
byte[]shaBytes=messageDigest.digest();
System.out.println("jdkSHA1:"+Hex.encodeHexString(shaBytes));
}catch(Exceptione){
e.printStackTrace();
}
}
//commons-codec的sha算法
@Test
publicvoidbcSHA1(){
Digestdigest=newSHA1Digest();
digest.update(src.getBytes(),0,src.length());
byte[]shaBytes=newbyte[digest.getDigestSize()];
digest.doFinal(shaBytes,0);
System.out.println("bcSHA1:"+org.bouncycastle.util.encoders.Hex.toHexString(shaBytes));
}
//bcprov的sha算法
@Test
publicvoidccSHA1(){
System.out.println("ccSHA1:"+DigestUtils.sha1Hex(src.getBytes()));
}
}
二、运行结果如下:
jdkSHA1:14ed5f04b940042df8dfcd5e60dc331dfddac16f
bcSHA1:14ed5f04b940042df8dfcd5e60dc331dfddac16f
ccSHA1:14ed5f04b940042df8dfcd5e60dc331dfddac16f
MD算法
MD2
Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验将和MD2产生冲突。MD2算法加密后结果是唯一的(即不同信息加密后的结果不同)。
MD4
为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod512=448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Denboer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。
MD5
1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Denboer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。
一、HuhxMD.java
packagecom.huhx.md;
importjava.security.MessageDigest;
importjava.security.Security;
importorg.apache.commons.codec.digest.DigestUtils;
importorg.bouncycastle.crypto.Digest;
importorg.bouncycastle.crypto.digests.MD5Digest;
importorg.bouncycastle.jce.provider.BouncyCastleProvider;
importorg.bouncycastle.util.encoders.Hex;
importorg.junit.Test;
publicclassHuhxMD{
privatestaticStringsrc="http://www.cnblogs.com/huhx";
@Test
publicvoidjdkMD5(){
try{
MessageDigestmessageDigest=MessageDigest.getInstance("MD5");
byte[]mdBytes=messageDigest.digest(src.getBytes());
System.out.println("md5decode:"+Hex.toHexString(mdBytes));
}catch(Exceptione){
e.printStackTrace();
}
}
@Test
publicvoidjdkMD2(){
try{
MessageDigestmessageDigest=MessageDigest.getInstance("MD2");
byte[]mdBytes=messageDigest.digest(src.getBytes());
System.out.println("md2decode:"+Hex.toHexString(mdBytes));
}catch(Exceptione){
e.printStackTrace();
}
}
@Test
publicvoidbcmMD4(){
//Digestdigest=newMD4Digest();
//digest.update(src.getBytes(),0,src.length());
//byte[]mdBytes=newbyte[digest.getDigestSize()];
//digest.doFinal(mdBytes,0);
//System.out.println("md4decode:"+Hex.toHexString(mdBytes));
Security.addProvider(newBouncyCastleProvider());
try{
MessageDigestmessageDigest=MessageDigest.getInstance("MD4");
byte[]mdBytes=messageDigest.digest(src.getBytes());
System.out.println("md4decode:"+Hex.toHexString(mdBytes));
}catch(Exceptione){
e.printStackTrace();
}
}
//
@Test
publicvoidbcmMD5(){
Digestdigest=newMD5Digest();
digest.update(src.getBytes(),0,src.length());
byte[]mdBytes=newbyte[digest.getDigestSize()];
digest.doFinal(mdBytes,0);
System.out.println("md5decode:"+Hex.toHexString(mdBytes));
}
//
@Test
publicvoidccMD5(){
Stringmd5String=DigestUtils.md5Hex(src.getBytes());
System.out.println("commonmd5:"+md5String);
}
}
二、运行结果如下:
md4decode:b402321e9a067da3df0c36c8315f8e38
md5decode:f121bf5f7491466ae75e056f686c4462
md2decode:42b6b066b1273470f9aad644cede7644
md5decode:f121bf5f7491466ae75e056f686c4462
commonmd5:f121bf5f7491466ae75e056f686c4462
由于md5的算法被发现了某些微妙的规律性。所以建议最好使用ShA1的算法。
MAC算法
MAC算法(MessageAuthenticationCodes)带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制。此时Hash值称作MAC。
MAC算法原理(以直联银联pos和POS中心通讯为例)。
- 将欲发送给POS中心的消息中,从消息类型(MTI)到63域之间的部分构成MACELEMEMENTBLOCK(MAB)。
- 对MAB,按每8个字节做异或(不管信息中的字符格式),如果最后不满8个字节,则添加“0X00”。
一、HuhxMAC.java
packagecom.huhx.md;
importjavax.crypto.KeyGenerator;
importjavax.crypto.Mac;
importjavax.crypto.SecretKey;
importjavax.crypto.spec.SecretKeySpec;
importorg.bouncycastle.crypto.digests.MD5Digest;
importorg.bouncycastle.crypto.macs.HMac;
importorg.bouncycastle.crypto.params.KeyParameter;
importorg.bouncycastle.util.encoders.Hex;
importorg.junit.Test;
publicclassHuhxMAC{
privatestaticStringsrc="http://www.cnblogs.com/huhx";
privatestaticStringdecodeKey="bbbbbbbbbb";
@Test
publicvoidjdkHmacMD5(){
try{
//初始化KeyGenerator
KeyGeneratorkeyGenerator=KeyGenerator.getInstance("HmacMD5");
//产生密钥
SecretKeysecretKey=keyGenerator.generateKey();
//获得密钥
//byte[]keyBytes=secretKey.getEncoded();
byte[]keyBytes=org.apache.commons.codec.binary.Hex.decodeHex(decodeKey.toCharArray());
//还原密钥
SecretKeySpecsecretKeySpec=newSecretKeySpec(keyBytes,"HmacMD5");
//实例化MAC
Macmac=Mac.getInstance(secretKeySpec.getAlgorithm());
//初始化Mac
mac.init(secretKeySpec);
//执行摘要
byte[]result=mac.doFinal(src.getBytes());
System.out.println("jdkmac:"+Hex.toHexString(result));
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
@Test
publicvoidbcHmacMD5(){
HMachMac=newHMac(newMD5Digest());
hMac.init(newKeyParameter(Hex.decode(decodeKey)));
hMac.update(src.getBytes(),0,src.length());
byte[]hMacBytes=newbyte[hMac.getMacSize()];
hMac.doFinal(hMacBytes,0);
System.out.println("bcmac:"+Hex.toHexString(hMacBytes));
}
}
二、运行结果如下:
bcmac:3bf59d550b1e0d6cee15e015870029f9
jdkmac:3bf59d550b1e0d6cee15e015870029f9
友情链接
本文内容总结:SHA算法,MD算法,MAC算法,友情链接,
原文链接:https://www.cnblogs.com/huhx/p/messageDigest.html