Cmd OpenSSL HMCA SHA1未给出预期结果

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

我正试图使用OpenSSL在CMD中生成一个校验和,正如上面的答案所示

但是,使用提供的示例,我得到了一个意外的结果:

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