消息摘要是一个唯一对应一个消息或文本的固定长度的值,它由一个单向的Hash加密函数对消息进行作用而产生
简单来说,它就是用来接收随意大小的数据,输出固定长度的哈希值
为了保证文件或值的安全性,因为使用消息摘要生成的值是不可篡改的;
特点:
无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。
只要输入的消息不同,对其进行摘要以后产生的摘要消息也不同。
消息摘要是单向的,是不可逆的。
准备工作
准备原文String input = “消息摘要”;
定义算法String algorithm = “MD5”;
public static void main(String[] args) throws Exception{ //原文 String input = "a"; //算法 String algorithm = "MD5"; String MD5 = getDigest(input, algorithm); System.out.println("MD5:"+MD5); }创建一个消息摘要对象MessageDigest 通过getInstance来进行实例化和初始化,其参数为算法变量algorithm
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
接着用通过调用MessageDigest 实例对象messageDigest的方法 digest() 计算出哈希计算并返回结果,传入的参数是原文的字节数组input.getBytes();
byte[] bytes = messageDigest.digest(input.getBytes());
private static String getDigest(String input, String algorithm) throws Exception { //创建消息摘要对象 MessageDigest digest = MessageDigest.getInstance(algorithm); //执行消息摘要算法 byte[] bytes = digest.digest(input.getBytes()); return toHex(bytes); }最后可以使用Base64.encode()去转码或者使用16进制去转码
使用用Base64.encode()去转码 [ 消息摘要使用的是16进制]
System.out.println(Base64.encode(bytes));
//使用Base64进行转码 //System.out.println(Base64.encode(bytes));使用16进制去转码
去遍历获取的哈希值bytes,通过 Integer.toHexString(aByte & 0Xff)转码,注意一点是迭代输出的时候有的字符是一个字节,这时候就需要去判断补0才能一致
//获取原文哈希值 private static String toHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte aByte : bytes) { //把密文转换为16进制 //4124bc0a9335c27f086f24ba207a4912 //4124bca9335c27f86f24ba207a4912(高位补0) String s = Integer.toHexString(aByte & 0Xff); //判断如果密文的长度是1,需要在高位进行补0 if(s.length()==1){ s = "0"+s; } sb.append(s); } //打印对象 toString return sb.toString(); }SHOW
其他数字摘要算法与MD5一致,只需要把算法变量对应改一下就好了!
String SHA = getDigest(input, "SHA-1"); System.out.println("SHA-1:"+SHA); String SHA1 = getDigest(input, "SHA-256"); System.out.println("SHA-256:"+SHA1); String SHA2 = getDigest(input, "SHA-512"); System.out.println("SHA-512 :"+SHA2);SHOW