ECDSA для WebRTC: лучшая безопасность, лучшая конфиденциальность и лучшая производительность

Начиная с Chrome 52, WebRTC использует гораздо более эффективный и безопасный алгоритм генерации сертификата (RTCCertificate): ECDSA. Кроме того, сертификаты RTCCertificates теперь можно хранить с помощью IndexedDB.

RTCCertificates — это самозаверяющие сертификаты, используемые при подтверждении связи DTLS при настройке однорангового соединения WebRTC. (DTLS — это реализация криптографического протокола TLS для протоколов датаграмм, таких как UDP , который используется WebRTC.)

До недавнего времени WebRTC использовал для сертификатов ключи RSA-1024. У этих ключей есть несколько недостатков:

  • Генерация ключей RSA-1024 может увеличить время установления вызова примерно до 1000 мс.
  • 1024-битные ключи RSA не обеспечивают достаточной криптостойкости.

Поскольку создание сертификатов с помощью RSA-1024 происходит медленно, некоторые мобильные приложения прибегают к предварительной подготовке сертификатов или их повторному использованию.

Проблему с надежностью ключа можно решить, перейдя на 2048-битные ключи RSA или более, но это задержит установку вызова на несколько дополнительных секунд. Вместо изменения размера ключа RSA Chrome 52 реализует ключи ECDSA (алгоритм цифровой подписи с эллиптической кривой) для использования в сертификатах. Они так же надежны, как 3072-битные ключи RSA, но в несколько тысяч раз быстрее: затраты на установку вызова с помощью ECDSA составляют всего несколько миллисекунд.

В целом ключи ECDSA означают лучшую безопасность, лучшую конфиденциальность и лучшую производительность, особенно на мобильных устройствах. По этим причинам ECDSA была включена в проект архитектуры безопасности WebRTC .

В 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 .)

Хранение RTCCertificate в IndexedDB

Еще одно улучшение в Chrome 52: сертификаты RTCCertificates, используемые WebRTC, можно сохранять и загружать из хранилища IndexedDB, что позволяет избежать необходимости генерировать новые сертификаты между сеансами. Это может быть полезно, например, если вам все еще нужно использовать RSA и вы хотите избежать накладных расходов на генерацию RSA. При использовании ECDSA кэширование не требуется, поскольку оно достаточно быстрое, чтобы каждый раз генерировать новый сертификат.

Хранилище RTCCertificate IndexedDB уже включено в Firefox и находится в Opera 39.

Узнать больше