【发布时间】:2019-07-15 07:25:03
【问题描述】:
我编写了一个测试脚本,我用它来签名,然后使用 PS256 算法验证 JWT。
我的代码验证 JWT 成功,但在 jwt.io 调试器中验证失败。
我正在使用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-----
编辑:说明如何重现我的问题。
- 运行我的脚本:
npm init -f && npm install jws && node test.js - 脚本将输出令牌和
Verification successful. - 将令牌复制并粘贴到 jwt.io 的“编码”字段中
- 将公钥复制并粘贴到“公钥或证书”字段中。
- 底部会出现一条红色的“无效签名”消息。
以下是我的脚本将生成的令牌示例。请记住,PS256 具有 概率 而不是 确定性 签名,因此每次运行脚本时签名都会有所不同。
eyJhbGciOiJQUzI1NiJ9.eyJmb28iOiJiYXIifQ.Rn6i-94ovuKOVRc2jzLVS40MpMmBkIfkyvF56JK3tM8wvg-DW943NNbXf01bhRdyoUj0A73NSQtz0kB4WfXN1uAH1omzNr0ww-iTfC23AX0OcjbsE7CcDz_ZQWWOzwEGGFVfV9ez5yn1pKRYVdFaKqApk3irP-ej_WGrrJfgeZVs683lNk0WjKOYhj6vsryuz52c0OEJ0UmYy7hSSfL38jgL6bdE0awg2DgiaU6qszZEkMjSnugoMobeAUUyOiXHsR79NryuhCQko-I9P1vKd1dEA3zM1iut5sW5FwB8K9Fi49gaQy0zHk72txJvUWdxW5ns0Svft3qLke5XMuqm2g
【问题讨论】:
-
请不要将此问题标记为重复。它的独特之处在于它特定于 PS256 算法。
-
所以您阅读了可能重复的问题和答案,对吧?!但是您并没有告诉我们,您在 jwt.io 上究竟做了什么,因为在大多数情况下,人们只是忘记在 jwt.io 上上传密钥。如果你能准确地告诉我们你在那里做了什么会更容易。
-
是的,我确实检查了潜在的重复项,但没有一个符合我的问题。我复制了我的令牌并将其粘贴到 jwt.io 上。我还将我的公钥粘贴到 jwt.io 上的相应字段中。我将更新问题的文本以反映这一点。任何人都应该能够重现我所做的。
-
那么请在问题中也显示你的token,以便人们可以尝试。
-
好的,我会这样做的。