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.

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