ECDSA para WebRTC: mejor seguridad, mayor privacidad y mejor rendimiento

A partir de Chrome 52, WebRTC usa un algoritmo para generar certificados mucho más eficiente y seguro (RTCCertificate): ECDSA. Además, los RTCCertificates ahora se pueden almacenar con IndexedDB.

Los RTCCertificates son los certificados autofirmados que se usan en el protocolo de enlace DTLS cuando se configura una conexión de intercambio de tráfico de WebRTC. (DTLS es una implementación del protocolo criptográfico TLS para protocolos de datagramas como UDP, que usa WebRTC).

Hasta hace poco, WebRTC usaba claves RSA-1024 para los certificados. Estas claves tienen varias desventajas:

  • La generación de claves RSA-1024 puede agregar hasta 1,000 ms en el tiempo de configuración de la llamada.
  • Las claves RSA de 1024 bits no proporcionan una seguridad criptográfica adecuada.

Como la generación de certificados con RSA-1024 es lenta, algunas apps para dispositivos móviles recurrieron a la preparación anticipada o a reutilizarlos.

El problema de seguridad de la clave podría resolverse usando claves RSA de 2,048 bits o más, pero eso retrasaría la configuración de la llamada varios segundos más. En lugar de cambiar el tamaño de la clave RSA, Chrome 52 implementa claves ECDSA (algoritmo de firma digital de curva elíptica) para su uso en certificados. Estas cuentan con la misma seguridad que las claves RSA de 3,072 bits,”, pero miles de veces más rápidas: la sobrecarga de configuración de llamadas con ECDSA es de solo unos milisegundos.

En conjunto, las claves de ECDSA ofrecen una mayor seguridad y un mejor rendimiento, especialmente en los dispositivos móviles. Por estos motivos, se exige el uso de ECDSA en el borrador de Arquitectura de seguridad de la WebRTC.

A partir de Chrome 47, puedes habilitar ECDSA:

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

A partir de Chrome 52, aunque ECDSA está habilitado de forma predeterminada, aún tienes la opción de generar certificados RSA:

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

(Consulta el borrador del W3C para obtener más información sobre generateCertificate()).

Cómo almacenar RTCCertificate en IndexedDB

Otra mejora en Chrome 52 es que los RTCCertificates que usa WebRTC se pueden guardar y cargar desde el almacenamiento de IndexedDB, lo que evita la necesidad de generar certificados nuevos entre sesiones. Esto puede ser útil, por ejemplo, si aún necesitas usar RSA y deseas evitar la sobrecarga de generación de RSA. Con ECDSA, no es necesario almacenar en caché, ya que es lo suficientemente rápido como para generar un certificado nuevo cada vez.

El almacenamiento RTCCertificate IndexedDB ya se envió a Firefox y se encuentra en Opera 39.

Más información