[英]Leading zeros when computing SHA-256 hash
我正在嘗試將同一文件的 SHA-256 哈希值與 Python 和 Java 進行比較。 但是,在某些情況下,Python 哈希值具有前導零,而 Java 版本則沒有。 例如,在兩個程序中散列somefile.txt 會產生:
蟒蛇: 000c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890
Java: 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
BigInteger
轉換會忽略 SHA-256 哈希中的前導零。 相反,您應該直接對byte[]
進行編碼。 正如此答案中所建議的,您可以使用String.format()
:
StringBuilder sb = new StringBuilder();
for (byte b : shaSum) {
sb.append(String.format("%02X", b));
}
return sb.toString();
根據wiki 示例,當編碼為十六進制字符串時,SHA-256 值有 64 個字符:
SHA256("")
0x e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.