Używam Auth0 do obsługi uwierzytelniania w mojej aplikacji internetowej. Używam ASP.NET Core v1.0.0 i Angular 2 rc5 i ogólnie nie wiem dużo na temat uwierzytelniania / bezpieczeństwa.
W dokumentach Auth0 dla ASP.NET Core Web Api istnieją dwie możliwości wyboru algorytmu JWT: RS256 i HS256. To może być głupie pytanie, ale:
Jaka jest różnica między RS256 a HS256? Jakie są przypadki użycia (jeśli dotyczy)?
jwt
auth0
asp.net-core-webapi
Rico Kahler
źródło
źródło
Odpowiedzi:
Obie opcje dotyczą algorytmu, którego dostawca tożsamości używa do podpisywania JWT. Podpisywanie jest operacją kryptograficzną, która generuje „podpis” (część JWT), który odbiorca tokena może sprawdzić, aby upewnić się, że token nie został zmieniony.
RS256 (podpis RSA z SHA-256 ) jest algorytmem asymetrycznym i wykorzystuje parę kluczy publiczny / prywatny: dostawca tożsamości ma klucz prywatny (tajny) używany do generowania podpisu, a konsument JWT otrzymuje klucz publiczny aby potwierdzić podpis. Ponieważ klucz publiczny, w przeciwieństwie do klucza prywatnego, nie musi być zabezpieczony, większość dostawców tożsamości zapewnia konsumentom łatwy dostęp do niego i do korzystania (zwykle za pośrednictwem adresu URL metadanych).
Z drugiej strony HS256 ( HMAC z SHA-256) obejmuje kombinację funkcji skrótu i jednego (tajnego) klucza, który jest współdzielony przez dwie strony używane do generowania skrótu, który będzie służył jako podpis. Ponieważ ten sam klucz służy zarówno do generowania podpisu, jak i do jego sprawdzania, należy zadbać o to, aby klucz nie został naruszony.
Jeśli będziesz opracowywać aplikację korzystającą z JWT, możesz bezpiecznie używać HS256, ponieważ będziesz mieć kontrolę nad tym, kto używa tajnych kluczy. Jeśli z drugiej strony nie masz kontroli nad klientem lub nie masz możliwości zabezpieczenia tajnego klucza, RS256 będzie lepiej pasował, ponieważ konsument musi znać tylko klucz publiczny (współdzielony).
Ponieważ klucz publiczny jest zwykle udostępniany z punktów końcowych metadanych, klienci mogą zostać zaprogramowani do automatycznego pobierania klucza publicznego. Jeśli tak jest (tak jak w przypadku bibliotek .Net Core), będziesz mieć mniej pracy do wykonania przy konfiguracji (biblioteki będą pobierać klucz publiczny z serwera). Z drugiej strony klucze symetryczne należy wymieniać poza pasmem (zapewniając bezpieczny kanał komunikacyjny) i ręcznie aktualizować, jeśli występuje rolowanie klucza do podpisywania.
Auth0 zapewnia punkty końcowe metadanych dla protokołów OIDC, SAML i WS-Fed, w których można odzyskać klucze publiczne. Możesz zobaczyć te punkty końcowe w „Ustawieniach zaawansowanych” klienta.
Na przykład punkt końcowy metadanych OIDC ma postać
https://{account domain}/.well-known/openid-configuration
. Jeśli przejdziesz do tego adresu URL, zobaczysz obiekt JSON z odniesieniem dohttps://{account domain}/.well-known/jwks.json
, który zawiera klucz publiczny (lub klucze) konta.Jeśli spojrzysz na próbki RS256, zobaczysz, że nigdzie nie musisz konfigurować klucza publicznego: jest on pobierany automatycznie przez framework.
źródło
W kryptografii stosowane są dwa rodzaje algorytmów:
Algorytmy symetryczne
Pojedynczy klucz służy do szyfrowania danych. Po zaszyfrowaniu kluczem dane można odszyfrować przy użyciu tego samego klucza. Jeśli na przykład Mary zaszyfruje wiadomość przy użyciu klucza „mój-sekret” i wyśle ją do Johna, będzie w stanie poprawnie odszyfrować wiadomość przy użyciu tego samego klucza „mój-sekret”.
Algorytmy asymetryczne
Do szyfrowania i deszyfrowania wiadomości służą dwa klucze. Podczas gdy jeden klucz (publiczny) służy do szyfrowania wiadomości, drugi klucz (prywatny) może być użyty tylko do jego odszyfrowania. Tak więc John może wygenerować klucze publiczne i prywatne, a następnie wysłać tylko klucz publiczny do Mary w celu zaszyfrowania swojej wiadomości. Wiadomość można odszyfrować tylko przy użyciu klucza prywatnego.
Scenariusz HS256 i RS256
Algorytmy te NIE są używane do szyfrowania / usuwania danych. Są one raczej wykorzystywane do weryfikacji pochodzenia lub autentyczności danych. Gdy Mary musi wysłać otwartą wiadomość do Jhon i musi sprawdzić, czy wiadomość z pewnością pochodzi od Mary, można użyć HS256 lub RS256.
HS256 może utworzyć podpis dla danej próbki danych za pomocą jednego klucza. Gdy wiadomość jest przesyłana wraz z podpisem, strona odbierająca może użyć tego samego klucza, aby sprawdzić, czy podpis pasuje do wiadomości.
RS256 używa pary kluczy, aby zrobić to samo. Podpis można wygenerować tylko przy użyciu klucza prywatnego. I klucz publiczny musi być użyty do weryfikacji podpisu. W tym scenariuszu, nawet jeśli Jack znajdzie klucz publiczny, nie może utworzyć fałszywej wiadomości z podpisem podszywającym się pod Mary.
źródło
Istnieje różnica w wydajności.
Mówiąc wprost,
HS256
jest o około 1 rząd wielkości szybszy niż wRS256
przypadku weryfikacji, ale o około 2 rzędy wielkości szybszy niż wRS256
przypadku wystawiania (podpisywania).Nie rozłączaj się na faktycznych liczbach, po prostu pomyśl o nich z szacunkiem.
[Program.cs]
źródło
krótka odpowiedź, specyficzna dla OAuth2,
źródło