关于密码学:密码学-04-MD5

33次阅读

共计 1483 个字符,预计需要花费 4 分钟才能阅读完成。

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;


    }
  1. 加密后的字节数组能够编码成 Hex、Base64
  2. 没有任何输出,也能计算 hash 值
  3. 碰到加 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,只有对方容许传入空值才行。

  4. 可能对方 saltstr 太长,无奈在该网站失去。

正文完
 0