【问题标题】:OpenSsl generate different signatures in Windows and Linux PlatformsOpenSsl 在 Windows 和 Linux 平台上生成不同的签名
【发布时间】:2021-10-13 09:08:10
【问题描述】:

命令如下: 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: Wed, 13 Oct 2021 09:30:00 GMT" | openssl dgst -binary -sha256 -hmac "XciGdDmDTd5a9oArnATg3d3W1OZiJD7X" | openssl base64

窗户

set /p="x-date: Wed, 13 Oct 2021 09:30:00 GMT openssl dgst -binary -sha256 -hmac XciGdDmDTd5a9oArnATg3d3W1OZiJD7X" 虚拟

【问题讨论】:

    标签: openssl


    【解决方案1】:

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

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

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

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

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

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

    如果您使用的是 Windows 10,则可以将“Linux 的 Windows 子系统”(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,你需要作弊。

    【讨论】:

    • 奇怪的是,当我将“abc”替换为“XciGdDmDTd5a9oArnATg3d3W1OZiJD7X”时,结果又变了。
    【解决方案2】:

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

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

    有效。

    【讨论】:

      猜你喜欢
      • 2020-11-24
      • 2018-06-14
      • 2019-01-09
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多