OpenSsl 在 Windows 和 Linux 平台上生成不同的签名

OpenSsl generate different signatures in Windows and Linux Platforms

命令如下: echo -n "x-date: Wed, 13 Oct 2021 09:30:00 GMT" openssl dgst -binary -sha256 -hmac "abc" | openssl base64

windows中的结果:LW4gIngtZGF0ZTogV2VkLCAxMyBPY3QgMjAyMSAwOTozMDowMCBHTVQiIG9wZW5z c2wgZGdzdCAtYmluYXJ5IC1zaGEyNTYgLWhtYWMgImFiYyIgDQo=

Linux中的结果:eC1kYXRlOiBXZWQsIDEzIE9jdCAyMDIxIDA5OjMwOjAwIEdNVCBvcGVuc3NsIGRn c3QgLWJpbmFyeSAtc2hhMjU2IC1obWFjIGFiYw==

如何使用 windows 命令生成相同的结果(Linux 版本)?

非常感谢。


将“abc”替换为“XciGdDmDTd5a9oArnATg3d3W1OZiJD7X”

Linux

echo -n “x-date:2021 年 10 月 13 日,星期三 09:30:00 GMT” | openssl dgst -binary -sha256 -hmac "XciGdDmDTd5a9oArnATg3d3W1OZiJD7X" | openssl base64

Windows

set /p="x-date: 2021 年 10 月 13 日,星期三 09:30:00 GMT openssl dgst -binary -sha256 -hmac XciGdDmDTd5a9oArnATg3d3W1OZiJD7X" 虚拟

首先,这似乎根本不是编程,而且很可能会关闭,因为在过去一两年中话题性变得非常严格。

其次,您没有在此处创建任何类型的签名。您只是简单地对字符串进行 base64 编码,并且该字符串在两个系统上是不同的,因为在 Windows 上您使用的是从 MSDOS 派生的命令处理器 cmdecho 命令,并且明显不同于 Unix shells 通常提供的 echo 命令(尽管它 可以 变化)。具体来说,您的 Linux 值是字符

的 base64 编码
x-date: Wed, 13 Oct 2021 09:30:00 GMT openssl dgst -binary -sha256 -hmac abc

echo -n "stuff" more stuff 形式的命令输出到大多数(但不是全部)Unix shells, 而你的 Windows 值是字符的 base64 编码

-n "x-date: Wed, 13 Oct 2021 09:30:00 GMT" openssl dgst -binary -sha256 -hmac "abc"

后跟 space、回车 return 和换行。注意添加的 dash-n-and-space 和引号(都被视为数据;CMD echo 不采用 -n 形式的选项,也不像 Unix [=48] 那样处理引号=] 做,甚至是移植的 Unix 风格的程序)以及尾随 space(CMD 在 Windows 上运行命令的方式与 shell 在 Unix 上运行命令的方式之间的区别) 和 CRLF。

如果您使用的是 Windows 10,您可以使用任何常见的 Linux 发行版安装 'Windows Subsystem for Linux' (WSL),并且使用它的方式基本上与您使用任何真正的 Unix 相同.

要在 CMD 中执行此操作,您需要像这样作弊:

c:\temp>set /p="x-date: Wed, 13 Oct 2021 09:30:00 GMT openssl dgst -binary -sha256 -hmac abc" dummy <nul | openssl base64
eC1kYXRlOiBXZWQsIDEzIE9jdCAyMDIxIDA5OjMwOjAwIEdNVCBvcGVuc3NsIGRn
c3QgLWJpbmFyeSAtc2hhMjU2IC1obWFjIGFiYw==

powershell 中可能有更好的方法,它纠正了 CMD 中的许多小缺陷和愚蠢的事情,但我还没有学到足够的东西。

但我不明白你为什么要这样做;这个值基本没什么用。您可能想要(或被告知)做的是使用给定密钥计算日期值的 SHA256-HMAC。要在 Unix(或 WSL)上执行此操作,您需要将命令更改为

echo -n "x-date: Wed, 13 Oct 2021 09:30:00 GMT" | openssl dgst -binary -sha256 -hmac "abc" | openssl base64
*****NOTICE PIPE CHARACTER ADDED HERE ----------^

但对于 CMD,您需要作弊。

最后,我安装了 WSL 并在命令行中执行:

wsl echo -n "x-date: Wed, 13 Oct 2021 09:30:00 GMT" | openssl dgst -binary -sha256 -hmac "XciGdDmDTd5a9oArnATg3d3W1OZiJD7X" | openssl base64

有效。