【问题标题】:OpenSSL HMCA SHA1 not giving expected resultOpenSSL HMCA SHA1 未给出预期结果
【发布时间】: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" 导致将具有以下十六进制值的字节流传递给openssl2D 6E 20 22 76 61 6C 75 65 22 20 0D 0A。我怀疑您是否真的想获得 -n "value" CRLF 的哈希值(CRLF = 回车 + 换行)。 PowerShell 是与 Windows 命令处理器不同的脚本解释器。它的语法完全不同。因此,powershell.exeecho 的解释与cmd.exeecho 的解释不同。那么你真的想要哪个字符串(字节流)的哈希值?
  • 顺便说一句:引用的问题是针对bash——一个Unix/Linux shell解释器,它解释其内部命令echo不同于Windows的cmd.exepowershell.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字符流)。像|> 这样的重定向运算符留下的空格也由echocmd.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 字符串。找到链接的问题,我相信是在正确的道路上。看来我需要改写我的问题。 :)

标签: cmd openssl sha1 hmac


【解决方案1】:

将关于 SO 的几个问题的答案拼凑在一起,教了一些技巧,可以在所有三种情况下获得相同的结果:

在类似 *nix 的环境(包括 macOS)中,printf 是一种更便携的打印方式,无需换行:

$ printf value | openssl dgst -sha1 -hmac key
57443a4c052350a44638835d64fd66822f813319

在CMD中避免换行的技巧(注意第二个|之前没有空格,这是必不可少的):

>echo | set /p=value| openssl dgst -sha1 -hmac key
(stdin)= 57443a4c052350a44638835d64fd66822f813319

根据 PowerShell GitHub 项目中的这个问题:Piping Text To An External Program Appends A Trailing Newline,目前使用 PowerShell 似乎“本机”不可能。如果您真的必须从 PowerShell 提示符下执行此操作,则可以调用 CMD,如下所示:

> cmd /c "echo | set /p=value| openssl dgst -sha1 -hmac key"
(stdin)= 57443a4c052350a44638835d64fd66822f813319

【讨论】:

  • 谢谢! CMD 解决方案正是我所追求的,完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多