ECDSA para WebRTC: mais segurança, privacidade e desempenho

A partir do Chrome 52, o WebRTC usa um algoritmo muito mais eficiente e seguro para a geração de certificados (RTCCertificate): ECDSA. Além disso, RTCCertificates agora pode ser armazenado com IndexedDB.

RTCCertificates são os certificados autoassinados usados no handshake DTLS ao configurar uma conexão de peering do WebRTC. O DTLS é uma implementação do protocolo criptográfico TLS para protocolos de datagramas, como UDP, usado pelo WebRTC.

Até recentemente, o WebRTC usava chaves RSA-1024 para certificados. Essas chaves têm várias desvantagens:

  • A geração de chaves RSA-1024 pode levar até 1.000 ms no tempo de configuração da chamada.
  • As chaves RSA de 1.024 bits não têm segurança criptográfica adequada.

Como a geração de certificados com RSA-1024 é lenta, alguns apps para dispositivos móveis recorreram à preparação prévia de certificados ou reutilizá-los.

O problema de força da chave poderia ser resolvido com chaves RSA de 2048 bits ou mais, mas isso atrasaria a configuração da chamada em vários segundos adicionais. Em vez de alterar o tamanho da chave RSA, o Chrome 52 implementa chaves ECDSA (algoritmo de assinatura digital de curva elíptica) para uso em certificados. Elas têm a mesma eficiência que as chaves RSA de 3.072 bits, mas são milhares de vezes mais rápidas: a sobrecarga de configuração de chamadas com o ECDSA é de apenas alguns milissegundos.

No geral, as chaves ECDSA aumentam a segurança, a privacidade e a performance, principalmente em dispositivos móveis. Por esses motivos, a ECDSA é obrigatória no rascunho Arquitetura de segurança WebRTC.

A partir do Chrome 47, é possível ativar o ECDSA:

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

Embora o ECDSA esteja ativado por padrão no Chrome 52, você ainda pode gerar certificados RSA:

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

Consulte o rascunho do W3C para saber mais sobre generateCertificate().

Como armazenar RTCCertificate no IndexedDB

Outra melhoria no Chrome 52: os RTCCertificates usados pelo WebRTC podem ser salvos e carregados no armazenamento do IndexedDB, evitando a necessidade de gerar novos certificados entre as sessões. Isso pode ser útil, por exemplo, se você ainda precisar usar RSA e quiser evitar a sobrecarga na geração. Com o ECDSA, o armazenamento em cache não é necessário porque é rápido o suficiente para gerar sempre um novo certificado.

O armazenamento IndexedDB do RTCCertificate já foi disponibilizado no Firefox e está no Opera 39.

Saiba mais