適用於 WebRTC 的 ECDSA:提供更好的安全性、更完善的隱私防護和效能

自 Chrome 52 起,WebRTC 會使用更有效且更安全的演算法產生憑證 (RTCCertificate):ECDSA。此外,RTC 憑證現在可以透過 IndexedDB 儲存。

RTCCertificate 是設定 WebRTC 對等互連連線時,在 DTLS 握手中使用的自行簽署憑證。(DTLS 是針對 Datagram 通訊協定 (例如 WebRTC 使用的 UDP) 的加密編譯通訊協定 TLS) 實作的一種。

一直以來,WebRTC 會使用 RSA-1024 金鑰做為憑證。這類金鑰有幾個缺點:

  • 產生 RSA-1024 金鑰時,通話設定時間可能會增加約 1000 毫秒,
  • 1024 位元 RSA 金鑰無法提供充分的加密編譯強度。

使用 RSA-1024 產生憑證的速度很慢,因此部分行動應用程式必須使用預先準備或重複使用憑證。

連線至 2048 位元 RSA 金鑰可以解決金鑰強度問題,但是這會導致通話設定延遲數秒。Chrome 52 不會變更 RSA 金鑰大小,而是導入用於憑證的 ECDSA 金鑰 (橢圓曲線數位簽章演算法)。這類金鑰與 3072 位元 RSA 金鑰幾乎一樣,不過速度好上千個,例如 ECDSA 的通話設定程序只需幾毫秒。

總而言之,ECDSA 金鑰不僅能提升安全性、隱私防護,還能改善成效,在行動裝置上更是如此。基於上述原因,我們已在「WebRTC 安全性架構」草稿中規定使用 ECDSA。

(從 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"
})

(如要進一步瞭解 generateCertificate(),請參閱 W3C 草稿)。

在 IndexedDB 中儲存 RTCCertificate

Chrome 52 的另一項改善項目:WebRTC 使用的 RTCCertificates 可以從索引資料庫儲存空間儲存及載入,而無需在工作階段之間產生新憑證。舉例來說,如果仍需使用回應式搜尋廣告,並想避免產生 RSA 的負擔,這項功能就很實用。使用 ECDSA 時,由於快取夠快,每次都會產生新的憑證,因此不需快取。

RTCCertificate IndexedDB 儲存空間已從 Firefox 出貨,並已推出於 Opera 39。

瞭解詳情