目录
0.概述:
哈希算法又称摘要算法,它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。哈希算法的目的:为了验证原始数据是否被篡改。
最主要的特点是:
-
相同的输入一定得到相同的输出
-
不同的输入大概率得到不同的输出
1、MD5算法
1.1 步骤
-
获取基于MD5加密算法的工具对象
-
更新原始数据
-
获取加密后的结果
-
将字节数组形式的结果转换成字符串
1.2代码实现
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/*
* MD5加密密码,规定长度为32,并且拿到他的字符串形式
*/
public class Test02 {
public static void main(String[] args) {
String password = "wbjxxmynhmyzgq";
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(password.getBytes());
byte[] digestByteArray = digest.digest();//加密
StringBuilder result = new StringBuilder();
for(byte b : digestByteArray) {
result.append(String.format("%02x", b));
}
System.out.println(result.toString());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
2 、SHA-1算法
2.1 步骤
-
获取基于MD5加密算法的工具对象(“SHA-1”)
-
更新原始数据
-
获取加密后的结果
-
将字节数组形式的结果转换成字符串
2.2 代码实现:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.UUID;
/*
* SHA-1哈希算法
*/
public class Test01 {
public static void main(String[] args) {
String password = "sdfsdf";
//加盐
String salt = UUID.randomUUID().toString().substring(0, 5);
System.out.println(salt);
try {
//SHA-1哈希算法
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(password.getBytes());
digest.update(salt.getBytes());
byte[] digestArray = digest.digest();
StringBuilder resultStr = new StringBuilder();
for(byte b : digestArray){
resultStr.append(String.format("%02x", b));
}
System.out.println(resultStr.toString());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
3 、Hmac算法
3.1 步骤:
-
生成秘钥(创建秘钥生成器对象)
-
利用秘钥生成器生成秘钥
-
生成秘钥Key的字节数组
-
可以将秘钥字节数组转换成字符串
-
使用秘钥、进行加密(获取算法对象)
-
初始化
-
更新原始内容
-
加密,生成字节数组形式的加密结果
-
将加密结果转换成字符串
3.2 代码实现:
public class Test01 {
public static void main(String[] args) {
try{
//1 获取秘钥结果
String password = "nhmyzgq";
//秘钥生成器
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
//生成秘钥
SecretKey key = keyGen.generateKey();
//生成秘钥数组
byte[] keyByteArray = key.getEncoded();
StringBuilder sb = StringBuilder();
for(byte b:keyByteArray) {
sb.append(String.format("%02x", b));
}
System.out.println("打印秘钥内容:" + sb);
//2使用秘钥,进行加密
//获取算法对象
Mac mac = Mac.getInstance("HmacMD5");
//初始化
mac.init(key);
mac.update(password.getBytes());
//加密(返回字节数组)
byte[] resultByteArray = mac.doFinal();
//把字节数组转换成字符串
StringBuilder resultStr = new StringBuilder();
for(byte b : resultByteArray){
resultStr.append(String.format("%02", b));
}
System.out.println(resultStr);
}catch(NoSuchAlgorithmException e){
e.printStackTrace();
}
}
}
恢复秘钥的代码实现:
public class Test01 {
public static void main(String[] args) {
try{
//1 获取秘钥结果
String password = "nhmyzgq";
//秘钥生成器
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
//生成秘钥
SecretKey key = keyGen.generateKey();
//生成秘钥数组
byte[] keyByteArray = key.getEncoded();
StringBuilder sb = StringBuilder();
for(byte b:keyByteArray) {
sb.append(String.format("%02x", b));
}
System.out.println("打印秘钥内容:" + sb);
//2使用秘钥,进行加密
//获取算法对象
Mac mac = Mac.getInstance("HmacMD5");
//初始化
mac.init(key);
mac.update(password.getBytes());
//加密(返回字节数组)
byte[] resultByteArray = mac.doFinal();
//把字节数组转换成字符串
StringBuilder resultStr = new StringBuilder();
for(byte b : resultByteArray){
resultStr.append(String.format("%02", b));
}
System.out.println(resultStr);
}catch(NoSuchAlgorithmException e){
e.printStackTrace();
}
}
}