Node.js: проверка подписи (PS256) успешно выполняется в Node.js, но не выполняется в отладчике jwt.io - PullRequest
0 голосов
/ 21 февраля 2019

Я написал тестовый сценарий, с помощью которого я подписываю, а затем проверяю JWT с помощью алгоритма PS256.

Мой код успешно проверяет JWT, но в jwt.io * проверка не удалась1004 * отладчик.

Я использую jws@3.2.1.

Это происходит только при использовании алгоритма PS256, а не при использовании, например, RS256.

Я что-то не так делаю?

Я сгенерировал ключи с помощью:

openssl genpkey -algorithm RSA -out private_key2.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -pubout -in private_key2.pem -out public_key2.pem

Вы можете попробовать мой код на repl.it: https://repl.it/@SamArtuso/Nodejs-Signature-verification-PS256-succeeds-in-Nodejs

Код:

const { join } = require('path');
const { readFileSync } = require('fs');
const jws = require('jws');

const ALG = 'PS256';

/**********
 * SIGNING
 **********/

const PRIVATE_KEY_PATH = join(__dirname, './keys/private_key2.pem');

const privateKey = readFileSync(PRIVATE_KEY_PATH).toString();

const payload = {
  foo: 'bar',
};

const token = jws.sign({
  header: { alg: ALG },
  payload,
  privateKey,
})

console.log('Token:');
console.log(token);

/************
 * VERIFYING
 ************/

const PUBLIC_KEY_PATH = join(__dirname, './keys/public_key2.pem');

const publicKey = readFileSync(PUBLIC_KEY_PATH).toString();

const result = jws.verify(token, ALG, publicKey);
if (result) {
  console.log('Verification successful.');
} else {
  console.error('Verification failed.');
}

Закрытый ключ:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDPR8CD/9V9fddR
vMk590JtuU4hPT9iPD/mYeWdvUTbkN2iPpg6LDADBntz8I9CzThCkgHmDQhh49Qz
AONiHfyHhKT6HHIBS78wGWfhE9ueFtkv19xisvFJTDO6IllGFMiioj8AkvOJwaY+
5ZKSFG32V0gMaglNSNTOh5KK6DsxgdH2KfMzn6uFwJkvsz1qwPiINu/rqvOQPOIK
JCbNHBOg/SvhPWBSEFDC9AkLm3ajhGAcnSlWi0KgUFz7iHuUR6s4GLdkc40uAooY
ExEWsZyoByT18tXln2hPAvE1Ata2PSbtLHuwvMQt4vzZi80K4BXqOiqvNMo1A1aT
oSQnmOwtAgMBAAECggEAPpHTPEVS5aHCCItrVtMbu1FvkzsQ0g+L3nh4vqfujDTr
olkwzIagK5meVH4uUKTwMbAvYIlYmWwTlx3ShcC1hRb2UgWaKGf8G4HfyKKc7djJ
0NZhUW3gxhZ5mttZhX0qn2VIjVzOpSvOijf0iaIfG3h3aD/t9OViT8G+6610iNmz
Oygmi9kQaBAS2A2sLSSMhdyddIPEpZ8QOHwGCRvBXWO100BCV9ROQzYxW+U9VPaJ
I0tXDL1L1H7y1EbxccPfOsfUPMtF9LQWQZ6ksJuSRwkBAnfKpzexguph29sLDjCQ
X23rQN/NwiU+zRmn+cW7VqkZsbSqucP9t+d19UdWpQKBgQDn9sThxAZvx4OS0noD
AWJX5CliDNlagmLqr4c0QoYI+fPL7FcK9tQYUZ869jnebX7UPHTuDhMoIvWknZbB
QhoogpRoX+XFtxzPwjtBBGc5TYacYnOR4xPSjvDlIrY7FQiH8TgpAGzenSBiD8O0
xW4zSaHLUDHEMFEyPq8tdMmBewKBgQDkwjUnVMPlA9AOD+KQNXgf2kV9z0ZA5idt
9WcsXsxpO2W6S0ntkr29Yr3VuuuJTRH7Fm+bPDJ6C1bfZ746hn3iLMZbMxgGVEf/
cN0nNXjfG5G7EEIU9WFges1I5rec/5W38kIco6soP36Qj5HcUBXt6AHy3k1IbEL2
84Bp1SZ0dwKBgF19mhCcXzPCKAePCVoYvrhJ31wDbb8K+i84m7e2cCtCAr7X/KUQ
op9Clni/MMezPgDwdPhVd+cfX/3+/fnaWIynRIVk0UkE6nnaAOPNkIUJ+A0jqQzN
hvnAXtsbSHM7oPqZgFcWMsrubVTYobpEMIw/SxSUt9oo1zD3Dse1YFntAoGBAIAL
AIuKU7f9gVhNpehINXvGxfzcpxsueEWBBgX87fe9CnzTJYc4CsJV4aIfZTVOEVF0
xnWipTJQ5IhZ3k2N+CpAG6ryl3D7fe1J9E+9C3H+UXzeZc6rZp0FP6Cdm4riOKBk
loLHTcdSevpZkjA6F3w5z9Vsft+Z0YW+2FLkvwiTAoGAdjUYcGTaEhGNtHQszAeY
2VbeVHwgnajKhaZpKMNTVp/AFgeS5k1lSATlT5wQHD3OAhUn+NAEwUOUBBWOpg+i
jML8loplEcVmdHkfGFsrIvzFFIIXQOWy77s/McTCh2jLkLYO8kIOrGy08JBiZnQ/
Ki/HFS/2yaUbG6UdH8FFp2g=
-----END PRIVATE KEY-----

