bash - 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之前对二进制表示做一些事情?
解决方案
加密函数对原始字节进行操作。因此,如果给定十六进制编码的字符串,通常最好先解码这些字符串,然后将底层字节数组输入加密函数。
在您的情况下,您需要将两个十六进制编码的字节数组连接在一起,然后获取结果的 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
推荐阅读
- sql-server - 使用 Cte 的结果设置变量输出
- python-3.x - 如何停用 pyenv 虚拟环境
- python - 在远程主机上运行带有 args 的本地 python 脚本
- python - 使用容器进行 Numpy 切片(例如元组或列表)
- java - 浮动服务覆盖将点击从 textView 传递到活动
- flutter - const 变量必须用常量值初始化 || const 与 var || 扑
- sql - 将 SQL 子查询转换为连接以获得性能提升
- r - 使用 gtsummary 包的宽格式多项逻辑回归结果表
- javascript - HTML 显示在实时服务器上,但未在我的烧瓶应用程序上呈现。只有索引显示在烧瓶上
- r - 在 R Shiny 的表中插入 ggplot barplot