Score:0

ความยาวลายเซ็นของ RS256 ขึ้นอยู่กับขนาดของคีย์ RSA ที่ใช้ในการเซ็นชื่อหรือไม่

ธง th

รหัส 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 ไบต์ (ไม่ใช่บิต) ซึ่งตอนนี้ฉันเข้าใจแล้วว่าควรเท่ากับความยาวของโมดูลัสของคีย์สาธารณะ (ซึ่งเป็นกรณีที่ฉันสามารถตรวจสอบได้ในภายหลัง)

kelalaka avatar
in flag
เรามีคำถามมากมายเกี่ยวกับเรื่องนี้ ลายเซ็น RSA ต้องการการเติมเพื่อความปลอดภัย นั่นคือ RSA-PSS (ค้นหา RSA Probabilistic Signature Scheme) และยังมีลายเซ็น RSA-FDH (RSA-Full Domain Hash) และปลอดภัยอีกด้วย ในกรณีนี้ คุณต้องใช้ RSA-2048 เป็นอย่างน้อยและฟังก์ชันแฮชที่สามารถส่งออก ~2047 บิต เช่น Shake128 ของ SHA3
dave_thompson_085 avatar
cn flag
SHA-256 เป็นแฮช 256-BIT = 32 ไบต์ ไม่ใช่ 256 ไบต์ ข้อมูลการเข้ารหัสส่วนใหญ่จะอธิบายเป็นบิต ไม่ใช่ไบต์ แม้ว่า PKCS1 (nd JOSE) จะสนับสนุนเฉพาะ _multiple_ ของไบต์ (อย่างเป็นทางการคือ octet) ที่ 8 บิต ในการเป็น _secure_ โมดูลัส RSA จะต้องใหญ่กว่าที่จำเป็นสำหรับแฮช -- SHA-256 ให้ความแรง 128 บิต แต่จำเป็นต้องใช้ RSA-3072 เพื่อจับคู่ (และบางคนใช้ 4096 เพราะมันดูดีกว่า) ดู https://www.keylength.com และคำถามมากมายที่มีอยู่มากมาย
th flag
ขอบคุณ @dave_thompson_085! ฉันแก้ไขและเปลี่ยนไบต์เป็นบิตในการอ้างอิงแฮช
Score:4
ธง ng

ความยาวลายเซ็นใน RS256 สามารถยาวกว่า 256 ได้จริงหรือไม่ ขึ้นอยู่กับขนาดของคีย์ RSA ที่ใช้

ใช่. ใน RSA (รวมถึง RS256 ซึ่งก็คือ RSASSA-PKCS1-v1_5 ด้วย SHA-256 เป็นแฮช) ขนาดลายเซ็นขึ้นอยู่กับขนาดของคีย์ RSA (อันที่จริงคือโมดูลัสสาธารณะ) ที่ใช้สำหรับการเซ็นชื่อ โดยเฉพาะอย่างยิ่ง ขนาดลายเซ็น (เป็นไบต์ ก่อนเข้ารหัสใหม่เป็นข้อความ) คือขนาดคีย์ (เป็นบิต) หารด้วย 8 และปัดขึ้นเป็นจำนวนเต็มถัดไป $\lceil 2048/8\rceil=256$ ไบต์ $\lceil 4096/8\rceil=512$ ไบต์

มัน "แปลก" ไหมที่จะใช้โมดูลัสที่ยาวกว่าฟังก์ชันแฮชที่ใช้?

ไม่ นั่นเป็นสิ่งที่จำเป็นด้วยซ้ำ จากมุมมองการจัดรูปแบบ ขนาดลายเซ็นขั้นต่ำสำหรับ RSASSA-PKCS1-v1_5 พร้อม SHA-256 จะเป็น $2+8+1+19+32=62$ ไบต์ซึ่งเป็นโมดูลัสสาธารณะ 489 บิต นั่นจะเล็กเกินไปที่จะปลอดภัย 2048 บิตถือเป็นพื้นฐานสำหรับแอปพลิเคชันใหม่ คาดว่าจะให้การรักษาความปลอดภัย 112 บิตถึง 128 บิตกับคอมพิวเตอร์แบบดั้งเดิม เทียบได้กับการต้านทานการชนกันของแฮช 224 บิตหรือ 256 บิต ดู นี้ สำหรับคำแนะนำเกี่ยวกับขนาดคีย์ และ นี้ สำหรับสถานะของการโจมตีด้วยการแยกตัวประกอบ

ฉันไม่ทราบขีดจำกัดบนมาตรฐาน และฉันไม่เห็นเหตุผลใดที่การใช้งานจะไม่สนับสนุนลายเซ็นอย่างน้อย 2048 ไบต์ (16384 บิต)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา