为了账号安全,请及时绑定邮箱和手机立即绑定

计算 SHA-256 哈希时的前导零

计算 SHA-256 哈希时的前导零

莫回无 2022-07-14 09:02:50
我正在尝试将同一文件的 SHA-256 哈希值与 Python 和 Java 进行比较。但是,在某些情况下,Python 哈希值有前导零,而 Java 版本没有。例如,在两个程序中散列somefile.txt会产生:Python:000c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890爪哇:c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890简单地删除前导 0 并进行比较是否安全,或者是否有不产生前导零的实现?Python代码def sha256sum(filename):    h  = hashlib.sha256()    b  = bytearray(128*1024)    mv = memoryview(b)    with open(filename, 'rb', buffering=0) as f:        for n in iter(lambda : f.readinto(mv), 0):            h.update(mv[:n])    return h.hexdigest()print(sha256sum('/somepath/somefile.txt'))# 000c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890Java 代码public static String calculateSHA256(File updateFile) {    MessageDigest digest;    try {        digest = MessageDigest.getInstance("SHA-256");    } catch (NoSuchAlgorithmException e) {        Log.e(TAG, "Exception while getting digest", e);        return null;    }    InputStream is;    try {        is = new FileInputStream(updateFile);    } catch (FileNotFoundException e) {        Log.e(TAG, "Exception while getting FileInputStream", e);        return null;    }    byte[] buffer = new byte[8192];    int read;    try {        while ((read = is.read(buffer)) > 0) {            digest.update(buffer, 0, read);        }        byte[] shaSum = digest.digest();        BigInteger bigInt = new BigInteger(1, shaSum);        String output = bigInt.toString(16);        return output;    } catch (IOException e) {        throw new RuntimeException("Unable to process file for SHA256", e);    } finally {        try {            is.close();        } catch (IOException e) {            Log.e(TAG, "Exception on closing SHA256 input stream", e);        }    }}Log.i("Output", calculateSHA256(somefile))// I/Output: c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

转换忽略 SHA-256 哈希中的BigInteger前导零。相反,您应该byte[]直接编码。正如此答案中所建议的,您可以使用String.format():


StringBuilder sb = new StringBuilder();

for (byte b : shaSum) {

    sb.append(String.format("%02X", b));

}

return sb.toString();

当编码为十六进制字符串时,SHA-256 值有 64 个字符,根据wiki 示例:


SHA256("")


0x e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855


查看完整回答
反对 回复 2022-07-14
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信