首页 > 解决方案 > SHA1 Java 与 Python 不一样

问题描述

我需要将一段 python 翻译成 Java,但是当我做一个 SHA 哈希时,我没有像 Python 一样的结果,有字符串:

$&).6CXzPHw=2N_+isZK2908069825

// Java 代码

private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException {
    MessageDigest msdDigest = MessageDigest.getInstance("SHA-1");
    msdDigest.reset();
    msdDigest.update(input, 0, input.length);
    System.out.println(DatatypeConverter.printHexBinary((msdDigest.digest())));
    return msdDigest.digest();
}

// Python代码

print(sha1(prefix + str(num4).encode('ascii')).digest())

也许字节类型之间有区别??有任何想法吗 ?谢谢

标签: javapythoncryptographysha1

解决方案


Erwin Bolwidt 在评论中回答了问题:

删除print声明。调用digest是破坏性的,你调用它两次 - 你从方法返回的值不正确

在此之上:

结合起来,以上所有意味着您的代码应该是:

private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException {
    return MessageDigest.getInstance("SHA-1").digest(input);
}

测试

byte[] input = "$&).6CXzPHw=2N_+isZK2908069825".getBytes("US-ASCII");
System.out.println(Arrays.toString(getSHA1(input)));

输出

[-96, -1, 78, 94, -67, -96, -113, 12, -31, 93, -10, -55, -5, 72, -2, -57, 52, -84, -117, 40]

这与Python output相同,除了打印为有符号字节和无符号字节:

[160, 255, 78, 94, 189, 160, 143, 12, 225, 93, 246, 201, 251, 72, 254, 199, 52, 172, 139, 40]

推荐阅读