Создание JWT с ECDSA P-256 SHA-256 с PHP - PullRequest
       21

Создание JWT с ECDSA P-256 SHA-256 с PHP

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

Мне интересно, возможно ли правильно создать подпись, используя кривую P256 и PHP. OpenSSL в PHP поддерживает создание ключей и приведение правильных вещей в порядок.

Согласно этой документации - http://self -issued.info / docs / draft-jones-json-web-token-01.html # DefiningECDSA - Раздел 8.3 гласит:

JWT подписан ECDSA P-256 SHA-256 подписью следующим образом:

  1. Создание цифровой подписи представления UTF-8 для подписывающего входа JWT с использованием ECDSA P-256 SHA-256 с требуемым секретным ключом. Выходными данными будет точка EC (R, S), где R и S - целые числа без знака.
  2. Превратите R и S в байтовые массивы в порядке с прямым порядком байтов. Каждый массив будет иметь длину 32 байта.
  3. Объединить два байтовых массива в порядке R и затем S.
  4. Base64url кодирует массив из 64 байтов, как определено в этой спецификации.

Здесь проблема заключается в получении байтов R и S.

Вот пример того, что я пытаюсь сделать.

//Create Array Configuration
$config = array(
    "curve_name" => "prime256v1",
    "private_key_type" => OPENSSL_KEYTYPE_EC,
);
$ourkey = openssl_pkey_new($config);

/* We would get the key details to help extract out other information such as x/y coord 
of curve and private key but it's not necessary to show for this part*/

// Extract the private key from $res to $privKey
openssl_pkey_export($ourkey, $privKey);

$data = "Example data we will be using to sign";
$data = hash("sha256", $data);

$signature = "";
openssl_sign($data, $signature, $privKey); // Should I include the digest algo in this call as well?

Проблема здесь в том, что эта подпись - не R и S, которые я могу использовать для объединения вместе для создания реальной подписи, которая мне нужна ... Я думаю.

Итак, есть ли способ получить значения R и S из функции openssl в php?

Любая помощь очень ценится!

1 Ответ

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

Если вам нужно что-то , например JWT, но не JWT, в частности, рассмотрите PASETO .

Если вы выбрали v2, PASETO не использует ECDSA, этоиспользует более безопасный EdDSA по сравнению с Ed25519.Кроме того, стандарт выходит из-под контроля и становится скучным , так что реализации, очевидно, будут безопасными.

(Если вы выбираете v1, PASETO использует RSASSA-PSS.)

Если вам нужен , в частности, нужен JWT, посмотрите не более чем lcobucci / jwt , который, в свою очередь, использует PHPECC для ECDSA.

Давным-давно PHPECC был полон уязвимостей побочных каналов, что делало его плохим выбором для использования в производственных системах.В наши дни он настолько безопасен, насколько может быть реализована реализация ECDSA на PHP.Я написал оболочку для удобства использования под названием easy-ecc , если кто-то хочет использовать PHPECC только в самой безопасной конфигурации.

Библиотека JWT Луиса Кобуччи - единственная PHP-реализация JWT, которая, насколько мне известно, был официально проверен охранной компанией.Отчет является публичным и живет здесь .

...