这就是我正在尝试做的事情:
我正在 Hashicorp 金库中创建一个传输 key ,并将该传输 key 的 hmac_key 发送到我的 elixir/python 客户端。
其目的是,elixir/python 客户端将使用此 hmac_key 生成 hmac 摘要,并将带有此摘要的数据发送到我的应用程序。
然后,我的应用程序会将相同的数据和摘要发送到保管库,以验证摘要是否有效。
在 Vault 中生成运输 key
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=
与使用相同 key 的 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='
对于给定的 key ,Python 和 Elixir 的 HMAC 是相同的。然而,Vault 的 HMAC 则不然。我在这里做错了什么?保管库是否使用不同的 HMAC key 来生成 HMAC?我三次检查我是否在 Elixir 和 Python 脚本中使用导出的 HMAC KEY。
感谢任何帮助。
谢谢
最佳答案
<<<
在字符串末尾添加换行符。如果我手动添加 \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"))
关于python - 使用 HashicorpVault 验证 Elixir 和 Python 中生成的 hmac 签名时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52542201/