รหัส NodeJS ต่อไปนี้เมื่อรัน (v16.8.0) บันทึก 512
เพื่อความแข็งแกร่ง
const crypto = ต้องการ ("crypto");
const { privateKey } = crypto.generateKeyPairSync("rsa", {
โมดูลัสความยาว: 4096,
});
เครื่องหมาย const = crypto.createSign("RSA-SHA256").update("somestringtosign");
ลายเซ็น const = sign.sign (คีย์ส่วนตัว);
console.log(ลายเซ็น.ความยาว); // บันทึก 512
ถ้าฉันเปลี่ยนความยาวโมดูลัสเป็น 2048
, แล้ว 256
เข้าสู่ระบบมาตรฐานออก
ฉันเดาว่ามันสมเหตุสมผลแล้วในขณะที่ ข้อมูลจำเพาะ RSA พูดว่า: ลายเซ็น สตริงออคเต็ตที่มีความยาว k โดยที่ k คือความยาวในออคเต็ตของโมดูลัส RSA n
. ดังนั้นแฮช 256 บิต (SHA256) เมื่อลงนามด้วยคีย์ RSA ที่มีโมดูลัส 4096 บิต จะมีเอาต์พุต 4096 บิต (512 ไบต์)
ความยาวลายเซ็นใน RS256 สามารถยาวกว่า 256 ได้จริงหรือไม่ ขึ้นอยู่กับขนาดของคีย์ RSA ที่ใช้ มัน "แปลก" ไหมที่จะใช้โมดูลัสที่ยาวกว่าฟังก์ชันแฮชที่ใช้? ฉันเห็นผู้ให้บริการข้อมูลประจำตัวหลายรายที่ลงชื่อ JWT ล้วนใช้โมดูลัส 2048 บิต แต่นั่นอาจเป็นเรื่องบังเอิญ
(ผมสังเกตว่า ข้อมูลจำเพาะ IETF สำหรับ RS256 พูดว่า: ต้องใช้คีย์ขนาด 2048 บิตหรือใหญ่กว่ากับอัลกอริทึมเหล่านี้
เห็นได้ชัดว่าโมดูลัสของ 4096 จะได้รับอนุญาตจาก spec')
อัปเดต
ขอบคุณความคิดเห็นและคำตอบ ตอนนี้ฉันเข้าใจแล้วว่าฉันถามคำถาม "ผิด" ฉัน (ผิดพลาด) คาดว่าความยาวของลายเซ็นของ JWT จะเท่ากับความยาวของการย่อยแฮชที่ผลิตโดยอัลกอริทึมแฮช (SHA256) ฉันสับสนบิตและไบต์เพราะเช่น SHA256 สร้างการย่อย 256 บิต (ไม่ใช่ไบต์)ความยาวลายเซ็นที่ฉันเห็นในกรณีของฉันคือ 256 ไบต์ (ไม่ใช่บิต) ซึ่งตอนนี้ฉันเข้าใจแล้วว่าควรเท่ากับความยาวของโมดูลัสของคีย์สาธารณะ (ซึ่งเป็นกรณีที่ฉันสามารถตรวจสอบได้ในภายหลัง)