Проблема с проверкой подписи hmac, созданной в Elixir и Python с помощью хранилища Hashcorp - PullRequest
0 голосов
/ 27 сентября 2018

Это то, что я пытаюсь сделать:

  1. Я создаю транзитный ключ в хранилище Hashicorp и отправляю ключ hmac_key этого транзитного ключа моему клиенту elixir / python.

  2. Предполагается, что клиент elixir / python будет использовать этот ключ hmac_key для создания дайджеста hmac и отправки данных с этим дайджестом в мое приложение.

  3. Затем мое приложение отправит те же данные и дайджест в хранилище, чтобы проверить, действителен ли дайджест.

Создание ключа переходав хранилище

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.

Любая помощь приветствуется.

Спасибо

1 Ответ

0 голосов
/ 27 сентября 2018

<<< добавляет символ новой строки в конец строки.Если я вручную добавлю \n к данным в Elixir, я получу тот же хеш, что и hashicorp-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="

Вы можете удалить новую строку в bash, используя echo -n:

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