Cmd OpenSSL HMCA SHA1未给出预期结果
我正试图使用OpenSSL在CMD中生成一个校验和,正如上面的答案所示 但是,使用提供的示例,我得到了一个意外的结果:Cmd OpenSSL HMCA SHA1未给出预期结果,cmd,openssl,sha1,hmac,Cmd,Openssl,Sha1,Hmac,我正试图使用OpenSSL在CMD中生成一个校验和,正如上面的答案所示 但是,使用提供的示例,我得到了一个意外的结果: C:\>echo -n "value" | openssl dgst -sha1 -hmac "key" (stdin)= 8c5b4c3a9cee7bc9020a43f1c396f9e13c2bae4a 原始问题中所示的预期结果(我在其他HMAC SHA1发电机中也得到了该结果)是: 57443a4c052350a4463883
C:\>echo -n "value" | openssl dgst -sha1 -hmac "key"
(stdin)= 8c5b4c3a9cee7bc9020a43f1c396f9e13c2bae4a
原始问题中所示的预期结果(我在其他HMAC SHA1发电机中也得到了该结果)是:
57443a4c052350a44638835d64fd66822f813319
奇怪的是,我在PowerShell中得到了第三个结果:
PS C:\> echo -n "value" | openssl sha1 -hmac "key"
(stdin)= 56d96e5393d98eb5e189ab189e02b1832af727b5
不言而喻,我在这里有点不舒服,所以请原谅我在解释中的任何明显错误或缺点。将几个问题的答案拼凑在一起,从而教给我们一些技巧,让这三种情况都得到相同的结果: 在类似*nix的环境(包括macOS)中,
printf
是一种更便携的打印方式,无需换行:
$ printf value | openssl dgst -sha1 -hmac key
57443a4c052350a44638835d64fd66822f813319
在CMD中避免换行的技巧(注意第二个|
前面没有空格,这很重要):
根据PowerShell GitHub项目中的此问题,对于PowerShell,目前似乎不可能“以本机方式”实现这一点:。如果您真的必须从PowerShell提示符执行此操作,则可能需要调用CMD,如下所示:
> cmd /c "echo | set /p=value| openssl dgst -sha1 -hmac key"
(stdin)= 57443a4c052350a44638835d64fd66822f813319
不确定dos提示符为echo-n输出了什么,但powershell没有抑制换行的选项(即它仍然在末尾输出一个额外的换行,并计算包含该字符的和)
echo-n“value”| openssl dgst-sha1-hmac“key”
导致将具有以下十六进制值的字节流传递给openssl
:2D 6E 20 22 76 61 6C 75 65 22 20 20 0D 0A
。我怀疑您是否真的想要获取-n“value”CRLF的散列值(CRLF=回车+换行)。PowerShell是与Windows命令处理器不同的脚本解释器。它的语法完全不同。因此,与由cmd.exe
解释的echo
相比,powershell.exe
对echo
的解释有所不同。那么您真正想要哪个字符串(字节流)的哈希值呢?顺便说一句:参考的问题是针对bash
——一个Unix/Linux shell解释器,它解释其内部命令echo
,与Windows的cmd.exe
和powershell.exe
不同。您无法比较三个不同解释器的结果,每个解释器在使用bash
命令行时解释echo
不同。PS:echo-n“值”>OutputCMD.txt
将字节流2d6e2076616c75220d0a
写入文本文件OutputCMD.txt
(ASCII字符流)。留给重定向操作符(如|
或
的空间也由cmd.exe的echo
输出<在PowerShell提示符窗口中执行的代码>echo-n“value”>OutputPS.txt
将字节流FF FE 2D 00 6E 00 0D 00 0A 00 76 00 61 00 6C 00 75 00 65 00 00 0D 00 0A 00
写入文件OutputPS.txt
(带字节顺序标记的UTF-16小尾端编码Unicode字符流)bash
使用所用的bash
选项仅输出76 61 6C 75 65
。非常感谢您的评论。很明显,我在这里搞乱了一些不属于我的事情。:)我试图实现的是使用一个键创建一个批处理脚本来HMAC字符串。找到相关的问题,我相信是在正确的道路上。看来我需要重新表述我的问题非常感谢。CMD解决方案正是我想要的,效果非常好。
> cmd /c "echo | set /p=value| openssl dgst -sha1 -hmac key"
(stdin)= 57443a4c052350a44638835d64fd66822f813319