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验证数据完整性
相当于数字指纹
阅读全文
0 0
- Java安全之消息摘要算法
- Java安全之消息摘要
- Java安全之消息摘要
- java 加密之消息摘要算法
- Java消息摘要算法
- java消息摘要算法加密
- Java MD5消息摘要算法
- java消息摘要算法加密
- java消息摘要算法加密
- Java消息摘要算法加密
- Java加密系列之(三)消息摘要算法加密
- JAVA加密解密之消息摘要算法(MessageDigest)
- [Java 安全]消息摘要与数字签名
- [Java 安全]消息摘要与数字签名
- [Java 安全]消息摘要与数字签名
- java安全(五)带秘钥的消息摘要算法——数字签名
- java安全(三)摘要算法MD5
- Javacard技术总结之--- 消息摘要算法
- (转载、备份)net-snmp配置文件详解
- C++ list类存储结构体
- 标点符号
- STM32 CDC HOST初步调试
- 超详细适合新手的CentOS操作实战
- Java安全之消息摘要算法
- APUE(习题3.2)实现与dup2功能相同的函数
- 在ubuntu12.04中安装wine和source insight
- glyphicons-halflings-regular.woff2 net::ERR_ABORTED
- mybatis 存储过程使用
- Maven学习之路二(Maven下载安装)
- 笔记四:linux下IO口模拟实现I2C协议
- Spring Boot与Docker部署
- 安防摄像机手机直播方案介绍