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