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

  • 本文关键字:Windows Linux 平台 OpenSsl openssl
  • 更新时间 :
  • 英文 :


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

窗口中的结果:LW4gIngtZGF0ZTogV2VkLCAxMyBPY3QgMjAyMSAwOTozMDowMCBHTVQiIG9wZW5zc2wgZGdzdCAtYmluYXJ5IC1zaGEyNTYgLWhtYWMgImFiYyIgDQo=

Linux中的结果:eC1kYXRlOiBXZWQsIDEzIE9jdCAyMDIxIDA5OjMwOjAwIEdNVCBvcGVuc3NsIGRnc3QgLWJpbmFyeSAtc2hMjU2IC1obWFjIGFiYw==

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

非常感谢。


替换";abc";用";XciGdDmDTd5a9oArnATg3d3W1OZiJD7X";

Linux

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

Windows

set/p=";x日期:2021年10月13日星期三09:30:00 GMT openssl dgst-binary-sha256-hmac XciGdDmDTd5a9oArnATg3d3W1OZiJD7X";伪<nul|openssl base64

首先,这似乎根本不是编程,很可能已经关闭,因为主题性在过去一两年里变得相当严格。

其次,您在这里没有创建任何类型的签名。您只是对一个字符串进行base64编码,而该字符串在两个系统上是不同的,因为在Windows上,您使用的是命令处理器cmdecho命令,该命令源自MSDOS,与通常由Unix shell提供的echo命令明显不同(尽管它可能不同)。具体来说,您的Linux值是字符的base64编码

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

其通过形式CCD_ 5的命令输出到大多数(但不是所有)Unix外壳,而您的Windows值是字符的base64编码

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

然后是空格、回车和换行。请注意添加的dash-n-and-space和引号(两者都被视为数据;CMDecho不采用-n形式的选项,也不像Unix shell或移植的Unix风格程序那样处理引号)以及尾部空格(CMD在Windows上运行命令的方式与shell在Unix上运行命令方式之间的差异)和CRLF。

如果你在Windows 10上,你可以安装"Windows Linux子系统"(WSL)和任何常见的Linux发行版,并以与任何真正的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

它有效。

最新更新