MD5 和其他 SHA 算法都属于SHA函数。实现方式是一样的。
1. MD5的Java实现
public static String getmd5(String plaintext) throws NoSuchAlgorithmException {
// 生成md5 对象
MessageDigest md5 = MessageDigest.getInstance("MD5");
// 更新 其实相当于增加这个字符串
md5.update("lihai".getBytes(StandardCharsets.UTF_8));
// 清空之前字符串 也就是之后的字符串才算有效 的字符串
md5.reset();
md5.update("hehe_dalao".getBytes(StandardCharsets.UTF_8), 3, 3);
// 调用digest 生成 byte 数组
byte[] digest = md5.digest(plaintext.getBytes(StandardCharsets.UTF_8));
// 生成数组的 String 形式
String bytes = Arrays.toString(digest);
// 将数组转为 ByteString 对象
ByteString res = ByteString.of(digest);
// 分别生成 hex和base64的编码
String res_hex = res.hex();
String res_base64 = res.base64();
System.out.println("横笛,bytes:" + bytes);
System.out.println("横笛,res_hex:" + res_hex);
System.out.println("横笛,res_base64:" + res_base64);
// 将hex编码后的string 解码,并生成byte 数组
byte[] bytes1 = ByteString.decodeHex(res_hex).toByteArray();
// 对于md5生成的数组和 hex解码后的数组 是一致的
String string1 = Arrays.toString(bytes1);
String string2 = Arrays.toString(digest);
System.out.println(string1);
System.out.println(string2);
return bytes + "||" + res_hex + "|| " + res_base64;
}
- 加密后的字节数组可以编码成Hex、Base64
- 没有任何输入,也能计算hash值
碰到加salt的MD5,可以直接输入空的值,得到结果去CMD5查询一下,有可能就得到salt
其实相当于是 :在md5处理字字符串加密之前,定义了一个字符串, 调用了update方法,参数为这个字符串,也就是相当于 自定义的字符串会和本身要加密的字符串拼接,并加密。// 自定义了 salt_str 这个字符串 String salt_str = "saltstr"; md5.update(salt_str.getBytes(StandardCharsets.UTF_8)); // 或者 byte[] digest = md5.digest((salt_str+plaintext).getBytes(StandardCharsets.UTF_8));
遇到这种情况,需要hook 到对方的saltstr。
技巧:
可以传入一个空值,此时md5加密的值只有对方的saltstr。 通过https://www.cmd5.com/ 这个网站,反向得到对方的saltstr。
局限性: 1,只有对方允许传入空值才行。- 可能对方saltstr 太长,无法在该网站得到。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。