首页 > 解决方案 > OpenSSL:sha256 散列两个 sha256 散列的最佳方法

问题描述

我有两个 sha256 哈希作为十六进制字符串

HASH1=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
HASH2=7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730

现在我想创建一个依赖于这两个哈希的新 SHA256。在任何情况下,相同哈希的任何两个十六进制表示都应该始终导致相同二进制哈希的表示(例如,如果我不使用字符串表示,那么它必须是它的某种规范形式,例如 ascii 编码的小写)

我知道我需要使用单射函数,但是最好的方法是什么?

我应该使用字符串值和一些分隔符,然后散列该散列的二进制表示(并依赖 bash 使用 ASCII 编码)?

NEW_HASH=$(echo -n "${HASH1,,},${HASH2,,}" | openssl dgst -sha256 | sed 's/(stdin)= //')

或者最好先将字符串表示形式转换为二进制,然后在将结果输入openssl之前对二进制表示做一些事情?

标签: bashopensslsha256

解决方案


加密函数对原始字节进行操作。因此,如果给定十六进制编码的字符串,通常最好先解码这些字符串,然后将底层字节数组输入加密函数。

在您的情况下,您需要将两个十六进制编码的字节数组连接在一起,然后获取结果的 SHA256 哈希。有两种方法可以做到这一点:

a) 连接两个十六进制编码字符串,然后将连接的十六进制编码字符串解码为字节数组,然后获取字节数组的 SHA256 哈希。

b) 将每个十六进制编码的字符串解码为一个字节数组,然后将两个字节数组连接在一起,然后取字节数组的 SHA256 哈希。

上述两种方法产生相同的结果。

对于 (a),您可以执行以下操作:

{ echo -n "b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c"; echo -n "7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730"; } | xxd -p -r | sha256sum

产生:

fc87504c81f99f46407174938c24d0d0b6c65179565a2ac0fd6bd12c2016cbe8

对于 (b),您可以执行以下操作:

{ echo -n "b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c" | xxd -p -r; echo -n "7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730" | xxd -p -r; } | sha256sum

其中(如预期的那样)还产生:

fc87504c81f99f46407174938c24d0d0b6c65179565a2ac0fd6bd12c2016cbe8

推荐阅读