C_U*_*C_U 2 shell java shell-script openssl binary
我正在使用openssl dgst -sha1 -binary以二进制格式获取字符串的哈希值。
(我使用-binary标志是因为我的 openssl 版本在默认输出的每个散列值之前添加了“stdout”,并-binary有助于避免它,因此更容易以二进制格式存储散列结果以供进一步处理(因此我可以xxd -p在我想要十六进制值,而不是stdout从每个字符串中手动删除“ ”)
因此,openssl dgst -sha1 -binary“Hello!”的二进制输出 Cygwin 控制台中的字符串将如下所示:_??"q?%?a????.&C?0N?Q??vH&8i
现在我用这个结果创建一个新变量并将它与另一个变量连接起来,该变量的值不是二进制格式(即“世界”)。所以我的新变量现在看起来像
_??"q?%?a??.&C?0N?Q??vH&8iWorld
然后我为这个连接的字符串生成另一个哈希,并将它与我使用默认 Java 哈希库 ( MessageDigest)得到的哈希进行比较。然而,在这一步中,通过 shell 和 Java 获得的哈希值不匹配(我需要获得与 Java 端生成的值完全相同的值)。
所以我想我的“世界”字符串也应该是二进制格式以匹配我的 Java 哈希输出(因为只要我为连接的二进制值生成哈希,所有哈希都匹配)。但是,我不知道如何在 shell 中将我的“世界”字符串转换为二进制格式。有任何想法吗?
您不能在变量中存储二进制数据(二进制数据通常是指具有任意字节值的数据,不仅是形成有效字符的字节值,否则不是特殊的)在bash变量中,因为bash不支持将0字节值存储在其变量中(并记住您不能将这些字符串作为参数传递给命令,因为它们是 NUL 分隔的字符串)。
zsh不过你可以进去。还要记住,命令替换会删除尾随的换行符(0xa 字节,在 Cygwin 上可能不同),所以read在这里使用可能更好:
$ echo 323 | openssl dgst -sha1 -binary | hd
00000000 3a 8b 03 4a 5d 00 e9 07 b2 9e 0a 61 b3 54 db 45 |:..J]......a.T.E|
00000010 63 4b 37 b0 |cK7.|
00000014
Run Code Online (Sandbox Code Playgroud)
看看它如何同时包含 0 字节和换行符 (0xa)
$ echo 323 | openssl dgst -sha1 -binary | IFS= LC_ALL=C read -ru0 -k20 var &&
var=${var}World
$ printf %s $var | hd
00000000 3a 8b 03 4a 5d 00 e9 07 b2 9e 0a 61 b3 54 db 45 |:..J]......a.T.E|
00000010 63 4b 37 b0 57 6f 72 6c 64 |cK7.World|
00000019
Run Code Online (Sandbox Code Playgroud)
再次注意,您只能将该变量传递给内置命令 ( printf...)。
现在,如果你想要的只是再次散列它,那么它只是
(echo 323 | openssl dgst -sha1 -binary; printf %s World) |
openssl dgst -sha1 -binary
Run Code Online (Sandbox Code Playgroud)
不需要变量。
| 归档时间: |
|
| 查看次数: |
2138 次 |
| 最近记录: |