首页 > 编程语言 >Java 实现MD5、SHA

Java 实现MD5、SHA

时间:2023-01-25 12:55:12浏览次数:31  
标签:MessageDigest md Java String SHA new byte MD5

MD5,SHA都是哈希值,并不能称为加密,因为无法解密

首先看下官方构造类说明

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/security/MessageDigest.html

MessageDigest md = MessageDigest.getInstance("SHA-256");

 try {
     md.update(toChapter1);
     MessageDigest tc1 = md.clone();
     byte[] toChapter1Digest = tc1.digest();
     md.update(toChapter2);
     ...etc.
 } catch (CloneNotSupportedException cnse) {
     throw new DigestException("couldn't make digest of partial content");
 }

网上看了下最大的差异就是把byte数据转换为16进制的过程

版本1:利用byte的二级制存储结构 转换16进制

补充:byte的取值范围为 [-128,127],二进制的范围为 [0-127] 00000000-01111111 [-128,-1] 10000000-11111111 数据存储均为补码,对应的二进制为8位,16进制的数为4位,所以采用了无符号右移4位以及原有的低位4位与0xf的与操作

public static String MD5(String key){
        char hexDigests[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        try {
            byte[] in = key.getBytes();
            MessageDigest messageDigest = MessageDigest.getInstance("md5");
            messageDigest.update(in);
            // 获得密文
            byte[] md = messageDigest.digest();
            // 将密文转换成16进制字符串形式
            int j = md.length;
            char[] str = new char[j*2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte b = md[i];
                str[k++] = hexDigests[b >>> 4 & 0xf];  // >>> 无符号右移。这里将字节b右移4位,低位抛弃,就等于是高4位于0xf做与运算。4位最多表示15。
                str[k++] = hexDigests[b & 0xf]; //用 1字节=8位,与0xf与运算,高4位必为0,就得到了低四位的数。
            }
            return new String(str);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException("md5加密失败",e);
        }
    }

版本2:用String.format形式转16进制,这种形式对大多数人更为友好

public static String Nd5(String key){
        try {
            byte[] in = key.getBytes();
            MessageDigest messageDigest = MessageDigest.getInstance("md5");
            messageDigest.update(in);
            // 获得密文
            byte[] md = messageDigest.digest();
            StringBuilder enText = new StringBuilder();
            for(byte b:md){
                enText.append(String.format("%02x",b));//02x 表示不足2位前面补1个0,04x表示长度为4最多可以补3个0
            }
            return new String(enText);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException("md5加密失败",e);
        }
    }

同理,如果需要SHA-1,SHA-256 只需要改造参数即可 MessageDigest.getInstance("SHA-1"); 

另附上获取值的在计算机中存储的二进制(获取都为补码,不是原码,便于计算机计算)

 System.out.println(Integer.toBinaryString(((byte)-38 & 0xFF) + 0x100).substring(1));    //11011010 

 System.out.println(Integer.toBinaryString((-128 & 0xFF) + 0x100).substring(1));    //10000000

标签:MessageDigest,md,Java,String,SHA,new,byte,MD5
From: https://www.cnblogs.com/life512/p/17066858.html

相关文章

  • wireshark 中使用lua解析自定义协议
    简述利用wireshark+lua实现自定义协议实时解析,保存分析结果1.找到版本和init.lua的位置:C:\ProgramFiles\Wireshark    2.修改init.lua(该版本是默认打开的,......
  • JavaScript学习笔记—函数中的call和apply
    调用函数除了通过函数()这种形式外,还可以通过其他的方式来调用函数,比如可以通过调用函数的call()和apply()两个方法来调用函数函数.call()函数.apply()call和apply除......
  • JavaScript学习笔记—可变参数
    可变参数可以接收任意数量实参,并将他们统一存储到一个数组中返回可变参数的名字可以自己指定可变参数就是一个数组,可以直接使用数组的方法可变参数可以配合其他参数一......
  • Java什么情况下数据类型可以自动转换?什么情况下需要强制转换?
    在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。当......
  • 【Javaweb】servlet七 | 解决post请求中文乱码问题
    问题描述在get请求时(可以接收)  post请求时(出现了中文乱码问题)  解决方案在doPost函数中添加如下代码//设置请求体字符为UTF-8,从而解决post请求的中......
  • 【Javaweb】Servlet六 | HttpServletRequest类的含义及其使用方法【详解】
    HttpServletRequest类的作用每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的Http协议信息解析好封装到Request对象中。然后传递到Service方法(doGet和doPost)......
  • CSharp: emojione
     ///<summary>///mysql数据库用编码类型utf8mb4///向sqlserver数据库插入emoji表情包///插入emoji的数据时,值value需要......
  • 4.2 JavaScript 执行上下文与作用域
    一、执行上下文JavaScript执行上下文是指JavaScript引擎在执行代码时的环境。它包含了代码所需的所有信息,包括变量对象、作用域链、this对象等。JavaScript引擎在执......
  • Java:枚举类型
    Java:枚举类型每博一文案师父说:人活一世,每个人都有他的特别,每个人都值得被温柔相待。红尘一遭,每段经历都有它的必然,每段经历都造就了现在的你,最快乐的事情,就是做自己,最......
  • 0316-Java学习-093-【答疑解惑】MavenReportException: Error while generating Javad
     一、问题描述在使用IDEA二次开发jacoco进行编译源代码,生成doc文档时,控制台报错,错误信息截图如下: 对应的日志文本信息如下所示:[INFO]root.....................