Открытый ключ:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz0fAg//VfX3XUbzJOfdC
bblOIT0/Yjw/5mHlnb1E25Ddoj6YOiwwAwZ7c/CPQs04QpIB5g0IYePUMwDjYh38
h4Sk+hxyAUu/MBln4RPbnhbZL9fcYrLxSUwzuiJZRhTIoqI/AJLzicGmPuWSkhRt
9ldIDGoJTUjUzoeSiug7MYHR9inzM5+rhcCZL7M9asD4iDbv66rzkDziCiQmzRwT
oP0r4T1gUhBQwvQJC5t2o4RgHJ0pVotCoFBc+4h7lEerOBi3ZHONLgKKGBMRFrGc
qAck9fLV5Z9oTwLxNQLWtj0m7Sx7sLzELeL82YvNCuAV6joqrzTKNQNWk6EkJ5js
LQIDAQAB
-----END PUBLIC KEY-----

Редактировать: Разъяснения о том, как воспроизвести мою проблему.

  1. Запустите мой скрипт с: npm init -f && npm install jws && node test.js
  2. Сценарий выведет токен и Verification successful.
  3. Скопируйте и вставьте токен в поле «Кодированный»поле в jwt.io
  4. Скопируйте и вставьте открытый ключ в поле «Открытый ключ или сертификат».
  5. Внизу появляется красное сообщение «Недопустимая подпись».

Тниже приведен пример токена, который сгенерирует мой скрипт.Помните, что PS256 имеет вероятностную , а не детерминированную подпись, поэтому подпись будет отличаться при каждом запуске сценария.

eyJhbGciOiJQUzI1NiJ9.eyJmb28iOiJiYXIifQ.Rn6i-94ovuKOVRc2jzLVS40MpMmBkIfkyvF56JK3tM8wvg-DW943NNbXf01bhRdyoUj0A73NSQtz0kB4WfXN1uAH1omzNr0ww-iTfC23AX0OcjbsE7CcDz_ZQWWOzwEGGFVfV9ez5yn1pKRYVdFaKqApk3irP-ej_WGrrJfgeZVs683lNk0WjKOYhj6vsryuz52c0OEJ0UmYy7hSSfL38jgL6bdE0awg2DgiaU6qszZEkMjSnugoMobeAUUyOiXHsR79NryuhCQko-I9P1vKd1dEA3zM1iut5sW5FwB8K9Fi49gaQy0zHk72txJvUWdxW5ns0Svft3qLke5XMuqm2g

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Я попытался скопировать и вставить ваш токен, ваш открытый ключ и ваш закрытый ключ в отладчик jwt.io.Вот мои выводы:

  1. Если вы только вставляете токен, токен декодируется правильно, но подпись не может быть проверена (что очевидно).
  2. Если вы тогдавставьте открытый ключ (которого должно быть достаточно для проверки подписи), подпись все еще не может быть проверена.Это странно ?
  3. Если затем вставить также закрытый ключ (который не требуется для проверки подписи), подпись будет действительной.

Итак, очевидно, все сводится к вопросу, почему подпись токена может быть проверена, только если предоставлен закрытый ключ ...

