一、哈希算法
哈希算法,根据碰撞概率,输出的长度越长,就越难产生碰撞,也就越安全。
常用的哈希算法如下:
(1)哈希算法的用途
-
数据加密:哈希算法可以将原始数据转换成不可逆的加密字符串,这个字符串被称为哈希值。哈希值可以用于保护数据的隐私,因为无法通过哈希值推导出原始数据。
-
密码存储:哈希算法可以用于保护密码的存储。通过将密码转换为哈希值并存储哈希值,可以防止攻击者获取用户密码。当用户登录时,输入的密码将与保存的哈希值进行比对,如果匹配则允许用户登录。
-
校验文件的下载。
总之,哈希算法在数据安全、数字证书、数字签名等领域都有广泛的应用。
一、MD5
MD5是一种计算机算法,用于将任意长度的数据(消息)压缩成一个128位(16字节)的哈希值。MD5算法常用于数据完整性校验、数字签名、密码存储等领域。
MD5算法具有以下特点:
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
- 唯一性:不同的输入数据会产生不同的输出。
- 不可逆性:无法通过MD5值反推出原始数据。
- 抗修改性:对数据进行微小的修改,MD5值的变化也会很大。
(1)对字符串进行编码
public class Demo01 {
public static void main(String[] args) throws NoSuchAlgorithmException {
//创建基于MD5算法的消息摘要对象
MessageDigest md5=MessageDigest.getInstance("MD5");
//更新原始数据
md5.update("博得明月出,用兰花换锦服".getBytes());
//获取加密后的结果
byte[] digestBytes=md5.digest();
System.out.println("加密后的结果(字节数组):"+Arrays.toString(digestBytes));
System.out.println("加密后的结果(16进制字符串):"+HashTools.bytesToHex(digestBytes));
System.out.println("加密结果的长度:"+digestBytes.length);
}
}
加密后的结果(字节数组):[-78, 36, -54, 29, 82, 49, -85, -24, 87, -39, 102, 14, -4, 73, -83, -32]
加密后的结果(16进制字符串):b224ca1d5231abe857d9660efc49ade0
加密结果的长度:16
(2)对图片进行加密
//按照MD5算法对图片进行加密
public class Demo03 {
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
//图片的原始字节内容
byte[] imageBuf=Files.readAllBytes(Paths.get("D:\\test\\20230521\\mao1.jpg"));
//创建基于算法的消息摘要对象
MessageDigest md5=MessageDigest.getInstance("MD5");
//原始字节内容
md5.update(imageBuf);
//获取加密摘要
byte[] digestBytes=md5.digest();
System.out.println("加密后的结果(字节数组):"+Arrays.toString(digestBytes));
System.out.println("加密后的结果(16进制字符串):"+HashTools.bytesToHex(digestBytes));
System.out.println("加密结果的长度:"+digestBytes.length); //MD5算法的固定输出长度为16个字节
}
}
加密后的结果(字节数组):[-90, 35, 17, 98, 5, 9, -60, 116, -53, -119, -32, -68, 43, -65, 66, 105]
加密后的结果(16进制字符串):a62311620509c474cb89e0bc2bbf4269
加密结果的长度:16
三、SHA-1
SHA-1是一种加密算法,全称为Secure Hash Algorithm 1。它旨在产生一个160位(20字节)的消息摘要,以提供数据的完整性保护。
public class Demo04 {
public static void main(String[] args) throws NoSuchAlgorithmException {
//原始密码
String password="xdsqczkyqs";
//产生随机的盐值
String salt=UUID.randomUUID().toString().substring(0,4);
//创建基于SHA-1算法的消息摘要对象
MessageDigest sha1=MessageDigest.getInstance("SHA-1");
sha1.update(password.getBytes());
sha1.update(salt.getBytes());
//计算加密结果SHA-1的输出结果为20个字节(40)
String digestHex=HashTools.bytesToHex(sha1.digest());
System.out.println("加密结果:"+digestHex);
}
}
加密结果:d98902bdfdf050316c28487caf5b358377a4cb23