哈希算法-

目录

什么是哈希算法?

​实现步骤

(1)MD5加密算法(文本)

(2)MD5加密算法(图片)​​​​​​​

(3)SHA-1加密算法(加入随机盐,解决彩虹表)

(4)HashTools工具类

(5)RipeMd160加密算法


什么是哈希算法?

哈希算法是一种将任意长度的数据映射为固定长度值的算法。                                                        哈希算法的特点是,对于相同的输入数据,无论输入数据的大小如何,哈希算法都会生成相同长度的哈希值。                                                                                                                                                哈希算法可用于验证数据完整性,具有防篡改检测的功能;                                                            常见的哈希算法有MD5、SHA-1、SHA-256、SHA-512等。

步骤

  1. 创建基于某种算法的消息摘要对象
  2. 更新对象的原始数据
  3. 将加密后结果存入字节数字​​​​​​​

(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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lcannal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值