适用于 WebRTC 的 ECDSA - 更高的安全性、更好的隐私保护和更出色的性能

从 Chrome 52 开始,WebRTC 使用更高效、更安全的算法 (RTCCertificate) 生成证书:ECDSA。此外,RTCCertificate 现在可以使用 IndexedDB 进行存储。

RTCCertificate 是设置 WebRTC 对等连接时在 DTLS 握手中使用的自签名证书。(DTLS 是 WebRTC 使用的 UDP 等数据报协议的加密协议 TLS 的实现)。

不久之前,WebRTC 一直使用 RSA-1024 密钥作为证书。这些键存在一些缺点:

  • 生成 RSA-1024 密钥会增加大约 1000 毫秒的通话设置时间。
  • 1024 位 RSA 密钥的加密强度不足。

由于使用 RSA-1024 生成证书的速度很慢,因此某些移动应用会提前准备证书或重复使用证书。

使用 2048 位或更多 RSA 密钥可以解决密钥强度问题,但这会额外延迟几秒通话设置。Chrome 52 采用的是在证书中使用的 ECDSA 密钥(椭圆曲线数字签名算法),而不是更改 RSA 密钥大小。这些密钥与 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 中的另一项改进:可以从 IndexedDB 存储空间保存和加载 WebRTC 使用的 RTCCertificate,从而避免在会话之间生成新证书。在某些情况下(例如,如果您仍需要使用 RSA 并且希望避免 RSA 生成开销),这种做法会非常有用。使用 ECDSA 时,无需进行缓存,因为缓存速度足够快,每次都能生成新证书。

RTCCertificate IndexedDB 存储已在 Firefox 中和 Opera 39 中推出。

了解详情