【发布时间】:2021-04-11 00:24:32
【问题描述】:
我正在尝试使用 OpenSSL 在 CMD 中生成校验和,根据最佳答案 here。
但是,使用提供的示例,我得到了意想不到的结果:
C:\>echo -n "value" | openssl dgst -sha1 -hmac "key"
(stdin)= 8c5b4c3a9cee7bc9020a43f1c396f9e13c2bae4a
原始问题中显示的预期结果是:
57443a4c052350a44638835d64fd66822f813319
奇怪的是,我在 PowerShell 中得到了第三个结果:
PS C:\> echo -n "value" | openssl sha1 -hmac "key"
(stdin)= 56d96e5393d98eb5e189ab189e02b1832af727b5
正如不言自明的那样,我在这里有点脱离了我的舒适区,所以请原谅我在解释中的任何明显错误或不足之处。
【问题讨论】:
-
不确定 dos 提示符为 echo -n 输出什么,但 powershell 没有该选项来抑制换行(即它仍然在末尾输出额外的换行并计算包含该字符的总和)
-
echo -n "value" | openssl dgst -sha1 -hmac "key"导致将具有以下十六进制值的字节流传递给openssl:2D 6E 20 22 76 61 6C 75 65 22 20 0D 0A。我怀疑您是否真的想获得-n "value" CRLF的哈希值(CRLF = 回车 + 换行)。 PowerShell 是与 Windows 命令处理器不同的脚本解释器。它的语法完全不同。因此,powershell.exe对echo的解释与cmd.exe对echo的解释不同。那么你真的想要哪个字符串(字节流)的哈希值? -
顺便说一句:引用的问题是针对
bash——一个Unix/Linux shell解释器,它解释其内部命令echo不同于Windows的cmd.exe和powershell.exe。您无法比较三个不同解释器的结果,每个解释器在使用bash命令行时解释echo不同。 -
PS:
echo -n "value" >OutputCMD.txt将字节流2D 6E 20 22 76 61 6C 75 65 22 20 0D 0A写入文本文件OutputCMD.txt(ASCII字符流)。像|或>这样的重定向运算符留下的空格也由echo的cmd.exe输出。在 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 0D 00 0A 00写入文件OutputPS.txt(带有字节顺序标记的UTF-16 Little Endian 编码的Unicode 字符流)。bash输出使用bash选项只是76 61 6C 75 65。 -
非常感谢您的 cmets。很明显,我在这里搞砸了一些不合我意的事情。 :) 我想要实现的是使用密钥创建一个批处理脚本来 HMAC 字符串。找到链接的问题,我相信是在正确的道路上。看来我需要改写我的问题。 :)