java - 哪个 SHA-256 是正确的? Java SHA-256 摘要或 Linux 命令行工具

标签 java security hash

当我在 Java 中使用以下方法计算字符串的 SHA-256 时

public static void main(String[] args) throws NoSuchAlgorithmException {

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

    byte[] hash = md.digest("password".getBytes());

    StringBuffer sb = new StringBuffer();
    for(byte b : hash) {
        sb.append(Integer.toHexString(b & 0xff));
    }

    System.out.println(sb.toString());
}

我明白了:

5e884898da2847151d0e56f8dc6292773603dd6aabbdd62a11ef721d1542d8

在命令行我执行以下操作(我需要 -n 不添加换行符):

echo -n "password" | sha256sum

得到

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

如果我们更仔细地比较这些,我会发现 2 个细微差别

5e884898da2847151d0e56f8dc6292773603dd6aabbdd62a11ef721d1542d8
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

或:

5e884898da28   47151d0e56f8dc6292773603d   d6aabbdd62a11ef721d1542d8
5e884898da28 0 47151d0e56f8dc6292773603d 0 d6aabbdd62a11ef721d1542d8

这两个哪个是正确的?

结果:都是,但我错了……

通过使用修复它:

    StringBuffer sb = new StringBuffer();
    for(byte b : hash) {
        sb.append(String.format("%02x", b));
    }

谢谢!

最佳答案

我会做一个合理的猜测:两者都输出相同的摘要,但是在将 byte[] 结果输出为十六进制字符串的 Java 代码中,输出的是小字节值(小于16) 没有前导 0。所以一个值为“0x0d”的字节被写为“d”而不是“0d”。

关于java - 哪个 SHA-256 是正确的? Java SHA-256 摘要或 Linux 命令行工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3021970/

相关文章:

java - 存储库到服务的依赖关系未得到满足

java - jack 森非法参数异常 : Can not handle managed/back reference

java - 如果补丁失败,不会调用 liquibase 回滚

oracle - 如何关闭 Oracle 密码过期功能?

javascript - 将所有域添加到 CORS 的安全隐患(访问控制允许来源 : *)

java - 如何将 MessageDigest 内部状态保存到数据库中?

python - 如何使 python 数据类可哈希?

php - MD5、密码散列和盐位

java - 如何将 Map 转换为 Bytes 并保存到内部存储

ios - 身份验证(护照)足以保证 Node js 后端服务器的安全性?