Это привело меня к предположению, что каким-то образом закрытый ключ и открытый ключ нене соответствуют друг другу.Поэтому я попытался восстановить (или, лучше сказать, извлечь) открытый ключ из предоставленного вами закрытого ключа и сравнить его с открытым ключом, который вы предложили.Итак, я вставил ваш закрытый ключ в файл с именем privateKey.pem и выполнил следующую команду:

$ openssl rsa -in privateKey.pem -pubout

Это дало мне следующий открытый ключ:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz0fAg//VfX3XUbzJOfdC
bblOIT0/Yjw/5mHlnb1E25Ddoj6YOiwwAwZ7c/CPQs04QpIB5g0IYePUMwDjYh38
h4Sk+hxyAUu/MBln4RPbnhbZL9fcYrLxSUwzuiJZRhTIoqI/AJLzicGmPuWSkhRt
9ldIDGoJTUjUzoeSiug7MYHR9inzM5+rhcCZL7M9asD4iDbv66rzkDziCiQmzRwT
oP0r4T1gUhBQwvQJC5t2o4RgHJ0pVotCoFBc+4h7lEerOBi3ZHONLgKKGBMRFrGc
qAck9fLV5Z9oTwLxNQLWtj0m7Sx7sLzELeL82YvNCuAV6joqrzTKNQNWk6EkJ5js
LQIDAQAB
-----END PUBLIC KEY-----

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

Итак, я начал искать в Интернете и нашел это сообщение в блоге от Auth0где они описывают введение поддержки алгоритмов PS*, но согласно документации все должно работать как положено.Хм, более странно ?

Итак, следующее, что я попробовал, было зашифровать вещи с помощью отладчика jwt.io, используя декодированные значения вашего токена, с алгоритмом PS256 и предоставленным вами закрытым ключом.Это привело меня к этому знак:

1033 * eyJhbGciOiJQUzI1NiJ9.eyJmb28iOiJiYXIifQ.wzkD7q5lH_qJw_V6DJLk72TDqpzA05KN3XHfEFOeAQgCriodoOLrgQ-p3ifIzK525puiV1hnXQuJ-6TEZRqiO8dqlPWQJbG1mLdTTx7ZwdUKsDjY6CMsmsskU8eVrzfaSDVmGvbjaWKq1_KGvtk4vMT0Z9m_YhUjD_SDVbCaZReEbzxta4APM7dMQ5mRFzD03JTwe05_AqayrfXdTungeBEJcMB0tY_4FjWiKbBZOpyQLebzPJ69VgpQFGvf6fPuKT6_3LTEHPrRNFL05OYpgRvayh3pEAF297aSCQ_SFi9slqDdVKkor-q8UDO-zM7J952uCkr7NkXV0Loq62_gMg 1035 * Если вы вставляете это лексема в отладчик jwt.io, ииспользуйте ваш открытый ключ, тогда подпись действительна.Итак, в основном PS256, кажется, работает с jwt.io, но по какой-то причине не для вашего токена ...

Это, наконец, приводит меня к мысли, что, возможно, Node.js и jwt.io действительно используют разные способызапустить алгоритм PS256.Конечно, поскольку это стандарт, оба должны работать одинаково, но, очевидно, они не работают.Я не знаю, кто из них делает это неправильно, или, если хорошо, что оба работают по-разному, так как раньше мне никогда не приходилось иметь дело с PS256.

Мне очень жаль, что у меня нетлучше ответить здесь, но я думаю, что единственный способ выяснить настоящую причину - это отладить криптографический код Node.js и взглянуть на исходный код jwt.io (который не является общедоступным, посколькуЯ знаю).

С моей точки зрения, то, что вы делаете, правильно, и я предпочел бы предположить, что это ошибка либо в Node.js, либо в jwt.io, либо в обоих ?

PS: После написания этого ответа я обнаружил эту проблему , и я предполагаю, что первоначальный автор - это вы (не так ли?), И ответ там в основном приходит к тому же выводу, чтоэто проблема сайта.Так что, возможно, это действительно лучший ответ, который вы можете получить.

0 голосов
/ 26 февраля 2019

Убедитесь, что вы правильно копируете ключи.

https://jwt.io/ требует, чтобы вы скопировали включающие теги BEGIN и END

----- НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ -----

----- КОНЕЦ ОБЩЕСТВЕННОГО КЛЮЧА -----

enter image description here

...