Это то, что я пытаюсь сделать:
Я создаю транзитный ключ в хранилище Hashicorp и отправляю ключ hmac_key этого транзитного ключа моему клиенту elixir / python.
Предполагается, что клиент elixir / python будет использовать этот ключ hmac_key для создания дайджеста hmac и отправки данных с этим дайджестом в мое приложение.
Затем мое приложение отправит те же данные и дайджест в хранилище, чтобы проверить, действителен ли дайджест.
Создание ключа переходав хранилище
vault write transit/keys/key1 allow_plaintext_backup=true exportable=true
Экспорт ключа HMAC для отправки клиенту
vault read transit/export/hmac-key/key1
Key Value
--- -----
keys map[1:Ui9+az/p3GdAb1BZ3SJwPkauw2nyT9vm5EE2rzG1OMc=]
name key1
type aes256-gcm96
Создание HMAC в Elixir
Я использую ключ HMAC из хранилища для создания hmac моих данных
iex> secret = "Ui9+az/p3GdAb1BZ3SJwPkauw2nyT9vm5EE2rzG1OMc="
iex> data = "hello-world"
iex> :crypto.hmac(:sha256, Base.decode64!(secret), data) |> Base.encode64
"sEDTm/luPTmJ3AveP+wu8B+iXzJ89Rx43QxiWfT9ysM="
Попытка проверить hmac с помощью Vault
vault write transit/verify/key1/sha2-256 input=$(base64 <<< "hello-world") hmac="vault:v1:sEDTm/luPTmJ3AveP+wu8B+iXzJ89Rx43QxiWfT9ysM="
Key Value
--- -----
valid false
Возвращает false
когда я ожидаю, что он вернется true
.
Использование 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=
, используя тот же ключ.
Генерация HMAC в Python
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='
HMAC из Python и Elixir одинаковы для данного ключа,Однако HMAC от Vault нет.Что я здесь не так делаю?Использует ли хранилище другой ключ HMAC для создания HMAC?Я трижды проверил, что я использую экспортированный ключ HMAC в своем скрипте Elixir и Python.
Любая помощь приветствуется.
Спасибо