Java实现哈希算法

本文介绍了哈希算法的基本概念及其不可逆特性,详细讲解了MD5、SHA-1、HmacMD5和RipeMD160四种常见哈希算法的使用方法和加密过程。通过实例展示了如何在Java中实现这些算法,并探讨了它们在防止数据篡改和增强安全性方面的作用。
摘要由CSDN通过智能技术生成


一、哈希算法

哈希算法,可被称为摘要算法。因此,哈希算法的加密是单向的,不可用密文解密得到明文;其作用是对任意的数据输入,计算得到一个固定长度的输出摘要;目的是为了校验数据是否被篡改。

二、常见的几种哈希算法

1.MD5算法

  1. 通过MessageDigest类的单例模式创建其对象
  2. 通过对象的update()方法更新原始数据
  3. 通过对象的digest()方法加密,返回值为字节数组
  4. 可通过StringBuilder类,将其转换成十六进制的字符串
  5. MD5加密后的字节数组为16字节,其转换成十六进制的字符串长度为32位
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update("hello".getBytes());
byte[] resultArray = md5.digest();
StringBuilder str = new StringBuilder();
	for(byte bite:resultArray1) {
		str.append(String.format("%02x", bite));
	}
	System.out.println(str);

2.SHA-1算法

  1. 通过MessageDigest类的单例模式创建其对象
  2. 通过其对象的update()方法更新原始数据
  3. 通过其对象的digest()方法加密,其返回值为字节数组
  4. 通过StringBuilder类,将字节数组转换成字符串
  5. SHA-1算法加密后的字节数组为20字节,其转换成十六进制的字符串长度为40位

代码如下(示例):

String passworf = "wbjxxmy";
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(passworf.getBytes());
byte[] digestArray = digest.digest();
StringBuilder str = new StringBuilder();
for (byte bite : digest1Array) {
	str.append(String.format("%02x", bite));
}
System.out.println(str);

小结

哈希算法加密中的MD5算法思路和SHA-1算法思路大同小异,两者除了对明文进行摘要加密还可以进行“加盐”;通过获取随机的数据,将此数据更新至明文中,一起加密;可在一定程度上防“彩虹表”的攻击。


3.HmacMD5算法

在Hmac算法加密时,分成密钥和加密两个部分:

  1. 生成密钥:
    1. 通过KeyGenerator类的单例模式创建其对象
    2. 其对象通过generateKey()方法生成Key
    3. 通过Key的getEncoded()方法生成密钥的字节数组
    4. 通过StringBuilder类,将密钥的字节数组转换成十六进行的字符串
  2. 加密:
    1.通过Mac类的单例模式创建其对象
    2.通过对象的Init()方法初始化密钥
    3.通过对象的update()方法更新数据
    4.通过对象的doFinal()方法加密,其返回值为加密的字节数组
    5.通过StringBuilder类,将加密的字节数组转换成十六进制的字符串
  3. 生成的密钥为字节数为64字节,其加密后的字节数组为16字节
String passworf = "nhmyzgq";
// 1.生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
SecretKey key = keyGen.generateKey();
byte[] keyByteArray = key.getEncoded();
// 2.加密
Mac mac = Mac.getInstance("HmacMD5");
mac.init(key);	
mac.update(passworf.getBytes());
byte[] resultArray = mac.doFinal();
StringBuilder str = new StringBuilder();
	for(byte bite:resultArray) {
		str.append(String.format("%02x", bite));
	}
	System.out.println("加密的内容:"+str);

4.RipeMD160算法

此算法的加密基于BouncyCastle提供的第三方库

  1. 注册BouncyCastle提供的注册类对象BouncyCastleProvider
  2. 通过MessageDigest类的单例模式创建其对象
  3. 通过其对象的update()方法,更新原始数据
  4. 通过其对象的digest()方法,进行加密,其返回值为字节数组
  5. 可通过BigInteger()方法,将字节数组转换成十六进制的字符串
  6. 加密后字节数组为20字节,其转换成十六进制为40位
// 添加第三方库的对象
Security.addProvider(new BouncyCastleProvider());
MessageDigest digest = MessageDigest.getInstance("RipeMD160");
digest.update("helloworld".getBytes());
byte[] result = digest.digest();
String hex = new BigInteger(1, result).toString(16);
System.out.println("字符串的内容" + hex);

小结

哈希算法进行加密,都是摘要加密;加密后不可逆,也就是不可通过解密得到明文。以上就是常见的集中哈希算法

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MM呦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值