栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现哈希算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现哈希算法

文章目录
  • 一、哈希算法
  • 二、常见的几种哈希算法
    • 1.MD5算法
    • 2.SHA-1算法
      • 小结
    • 3.HmacMD5算法
    • 4.RipeMD160算法
      • 小结


一、哈希算法

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

二、常见的几种哈希算法 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);
小结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1023153.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号