Următorul cod NodeJS, când rulează (v16.8.0), înregistrează 512
a stdout.
const crypto = require("cripto");
const { privateKey } = crypto.generateKeyPairSync("rsa", {
moduleLungime: 4096,
});
const sign = crypto.createSign("RSA-SHA256").update("somestringtosign");
const semnătură = sign.sign(privateKey);
console.log(semnătură.lungime); // înregistrează 512
Dacă schimb lungimea modulului în 2048
, atunci 256
este deconectat la deconectare standard.
Cred că acest lucru are sens, deoarece Specific RSA spune: semnătură, un șir de octeți de lungime k, unde k este lungimea în octeți a modulului RSA n
. Deci un hash de 256 de biți (SHA256), atunci când este semnat cu o cheie RSA cu un modul de 4096 de biți, are o ieșire de 4096 de biți (512 octeți).
Poate lungimea semnăturii în RS256 să fie într-adevăr mai mare de 256, în funcție de dimensiunea cheii RSA utilizate? Este „ciudat” să folosești un modul care este mai lung decât funcția hash folosită? Văd diverși furnizori de identitate care semnează JWT-uri într-adevăr folosesc toți modul de 2048 de biți, dar asta ar putea fi o coincidență.
(Am observat Specificații IETF pentru RS256 spune: O cheie cu dimensiunea de 2048 biți sau mai mare TREBUIE utilizată cu acești algoritmi.
deci se pare că un modul de 4096 ar fi permis de specificații)
ACTUALIZAȚI
Datorită comentariilor și răspunsurilor pe care acum înțeleg că am pus întrebarea „greșită”. Mă așteptam (în mod eronat) ca lungimea semnăturii JWT să fie egală cu lungimea rezumatului hash produs de algoritmul hash (SHA256). Am făcut confuzie biți și octeți, deoarece, de exemplu, SHA256 produce un rezumat de 256 de biți (nu octeți).Lungimea semnăturii la care am asistat în cazul meu a fost de 256 de octeți (nu de biți), ceea ce acum înțeleg că ar trebui să fie egală cu lungimea modulului cheii publice (ceea ce este într-adevăr cazul, așa cum am putut verifica mai târziu).