ECDSA dla WebRTC – lepsze zabezpieczenia, lepsza ochrona prywatności i większa wydajność

Od Chrome 52 WebRTC używa znacznie wydajniejszego i bezpieczniejszego algorytmu do generowania certyfikatu (RTCCertificate): ECDSA. Dodatkowo certyfikaty RTCCertificates można teraz przechowywać za pomocą IndexedDB.

Certyfikaty RTCCertificates to samodzielnie podpisane certyfikaty używane podczas uzgadniania połączenia DTLS podczas konfigurowania połączenia równorzędnego WebRTC. (DTLS to implementacja protokołu kryptograficznego TLS dla protokołów datagramów, takich jak UDP, który jest używany przez WebRTC).

Do niedawna w WebRTC używane były klucze RSA-1024 w procesie tworzenia certyfikatów. Te klucze mają kilka wad:

  • Wygenerowanie kluczy RSA-1024 może wydłużyć czas konfiguracji połączenia nawet do 1000 ms.
  • 1024-bitowe klucze RSA nie zapewniają odpowiedniej siły kryptograficznej.

Generowanie certyfikatów przy użyciu RSA-1024 jest powolne, dlatego niektóre aplikacje mobilne przygotowują certyfikaty z wyprzedzeniem lub używają ich ponownie.

Problem z siłą klucza można rozwiązać, używając co najmniej 2048-bitowych kluczy RSA, ale spowodowałoby to opóźnienie konfiguracji połączenia o kilka dodatkowych sekund. Zamiast zmieniać rozmiar klucza RSA, Chrome 52 wdraża klucze ECDSA (Elliptic Curve Digital Signature Algorithm) używane w certyfikatach. Są one tak silne jak 3072-bitowe klucze RSA, ale kilka tysięcy razy szybsze: konfigurowanie połączeń za pomocą ECDSA zajmuje tylko kilka milisekund.

Podsumowując, klucze ECDSA zapewniają większe bezpieczeństwo, lepszą ochronę prywatności i lepszą wydajność – zwłaszcza na urządzeniach mobilnych. Z tego powodu funkcja ECDSA została umieszczona w wersji roboczej WebRTC Security Architecture.

Od Chrome 47 możesz dołączyć do ECDSA:

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

W przeglądarce Chrome 52, mimo że ECDSA jest domyślnie włączone, nadal możesz generować certyfikaty RSA:

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

(Więcej informacji o generateCertificate() znajdziesz w wersji roboczej W3C).

Przechowywanie certyfikatu RTC w IndexedDB

Kolejne ulepszenie Chrome 52: certyfikaty RTC Certificates używane przez WebRTC można zapisywać i wczytywać z pamięci IndexedDB, dzięki czemu nie trzeba generować nowych certyfikatów między sesjami. Jest to przydatne na przykład wtedy, gdy nadal musisz używać elastycznych reklam w wyszukiwarce i chcesz uniknąć nakładów pracy związanych z generowaniem elastycznych reklam w wyszukiwarce. W przypadku ECDSA zapisywanie w pamięci podręcznej nie jest konieczne, ponieważ jest to wystarczająco szybkie, aby za każdym razem wygenerować nowy certyfikat.

Pamięć RTCCertificate IndexedDB została już wysłana w przeglądarce Firefox i jest w przeglądarce Opera 39.

Więcej informacji