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

常见的哈希算法总结

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

常见的哈希算法总结

        哈希算法又称作消息摘要算法,它的目的就是为了验证原始数据是否被篡改并且它只能进行加密而无法解密。我们常见的哈希算法有:MD5、SHA-1、SHA-256、SHA-512以及第三方开源库给我们提供的一些哈希算法、以及基于哈希算法的HMac算法,例如RipeMD160,它们的输出长度如下:

 我们以获取图片的MD5值为例,看看如何输入计算哈希:

1、通过IO流拿到图片的字节数组

2、获取基于MD5加密算法的工具对象

3、更新原始内容

4、对数据进行加密

5、将加密后的字节数组转换为字符串

public class Demo08 {
	public static void main(String[] args) {
		// 获取图片的MD5值
		try {
			byte[] imgByteArray = Files.readAllBytes(Paths.get("D:\IOTest\doubanPicture\jay.jpg"));
			
			// 获取基于MD5加密算法的工具对象
			MessageDigest digest = MessageDigest.getInstance("MD5");
			
			// 更新原始数据
			digest.update(imgByteArray);
			
			// 加密
			byte[] resByteArray = digest.digest();
			
			// 加密后的字节数组,转换为字符串
			StringBuilder sb = new StringBuilder();
			for (byte b : resByteArray) {
				sb.append(String.format("%02x", b));
			}
			System.out.println(sb);
			System.out.println(sb.length());
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

结果如下:

字符串长度为32的原因是无论你要加密的内容是什么, 最后的输出长度都会像上图提到的输出长度一样,像MD5最终的输出长度为16字节,因为我将字节数组转换为了字符串,所以它的长度就变为了32。

其他的SHA-1、SHA-256等等,基本与MD5类似,不同的只是在获取加密算法的工具对象时,传进去的值不同而已。

Hmac算法就是一种基于密钥的消息认证码算法,它是一种更安全的消息摘要算法,在存储用户的口令时,通过加"盐"的方式可以抵御彩虹表的攻击,而这个"salt"就相当于Hmac算法里的认证码这也是Hmac算法的一个优势,一般情况下,Hmac算法总是和某种哈希算法配合起来使用的,而且输出的长度也和所配合的这种哈希算法长度一致。

我们以HmacSHA1算法为例,看看如何输入计算哈希:

1、创建密钥生成器对象KeyGenerator

2、根据密钥生成器生成密钥

3、获取算法对象Mac

4、初始化密钥

5、更新原始内容

6、加密

7、输出结果

public class Demo11 {
	public static void main(String[] args) {
		String psw = "Apesource";
		try {
			// 1.生成秘钥
			// 秘钥生成器KeyGenerator
			KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA1");
			
			// 生成秘钥
			SecretKey key = keyGen.generateKey();
			
			// 2.使用秘钥,进行加密
			// 获取算法对象
			Mac mac = Mac.getInstance("HmacSHA1");
			
			// 初始化秘钥
			mac.init(key);
			
			// 更新原始内容
			mac.update(psw.getBytes());
			
			// 加密
			byte[] resByteArray = mac.doFinal();
			
			StringBuilder res = new StringBuilder();
			for (byte b : resByteArray) {
				res.append(String.format("%02x", b));
			}
			System.out.println(res);
			System.out.println(res.length());
			
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		}
	}
}

结果如下:

 最终Hmac的输出字节数组长度为20字节,转换为字符串为40字节。

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

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

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