目录
(2)MD5加密算法(图片)
什么是哈希算法?
哈希算法是一种将任意长度的数据映射为固定长度值的算法。 哈希算法的特点是,对于相同的输入数据,无论输入数据的大小如何,哈希算法都会生成相同长度的哈希值。 哈希算法可用于验证数据完整性,具有防篡改检测的功能; 常见的哈希算法有MD5、SHA-1、SHA-256、SHA-512等。
步骤
- 创建基于某种算法的消息摘要对象
- 更新对象的原始数据
- 将加密后结果存入字节数字
(1)MD5加密算法(文本)
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
//1.创建基于MD5算法的消息摘要对象
MessageDigest md5 = MessageDigest.getInstance("md5");
//2.更新原始数据
md5.update("v".getBytes());
//3.获取加密后结果
byte[] by =md5.digest();
System.out.println("加密后的结果(字符数组):"+Arrays.toString(by));
System.out.println("加密后的长度:"+by.length);
//自己定义的HashTools工具类
System.out.println("加密后的结果(16进制字符串):"+HashTools.bytesToHex(by));
}
}
(2)MD5加密算法(图片)
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
//按照MD5算法对图片进行“加密”
public class Main {
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
//获取图片原始字节内容
byte[] by = Files.readAllBytes(Paths.get("/Users/liyangyang/Downloads/1.txt"));
//1.创建基于MD5算法的消息摘要对象
MessageDigest md5 = MessageDigest.getInstance("md5");
//2.更新原始数据
md5.update(by);
//3.将结果放入字节数组
byte[] b = md5.digest();
System.out.println(Arrays.toString(b));
System.out.println(HashTools.bytesToHex(b));
System.out.println(b.length);
}
}
(3)SHA-1加密算法(加入随机盐,解决彩虹表)
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.UUID;
//通过随机加盐,解决彩虹表攻击问题
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
//产生随机的盐值
byte[] salt =UUID.randomUUID().toString().substring(5).getBytes();
//1.创建基于SHA-1算法的消息摘要对象
MessageDigest SHA1 = MessageDigest.getInstance("SHA-1");
//2.更新初始数据
SHA1.update("wbbsnb".getBytes());
SHA1.update(salt);//加入盐值
//3.将结果放入字节数组
byte[] by = SHA1.digest();
//输出结果为20个字节(40个字符)
System.out.println(Arrays.toString(by));
System.out.println(HashTools.bytesToHex(by));
}
}
(4)HashTools工具类
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//Hash算法工具类(都摘要为2位16进制的结果)
public class HashTools {
//消息摘要对象
private static MessageDigest digest;
//构造方法私有
public HashTools() {}
//按照MD5进行消息摘要计算(哈希算法)
public static String digestByMD5 (String s) throws NoSuchAlgorithmException {
digest = MessageDigest.getInstance("MD5");
return handler(s);
}
//按照SHA-1进行消息摘要计算(哈希算法)
public static String digestBySHA1 (String s) throws NoSuchAlgorithmException {
digest = MessageDigest.getInstance("SHA-1");
return handler(s);
}
//按照SHA-256进行消息摘要计算(哈希算法)
public static String digestBySHA256 (String s) throws NoSuchAlgorithmException {
digest = MessageDigest.getInstance("SHA-256");
return handler(s);
}
//按照SHA-512进行消息摘要计算(哈希算法)
public static String digestBySHA512 (String s) throws NoSuchAlgorithmException {
digest = MessageDigest.getInstance("SHA-512");
return handler(s);
}
//通过消息摘要对象,加密处理内容
public static String handler(String s) {
digest.update(s.getBytes());
return bytesToHex(digest.digest());
}
//将字节数组转换为16进制字符串
public static String bytesToHex(byte[] by) {
StringBuilder sb = new StringBuilder();
for(byte b :by) {
//将字节转换为2位十六进制字符串
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
(5)RipeMd160加密算法
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import java.util.Arrays;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
//使用第三方开源库提供的RipeMD160消息摘要算法实现
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
//注册BouncyCastleBouncycastleProvider通知类
//将提供的消息摘要到算法注册到Security
Security.addProvider(new BouncyCastleProvider());
//1.创建基于RipeMd160算法的消息摘要对象
MessageDigest ripeMdDigest = MessageDigest.getInstance("RipeMd160");
//2.更新原始数据
ripeMdDigest.update("wbjxxmy".getBytes());
//3.将加密结果存入字节数组
byte[] by = ripeMdDigest.digest();
System.out.println("加密后的(字节数组)"+Arrays.toString(by));
//16进制字符串
//方法一
System.out.println("加密后的(字符串)"+HashTools.bytesToHex(by));
//方法二
String s = new BigInteger(1,by).toString(16);
System.out.println("加密后的(字符串)"+s);
}
}