ECDSA สำหรับ WebRTC - การรักษาความปลอดภัยที่ดียิ่งขึ้น ความเป็นส่วนตัวที่ดีขึ้น และประสิทธิภาพที่ดีขึ้น

จาก Chrome 52 นั้น WebRTC ใช้อัลกอริทึมที่มีประสิทธิภาพและปลอดภัยกว่าในการสร้างใบรับรอง (RTCCertificate) ซึ่งก็คือ ECDSA นอกจากนี้ ยังสามารถจัดเก็บ RTCCertificates กับ IndexedDB

RTCCertificates คือใบรับรองแบบ Self-signed ซึ่งใช้ในแฮนด์เชค DTLS เมื่อตั้งค่าการเชื่อมต่อเพียร์ WebRTC (DTLS คือการใช้โปรโตคอล TLS เข้ารหัสสำหรับโปรโตคอล Datagram เช่น UDP ที่ WebRTC ใช้)

ก่อนหน้านี้ WebRTC ใช้คีย์ RSA-1024 สำหรับใบรับรอง คีย์เหล่านี้มีข้อเสียหลายประการดังนี้

  • การสร้างคีย์ RSA-1024 จะเพิ่มเวลาการตั้งค่าการโทรได้สูงสุดประมาณ 1,000 มิลลิวินาที
  • คีย์ RSA แบบ 1024 บิตมีความรัดกุมในการเข้ารหัสไม่เพียงพอ

เนื่องจากการสร้างใบรับรองด้วย RSA-1024 นั้นดำเนินการช้า แอปบนอุปกรณ์เคลื่อนที่บางแอปจึงต้องเตรียมใบรับรองล่วงหน้าหรือนำใบรับรองมาใช้ซ้ำ

ปัญหาความรัดกุมของคีย์สามารถแก้ไขได้โดยไปที่คีย์ RSA แบบ 2048 บิตขึ้นไป แต่จะทำให้การตั้งค่าการโทรล่าช้าออกไปอีกหลายวินาที Chrome 52 จะใช้คีย์ ECDSA (Elliptic Curve Digital Signature Algorithm) ในใบรับรองแทนการเปลี่ยนขนาดคีย์ RSA ซึ่งมีความรัดกุมเทียบเท่ากับคีย์ RSA แบบ 3072 บิต แต่รวดเร็วขึ้นหลายพันเท่า กล่าวคือ ค่าใช้จ่ายในการตั้งค่าการโทรด้วย ECDSA ใช้เวลาเพียงไม่กี่มิลลิวินาที

สรุปก็คือ คีย์ ECDSA หมายถึงการรักษาความปลอดภัยที่ดีขึ้น ความเป็นส่วนตัวที่ดีขึ้น และประสิทธิภาพที่ดีขึ้น โดยเฉพาะอย่างยิ่งบนอุปกรณ์เคลื่อนที่ ด้วยเหตุนี้ ECDSA จึงได้รับการกำหนดตามร่างสถาปัตยกรรมความปลอดภัยของ WebRTC

จาก Chrome 47 คุณจะเลือกใช้ ECDSA ได้โดยทำดังนี้

// or webkitRTCPeerConnection
RTCPeerConnection.generateCertificate({
    name: "ECDSA",
    namedCurve: "P-256"
}).then(function(certificate) {
    var pc = new RTCPeerConnection({..., certificates: [certificate]});
});

จาก Chrome 52 แม้ว่า ECDSA จะเปิดใช้โดยค่าเริ่มต้น แต่คุณยังคงเลือกสร้างใบรับรอง RSA ได้ โดยทำดังนี้

pc.generateCertificate({
    name: "RSASSA-PKCS1-v1_5",
    modulusLength: 2048,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: "SHA-256"
})

(โปรดดูฉบับร่าง W3C เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ generateCertificate())

การจัดเก็บ RTCCertificate ใน IndexedDB

การปรับปรุงอีกอย่างหนึ่งใน Chrome 52 คือ RTCCertificates ที่ใช้โดย WebRTC สามารถบันทึกและโหลดจากพื้นที่เก็บข้อมูล IndexedDB โดยไม่จำเป็นต้องสร้างใบรับรองใหม่ระหว่างเซสชัน ซึ่งอาจเป็นประโยชน์ ตัวอย่างเช่น ในกรณีที่คุณจำเป็นต้องใช้ RSA และต้องการหลีกเลี่ยงโอเวอร์เฮดการสร้าง RSA เมื่อใช้ ECDSA คุณไม่จำเป็นต้องแคชเพราะเร็วพอที่จะสร้างใบรับรองใหม่ทุกครั้ง

เราได้จัดส่งพื้นที่เก็บข้อมูล RTCCertificate IndexedDB แล้วใน Firefox และอยู่ใน Opera 39

ดูข้อมูลเพิ่มเติม