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

自 Chrome 52 起,WebRTC 會使用效率和安全性都更高的演算法 (ECDSA) 產生憑證 (RTCCertificate)。此外,RTCCertificates 現已可透過 IndexedDB 儲存。

RTC 憑證是指在設定 WebRTC 對等連線時,DTLS 握手程序中使用的自行簽署憑證。(DTLS 是用於資料元協定的密碼編譯通訊協定 TLS 的實作方式,例如 WebRTC 使用的 UDP)。

直到最近,WebRTC 才開始使用 RSA-1024 金鑰建立憑證。這些鍵有幾個缺點:

  • 產生 RSA-1024 金鑰可能會使通話建立時間增加約 1000 毫秒。
  • 1024 位元 RSA 金鑰無法提供足夠的密碼編譯強度。

由於使用 RSA-1024 產生憑證的速度較慢,因此部分行動應用程式已改為預先準備或重複使用憑證。

您可以使用 2048 位元以上的 RSA 金鑰來解決金鑰強度問題,但這樣會讓通話建立時間延遲數秒。與其變更 RSA 金鑰大小,不如在 Chrome 52 中實作 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 可儲存及從 IndexedDB 儲存空間載入,避免在工作階段之間產生新的憑證。舉例來說,如果您仍需要使用 RSA,但想避免 RSA 產生額外負擔,這項功能就很實用。使用 ECDSA 時,每次產生新的憑證都非常快速,因此不需要快取。

Firefox 和 Opera 39 已提供 RTCCertificate IndexedDB 儲存空間。

瞭解詳情