Puncte:0

Lungimea semnăturii RS256 depinde de dimensiunea cheii RSA utilizate pentru semnare?

drapel th

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).

kelalaka avatar
drapel in
Ei bine, avem o mulțime de întrebări despre asta. Semnătura RSA necesită umplutură pentru a fi sigură, adică RSA-PSS (căutați RSA Probabilistic Signature Scheme). Și, de asemenea, există semnătura RSA-FDH (RSA-Full Domain Hash) și aceasta este, de asemenea, sigură. În acest caz, aveți nevoie de cel puțin RSA-2048 și o funcție hash care poate fi scoasă la ~2047 de biți, cum ar fi Shake128 de SHA3.
dave_thompson_085 avatar
drapel cn
SHA-256 este un hash de 256 de biți = 32 de octeți, nu 256 de octeți. Majoritatea datelor criptografice sunt descrise în biți, nu în octeți, deși PKCS1 (și JOSE) acceptă doar _multiplii_ ai unui octet (formal octet) de 8 biți. Pentru a fi _securizat_, modulul RSA trebuie să fie mult mai mare decât este necesar pentru hash -- SHA-256 oferă putere de 128 de biți, dar este necesar RSA-3072 pentru a se potrivi (și unii oameni fac 4096 pentru că arată mai frumos). Consultați https://www.keylength.com și multe zeci de întrebări existente.
drapel th
Mulțumesc @dave_thompson_085! Am editat și schimbat octeții în bit în referința hash.
Puncte:4
drapel ng

Poate lungimea semnăturii în RS256 să fie într-adevăr mai mare de 256, în funcție de dimensiunea cheii RSA utilizate?

Da. În RSA (inclusiv RS256, adică RSASSA-PKCS1-v1_5 cu SHA-256 ca hash), dimensiunea semnăturii depinde de dimensiunea cheii RSA (de fapt, este modul public) utilizată pentru semnare. Mai exact, dimensiunea semnăturii (în octeți, înainte de re-codificare ca text) este dimensiunea cheii (în biți), împărțită la 8 și rotunjită la următorul întreg. $\lceil 2048/8\rceil=256$ octeți. $\lceil 4096/8\rceil=512$ octeți.

Este „ciudat” să folosești un modul care este mai lung decât funcția hash folosită?

Nu. Asta chiar este necesar. Din punct de vedere al formatării, dimensiunea minimă a semnăturii pentru RS256 (RSASSA-PKCS1-v1_5 cu SHA-256) ar fi $2+8+1+19+32=62$ octeți, adică un modul public de 489 de biți. Ar fi mult prea mic pentru a fi sigur, totuși. 2048 de biți este considerată linia de bază pentru noile aplicații. Este de așteptat să ofere securitate de la 112 la 128 de biți împotriva computerelor clasice, comparabilă cu rezistența la coliziune a unui hash de 224 de biți sau 256 de biți. Vedea acest pentru recomandări privind dimensiunea cheii și acest pentru statutul atacurilor de factorizare.

Nu cunosc o limită superioară standard și nu văd niciun motiv pentru ca o implementare să nu accepte semnături de cel puțin 2048 de octeți (16384 de biți).

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.