Генерация токенов JWS в эликсире - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь создать токены JWS с помощью Elixir. Что у меня есть:

  • Секретный ключ RSA
  • Базовая 64 кодировка отпечатка пальца сертификата sha256
  • Заголовок токена
  • Тело токена

Что мне нужно:

  • Жетон подписи

Заголовок JWS выглядит следующим образом

{ 
  "x5t#S256": {{ cert thumbprint }},
  "alg":"RS256"
}

Чтобы получить токен заголовка, я просто конвертировал его в base64, и он закончен. То же самое с телом токена, я просто конвертирую полезную нагрузку в base64.

Проблема в получении подписи токена. Как я понимаю, это должно быть сделано так:

token signature = base64(rsa-sha256(token header + "." + token body))

Q1: Правильна ли моя логика?

Q2: Как выполнить шифрование rsa-sha256 на Elixir? Или это то же самое, что :crypto.hash(sha256, ...)?

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Я не работал с JWS в Elixir, но я решил попробовать это как упражнение.Вы можете сгенерировать подпись JWS, используя RSA следующим образом:

rsa_private_key = JOSE.JWK.from_pem_file("rsa-2048.pem")
header = %{"alg" => "RS256"}
payload = %{"example" => "foo"}

JOSE.JWT.sign(rsa_private_key, header, payload)

Вывод:

{%{alg: :jose_jws_alg_rsa_pkcs1_v1_5},
 %{
   "payload" => "eyJleGFtcGxlIjoiZm9vIn0",
   "protected" => "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9",
   "signature" => "T2llXS2pGN-jev10Xd5EZQmaEih_dn9DIn5FJJg8ocEwIpNLupEWiNLz-5mP21z9JGpyYPFaRuq77AtKL67nP7KMDTpKKYJonOxQdL31sHU4vTKBRf-2XcVbDLGkST5dUMUWHOS106Sw_0x7DSiuFBUzkkYQ_lZKES8idVUp88Kx4uWU65Yoti0_Pu7aVLRGWDu0EiMjzuTPTBkMoib21VEVBqrJ4jiKXFudEFiNNSaV_GOH9yNZqyxwl4RhCYYT9U-Mda8Dc7xPjQk0LaJhwlaV91OhxJQHP2fGR8XkznHFlRRHTEsesYgl9OKZuSzVXoffydLc1VotphKUnG1WZQ"
 }}

И если вы хотите, чтобы в краткой форме:

JOSE.JWT.sign(rsa_private_key, header, payload) |> JOSE.JWS.compact

Производит:

{%{alg: :jose_jws_alg_rsa_pkcs1_v1_5},
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleGFtcGxlIjoiZm9vIn0.T2llXS2pGN-jev10Xd5EZQmaEih_dn9DIn5FJJg8ocEwIpNLupEWiNLz-5mP21z9JGpyYPFaRuq77AtKL67nP7KMDTpKKYJonOxQdL31sHU4vTKBRf-2XcVbDLGkST5dUMUWHOS106Sw_0x7DSiuFBUzkkYQ_lZKES8idVUp88Kx4uWU65Yoti0_Pu7aVLRGWDu0EiMjzuTPTBkMoib21VEVBqrJ4jiKXFudEFiNNSaV_GOH9yNZqyxwl4RhCYYT9U-Mda8Dc7xPjQk0LaJhwlaV91OhxJQHP2fGR8XkznHFlRRHTEsesYgl9OKZuSzVXoffydLc1VotphKUnG1WZQ"}

Вот открытый ключ, если вы хотите его проверить:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAtRPXSP1W+5sgVLeRFYrrF6L7+gaEkPOWV2FDtPL/vRQH77bicJYb
oVytE/8JyHj8kH24hxwCy2LFl5fZLaIrqYBy1B1t8LtxTRVhi3JIc76IGZ3dfxrz
Dnv94Vu9BRxE7y37f7w8ulDVlGpmJhfCIMj8SYJrFWgHlQB2u7c/B43RE6uphRfD
nr4FkJ3ChUFKhuVZHm27r5/CllHNhMejA/WawtlWKdU33In1Xp2O+GxjLKoYuGGQ
U9MdrismDtn6bVcq5K97bByxelJel2rUG4sbtQk01gVtfun63rSzOP9EkNJOoRll
YDm3HQlDUY7+D9AMG3XlQuR7tlDXQtGIJQIDAQAB
-----END RSA PUBLIC KEY-----
0 голосов
/ 17 марта 2019

см. Этот пример на JWT Auth с эликсиром на Фениксе

с использованием :bcrypt_elixir и :guardian

...