【问题标题】:Problem in verifying hmac signature generated in Elixir and Python with Hashcorp vault使用 Hashicorp vault 验证 Elixir 和 Python 中生成的 hmac 签名的问题
【发布时间】:2019-03-03 16:13:53
【问题描述】:

这就是我想要做的:

  1. 我正在 Hashicorp 保险库中创建一个传输密钥,并将此传输密钥的 hmac_key 发送到我的 elixir/python 客户端。

  2. 目的是,elixir/python 客户端将使用这个 hmac_key 生成一个 hmac 摘要并将带有这个摘要的数据发送到我的应用程序。

  3. 然后,我的应用程序会将相同的数据和摘要发送到保管库,以验证摘要是否有效。

在 Vault 中生成 Transit 密钥

vault write transit/keys/key1 allow_plaintext_backup=true exportable=true

导出 HMAC KEY 发送给客户端

vault read transit/export/hmac-key/key1                                  

Key     Value
---     -----
keys    map[1:Ui9+az/p3GdAb1BZ3SJwPkauw2nyT9vm5EE2rzG1OMc=]
name    key1
type    aes256-gcm96

在 Elixir 中生成 HMAC

我使用保险库中的 HMAC KEY 来生成我的数据的 hmac

iex> secret = "Ui9+az/p3GdAb1BZ3SJwPkauw2nyT9vm5EE2rzG1OMc="
iex> data = "hello-world"
iex> :crypto.hmac(:sha256, Base.decode64!(secret), data) |> Base.encode64

"sEDTm/luPTmJ3AveP+wu8B+iXzJ89Rx43QxiWfT9ysM="

尝试使用 Vault 验证 hmac

vault write transit/verify/key1/sha2-256 input=$(base64 <<< "hello-world") hmac="vault:v1:sEDTm/luPTmJ3AveP+wu8B+iXzJ89Rx43QxiWfT9ysM="
Key      Value
---      -----
valid    false

当我期望它返回 true 时,它返回 false

使用 Vault 生成 HMAC

vault write transit/hmac/key1/sha2-256 input=$(base64 <<< "hello-world") 

Key     Value
---     -----
hmac    vault:v1:yuKdushC10olNUHfkIj3QRHnVGvQl80DUtsuKHSnfgo=

显然 Vault 生成的 hmac yuKdushC10olNUHfkIj3QRHnVGvQl80DUtsuKHSnfgo= 与 Elixir 使用相同密钥生成的 hmac ZfF4qLcMfCQ1Ns6xtUiV0grE98S9E6ywaALF2mWGKkI= 不同。

在 Python 中生成 HMAC

import hmac
import hashlib
import base64
secret = base64.b64decode("Ui9+az/p3GdAb1BZ3SJwPkauw2nyT9vm5EE2rzG1OMc=")
data = b'hello-world'
signature = hmac.new(secret, data, digestmod=hashlib.sha256)
print(base64.b64encode(signature.digest()))

# b'sEDTm/luPTmJ3AveP+wu8B+iXzJ89Rx43QxiWfT9ysM='

Python 和 Elixir 的 HMAC 对于给定的密钥是相同的。但是,Vault 中的 HMAC 不是。我在这里做错了什么?保险库是否使用不同的 HMAC KEY 来生成 HMAC?我三重检查了我在 Elixir 和 Python 脚本中是否使用了导出的 HMAC KEY。

感谢任何帮助。

谢谢

【问题讨论】:

    标签: python cryptography elixir hmac hashicorp-vault


    【解决方案1】:

    &lt;&lt;&lt; 在字符串末尾添加一个换行符。如果我手动将 \n 添加到 Elixir 中的数据,我会得到与 hashcorp-vault 相同的哈希:

    iex(1)> secret = "Ui9+az/p3GdAb1BZ3SJwPkauw2nyT9vm5EE2rzG1OMc="
    "Ui9+az/p3GdAb1BZ3SJwPkauw2nyT9vm5EE2rzG1OMc="
    iex(2)> data = "hello-world"
    "hello-world"
    iex(3)> :crypto.hmac(:sha256, Base.decode64!(secret), data <> "\n") |> Base.encode64
    "yuKdushC10olNUHfkIj3QRHnVGvQl80DUtsuKHSnfgo="
    

    您可以使用 echo -n 删除 bash 中的换行符:

    input=$(base64 <(echo -n "hello-world"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2022-11-05
      • 2020-05-17
      相关资源
      最近更新 更多