Java安全之消息摘要算法

来源:互联网 发布:adobe是什么软件 编辑:程序博客网 时间:2024/05/22 20:45

大家应该都有使用过equals方法比较对象的经历,但有些可能不知道,实际上equals方法比较的是两个对象的散列值,

即比较两个对象的hashCode方法的值是否相同,这也说明hashcode可以作为辨别对象的唯一标识。

消息摘要也是经过散列函数处理,有异曲同工之妙。


消息摘要算法主要分为三大类:

MD Message Digest 消息摘要算法

SHA-1 Secure Hash Algorithm 安全散列算法

HmacMD5 Message Authentication Code 消息认证码算法


以下为MD家族使用方法

public class MGMD {public static String word="kevin2020";public static void main(String[] args) throws Exception {jdkMd5();jdkMd2();bcMd5();bcMd4();jdkbcMd4();ccMd2();ccMd5();}public static void jdkMd5() throws NoSuchAlgorithmException{MessageDigest md=MessageDigest.getInstance("MD5");byte[] result=md.digest(word.getBytes());System.out.println("md5: "+Hex.encodeHexString(result));}public static void jdkMd2() throws NoSuchAlgorithmException{MessageDigest md=MessageDigest.getInstance("MD2");byte[] result=md.digest(word.getBytes());System.out.println("md2: "+Hex.encodeHexString(result));}public static void bcMd5() {MD5Digest md=new MD5Digest();md.update(word.getBytes(), 0, word.getBytes().length);byte[] result=new byte[md.getDigestSize()];md.doFinal(result,0);System.out.println("bcMd5: "+org.bouncycastle.util.encoders.Hex.toHexString(result));}public static void bcMd4() {MD4Digest md=new MD4Digest();md.update(word.getBytes(), 0, word.getBytes().length);byte[] result=new byte[md.getDigestSize()];md.doFinal(result, 0);System.out.println("bcMd4 "+org.bouncycastle.util.encoders.Hex.toHexString(result));}public static void jdkbcMd4() throws NoSuchAlgorithmException{Security.addProvider(new BouncyCastleProvider());MessageDigest md=MessageDigest.getInstance("MD4");byte[] result=md.digest(word.getBytes());System.out.println("jdkbcMd4: "+Hex.encodeHexString(result));}public static void ccMd5(){System.out.println("ccMd5: "+DigestUtils.md5Hex(word.getBytes()));}public static void ccMd2(){System.out.println("ccMd2: "+DigestUtils.md2Hex(word.getBytes()));}}


SHA算法基于MD4实现

消息摘要长度与安全长度成正比,从这一点上来说,SHA系列算法比MD系列算法更具优势

MD系列算法仅有128位 而SHA算法则可以从160位扩充到512位,更具安全性

public class MGSHA {    public static String word="kevin2020";    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        jdkSha1();        bcSha1();        bcSha224();        bcjdkSha224();        cc();    }        public static void jdkSha1() throws NoSuchAlgorithmException{        MessageDigest md=MessageDigest.getInstance("SHA");        //1        md.update(word.getBytes());        System.out.println("jdksha1: "+Hex.encodeHexString(md.digest()));        //2//        System.out.println("jdksha1: "+Hex.encodeHexString(md.digest(word.getBytes())));    }        public static void bcSha1(){        Digest digest=new SHA1Digest();        digest.update(word.getBytes(), 0, word.getBytes().length);        byte[] result=new byte[digest.getDigestSize()];        digest.doFinal(result, 0);        System.out.println("bcSha1: "+Hex.encodeHexString(result));        System.out.println("test: "+new String(result));    //果然是堆乱码    }        public static void bcSha224(){        Digest digest=new SHA224Digest();        digest.update(word.getBytes(), 0, word.getBytes().length);        byte[] result=new byte[digest.getDigestSize()];        digest.doFinal(result, 0);        System.out.println("bcSha224: "+Hex.encodeHexString(result));    }        public static void bcjdkSha224() throws NoSuchAlgorithmException{        Security.addProvider(new BouncyCastleProvider());        MessageDigest md=MessageDigest.getInstance("SHA224");        System.out.println("bcjdkSha224: "+org.bouncycastle.util.encoders.Hex.toHexString(md.digest(word.getBytes())));    }        public static void cc(){        System.out.println("cc sha1 "+DigestUtils.sha1Hex(word.getBytes()));        System.out.println("cc sha1 "+DigestUtils.sha1Hex(word));    }}

MAC加入了密钥的支持
public class MGHMAC {public static String word="douniub";public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, DecoderException, UnsupportedEncodingException {jdkHmac();bcHmac();}public static void jdkHmac() throws NoSuchAlgorithmException, InvalidKeyException, DecoderException, UnsupportedEncodingException{KeyGenerator keygenarator=KeyGenerator.getInstance("HmacMD5");SecretKey skey=keygenarator.generateKey();byte[] bkey=skey.getEncoded();Key key=new SecretKeySpec(bkey, "HmacMD5");Mac mac=Mac.getInstance(key.getAlgorithm());mac.init(key);byte[] result=mac.doFinal(word.getBytes());System.out.println("jdkhmac "+Hex.encodeHexString(result));}public static void bcHmac(){HMac hmac=new HMac(new MD5Digest());hmac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode("123456"))); //Hex.decode 把接受的字符串当成十六进制编码hmac.update(word.getBytes(), 0, word.getBytes().length);byte[] result=new byte[hmac.getMacSize()];hmac.doFinal(result, 0);System.out.println("bchmac "+org.bouncycastle.util.encoders.Hex.toHexString(result));}}

此外,还有一些其他算法如 RipeMD系列

Java7中并未提供实现,bc提供了相应实现


主要应用于用户/登陆注册模块

提供的软件下载页面使用MD5验证数据完整性

相当于数字指纹


原创粉丝点击