MD、SHA、MAC消息摘要算法实现与应用 (2)

SHA(Secure Hash Algorithm)是由美国专门制定密码算法的标准机构——美国国家标准技术研究院(NIST)制定的,SHA系列算法的摘要长度分别为:SHA-1为20字节(160位)、SHA-224为32字节(224位)、SHA-256为32字节(256位)、SHA-384为48字节(384位)、SHA-512为64字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此也更为安全,它是未来数据摘要算法的发展方向。由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相比,也相对较慢。

目前SHA1的应用较为广泛,主要应用于CA和数字证书中,另外在目前互联网中流行的BT软件中,也是使用SHA1来进行文件校验的。

SHA算法的实现

算法 摘要长度 实现方
SHA-1   160   JDK  
SHA-224   224   Bouncy Castle  
SHA-256   256   JDK  
SHA-384   384   JDK  
SHA-512   512   JDK  

Java代码实现:

import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Security; import org.apache.commons.codec.digest.DigestUtils; import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.digests.SHA1Digest; import org.bouncycastle.crypto.digests.SHA224Digest; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class SHA { public static final String src = "sha test"; public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException { jdkSHA1(); bcSHA1(); bcSHA224(); bcSHA224b(); generateSha256(); ccSHA1(); } // 用jdk实现:SHA1 public static void jdkSHA1() throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(src.getBytes()); byte[] bytes = md.digest(); //byte[]转16进制 BigInteger bigInt = new BigInteger(1, bytes); System.out.println("jdk sha-1:" + bigInt.toString(16)); } // 用jdk实现:SHA256 public static void generateSha256() throws UnsupportedEncodingException, NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(src.getBytes("UTF-8")); // Change this to "UTF-16" if needed byte[] digest = md.digest(); BigInteger bigInt = new BigInteger(1, digest); System.out.println("Sha256 hash: " + bigInt.toString(16)); } // 用bouncy castle实现:SHA1 public static void bcSHA1() { Digest digest = new SHA1Digest(); digest.update(src.getBytes(), 0, src.getBytes().length); byte[] sha1Bytes = new byte[digest.getDigestSize()]; digest.doFinal(sha1Bytes, 0); BigInteger bigInt = new BigInteger(1, sha1Bytes); System.out.println("bc sha-1:" + bigInt.toString(16)); } // 用bouncy castle实现:SHA224 public static void bcSHA224() { Digest digest = new SHA224Digest(); digest.update(src.getBytes(), 0, src.getBytes().length); byte[] sha224Bytes = new byte[digest.getDigestSize()]; digest.doFinal(sha224Bytes, 0); BigInteger bigInt = new BigInteger(1, sha224Bytes); System.out.println("bc sha-224:" + bigInt.toString(16)); } // 用bouncy castle与jdk结合实现:SHA224 public static void bcSHA224b() throws NoSuchAlgorithmException { Security.addProvider(new BouncyCastleProvider()); MessageDigest md = MessageDigest.getInstance("SHA224"); md.update(src.getBytes()); BigInteger bigInt = new BigInteger(1, md.digest()); System.out.println("bc and JDK sha-224:" + bigInt.toString(16)); } // 用common codes实现实现:SHA1 public static void ccSHA1() { System.out.println("common codes SHA1 - 1 :" + DigestUtils.sha1Hex(src.getBytes())); System.out.println("common codes SHA1 - 2 :" + DigestUtils.sha1Hex(src)); } }

消息鉴别:

MD、SHA、MAC消息摘要算法实现与应用

4.消息摘要算法-MAC

MAC算法 (Message Authentication Codes消息认证码算法) 含有密钥的散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。消息的散列值由只有通信双方知道的密钥来控制。此时Hash值称作MAC。

经过MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同。例如 HmacSHA算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制数,换算成十六进制的编码为40位。

流程分析:

甲乙双方进行数据交换可以采取如下流程:

1.甲方向乙方公布摘要算法(就是指定要使用的摘要算法名)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppzyg.html