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

我正在尝试将同一文件的 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'))


# 000c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890

Java 代码


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


莫回无
浏览 106回答 1
1回答

子衿沉夜

转换忽略 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java