消息摘要算法数字摘要

tech2023-10-30  94

一.什么是消息摘要呢?

消息摘要是一个唯一对应一个消息或文本的固定长度的值,它由一个单向的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


四.常见的其他数字摘要

MD5SHA1SHA256SHA512

其他数字摘要算法与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

最新回复(0)