Java 迭代 SHA-1 哈希与 Python

标签 java python hash iteration sha1

我有一个关于 Java 哈希算法的具体问题。 我有 2 个客户端,一个运行 python,另一个运行 Java(我知道,我可以只使用 python 解决所有问题,但现在我几乎需要使用 java)。

客户端需要以相同的方式比较插入的密码(即:如果 PIN 在 java 客户端上生成一个散列,相同的散列需要由 python 客户端生成。

我在这里读到: Iterative hashing returns different values in Python and Java

并在这里研究了官方文档: https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html

并且发现 python 允许无缝迭代编码,而 java 则不允许。我尝试通过以下方式(java 代码)使用 .clone() 方法解决问题:

        // creation of SHA-1 instance:
        MessageDigest message = MessageDigest.getInstance("SHA-1");
        // construction of the string to hash:
        String secretMessage = "0" + myPassWord + mySalt;
        // updating the instance:
        message.update(secretMessage.getBytes());
        // cloning the instance:
        MessageDigest messageClone = (MessageDigest) message.clone();
        // digesting the clone: the result is of type byte[]:
        byteResult = messageClone.digest();
        // construction of the previousHash: this will be used in the 
        // next run of SHA-1 hashing. Python runs everything in lowercase.
        // the hash is rendered as HEX characters String:
        prevHash = (DatatypeConverter.printHexBinary(byteResult)).toLowerCase();
        secretMessage = prevHash + "1" + myPassWord + mySalt;
        message.update(secretMessage.getBytes());
        // compute the final digest:
        byteResult = message.digest();
        // print it:
        System.out.println(DatatypeConverter.printHexBinary(byteResult));

现在,通过在第一次迭代(索引“0”)上执行 System.out.println,哈希重合。

不幸的是,随后的索引出了点问题,我不能,看在我的份上,理解它是什么。我怀疑这与 python 如何转换字符串并将其插入 secretMessage 变量有关。

供您引用,这里是 python 中的代码:

digest2 = ""
for i in range (0, 2):
    digest2 = sha1(digest2 + str(i) + password_to_hash + salt).hexdigest()
    print digest2

最佳答案

问题在于,在 Java 实现中,您首先向 MessageDigest 提供迭代字符串,然后在不重置 MessageDigest 的情况下向第二次迭代提供字符串,因此实际上它正在创建 String 的单个散列,例如:

"0" + pw + salt + sha-of-data-so-far + "1" + pw + salt

然而,python 实现为第二次迭代启动了一个新的散列并创建了两个散列:

"0" + pw + salt

然后:

sha-of-iteration-1 + "1" + pw + salt

关于Java 迭代 SHA-1 哈希与 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43043074/

相关文章:

java - HotSpot 可以内联 lambda 函数调用吗?

Java 程序无法完成方法 - 在 for 循环后退出且没有错误

java - 如何将文本从 Activity 传递到 Android 中的 Google Now 搜索

python - 将 Perl 脚本转换为 Python : dedupe 2 files based on hash keys

c++ - 定义 std::hash<std::function>

Java generics - 通配符的目的除了下限?

Python:使用另一个列表作为顺序对列表进行排序

python - 做一些 python 分析后,Django(?)对大型数据集真的很慢

python - openSUSE:在不更改默认版本的情况下安装替代版本的 python

iphone - 像 C# 一样使用 SHA512 对密码字符串进行哈希处理