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

Od wersji 52 Chrome WebRTC używa znacznie wydajniejszego i bezpieczniejszego algorytmu do generowania certyfikatów (RTCCertificate): ECDSA. Dodatkowo certyfikaty RTC mogą być teraz przechowywane w IndexedDB.

RTCCertificates to samodzielnie podpisane certyfikaty używane w uzgadnianiu DTLS podczas konfigurowania połączenia peer-to-peer WebRTC. (DTLS to implementacja protokołu kryptograficznego TLS dla protokołów pakietów danych, takich jak UDP, który jest używany przez WebRTC).

Do niedawna WebRTC używało kluczy RSA-1024 do certyfikatów. Te klucze mają kilka wad:

  • Generowanie kluczy RSA-1024 może wydłużyć czas konfiguracji połączenia o około 1000 ms.
  • Klucze RSA o długości 1024 bitów nie zapewniają odpowiedniej siły kryptograficznej.

Generowanie certyfikatów za pomocą 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ć, przechodząc na klucze RSA o długości co najmniej 2048 bitów, ale spowoduje to opóźnienie konfiguracji połączenia o kilka dodatkowych sekund. Zamiast zmieniać rozmiar klucza RSA, Chrome 52 implementuje klucze ECDSA (algorytm podpisu cyfrowego wykorzystujący krzywe eliptyczne) do użycia w certyfikatach. Są one tak samo silne jak klucze RSA o długości 3072 bitów, ale kilka tysięcy razy szybsze: czas konfiguracji połączenia przy użyciu ECDSA wynosi tylko kilka milisekund.

Podsumowując, klucze ECDSA oznaczają lepsze bezpieczeństwo, większą prywatność i lepszą wydajność, zwłaszcza na urządzeniach mobilnych. Z tych powodów w projektie architektury bezpieczeństwa WebRTC wymagano użycia algorytmu ECDSA.

W Chrome 47 możesz włączyć ECDSA:

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

Od wersji 52 Chrome, mimo że ECDSA jest domyślnie włączona, 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 RTCCertificate w IndexedDB

Kolejna poprawa w Chrome 52: certyfikaty RTC używane przez WebRTC można zapisywać i wczytywać z magazynu IndexedDB, dzięki czemu nie trzeba generować nowych certyfikatów między sesjami. Może to być przydatne, jeśli nadal musisz używać RSA i chcesz uniknąć nakładów związanych z generowaniem tego formatu. W przypadku ECDSA nie jest konieczne używanie pamięci podręcznej, ponieważ generowanie nowego certyfikatu jest na tyle szybkie, że można to robić za każdym razem.

Pamięć IndexedDB RTCCertificate jest już dostępna w Firefox i Opera 39.

Więcej informacji