ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

如何在Shell中获取字符串的二进制表示?

2019-08-16 09:10:55  阅读:1282  来源: 互联网

标签:java shell openssl binary shell-script


我正在使用openssl dgst -sha1 -binary以二进制格式获取字符串的哈希值.

(我正在使用-binary标志,因为我的openssl版本在默认输出的每个哈希值之前添加了“stdout”,而-binary有助于避免它,因此更容易将哈希结果存储为二进制格式以便进一步处理(所以我可以当我想要十六进制值而不是从每个字符串中手动删除“stdout”时,只使用xxd -p

那么,openssl dgst -sha1 -binary的二进制输出为“Hello!” Cygwin控制台中的字符串将如下所示:_▒▒“q▒%▒a▒▒▒▒.&C▒0N▒Q▒▒vH& 8i

现在我用这个结果创建一个新变量,并将它与另一个变量连接起来,该变量不是二进制格式(即“World”).所以我的新变量现在看起来像

_▒▒“q▒%▒a▒▒▒▒&安培;C▒0N▒Q▒▒vH&安培; 8iWorld

然后我为这个连接的字符串生成另一个哈希值,并将其与使用默认Java哈希库(MessageDigest)得到的哈希值进行比较.但是,在这一步中,通过shell和Java获得的哈希值不匹配(我需要获得与Java端生成的值完全相同的值).

所以我认为我的“World”字符串也应该是二进制格式以匹配我的Java哈希输出(因为只要我为连接的二进制值生成哈希所有哈希匹配).但是,我不知道如何将我的“World”字符串转换为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

看看它是如何包含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

再次注意,您只能将该变量传递给内置命令(printf …).

现在,如果您想要的只是再次哈希,那么它就是

(echo 323 | openssl dgst -sha1 -binary; printf %s World) |
  openssl dgst -sha1 -binary

不需要变量.

标签:java,shell,openssl,binary,shell-script
来源: https://codeday.me/bug/20190816/1665591.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有