【问题标题】:OpenSSL: best way to sha256 hash two sha256 hashesOpenSSL:sha256 散列两个 sha256 散列的最佳方法
【发布时间】:2021-05-21 23:27:44
【问题描述】:

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

HASH1=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
HASH2=7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730

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

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

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

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

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

【问题讨论】:

    标签: bash openssl sha256


    【解决方案1】:

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

    在您的情况下,您需要将两个十六进制编码的字节数组连接在一起,然后获取结果的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多