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 派生的命令处理器 cmd
的 echo
命令,并且明显不同于 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
有效。
命令如下:
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 派生的命令处理器 cmd
的 echo
命令,并且明显不同于 Unix shells 通常提供的 echo
命令(尽管它 可以 变化)。具体来说,您的 Linux 值是字符
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
有效。