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, agora é possível armazenar RTCCertificates com o IndexedDB.

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

Até recentemente, o WebRTC usava chaves RSA-1024 para certificados. Há várias desvantagens com essas chaves:

  • A geração de chaves RSA-1024 pode adicionar cerca de 1.000 ms ao tempo de configuração da chamada.
  • Chaves RSA de 1.024 bits não oferecem força criptográfica adequada.

Como a geração de certificados com RSA-1024 é lenta, alguns apps para dispositivos móveis recorreram à preparação de certificados antecipadamente ou à reutilização deles.

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. Em vez de mudar o tamanho da chave RSA, o Chrome 52 implementa chaves ECDSA (algoritmo de assinatura digital de curva elíptica) para uso em certificados. Elas são tão fortes quanto as chaves RSA de 3072 bits, mas milhares de vezes mais rápidas: a sobrecarga de configuração de chamadas com ECDSA é de apenas alguns milissegundos.

Em geral, as chaves ECDSA significam mais segurança, privacidade e desempenho, especialmente em dispositivos móveis. Por esses motivos, o ECDSA foi obrigatório no rascunho da arquitetura de segurança do WebRTC.

No Chrome 47, você pode ativar o ECDSA:

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

No Chrome 52, embora o ECDSA esteja ativado por padrão, ainda é possível 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 mais informações sobre generateCertificate().

Como armazenar RTCCertificate no IndexedDB

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

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

Saiba mais