Zabezpečený protokol vzdáleného hesla - Secure Remote Password protocol
The Zabezpečený protokol vzdáleného hesla (SRP) je rozšířený výměna klíčů ověřená heslem (PAKE) protokol, speciálně navržený k řešení stávajících patentů.[1]
Jako všechny protokoly PAKE, odposlech nebo muž uprostřed nemůže získat dostatek informací, aby mohl hádání hrubou silou heslo nebo použít a slovníkový útok bez dalších interakcí se stranami pro každý odhad. Kromě toho server, který je rozšířeným protokolem PAKE, neukládá data odpovídající heslu.[2] To znamená, že útočník, který ukradne data serveru, se nemůže vydávat za klienta, pokud nejprve neprovede vyhledávání hesla hrubou silou.
Laicky řečeno, během ověřování SRP (nebo jiného protokolu PAKE) jedna strana („klient“ nebo „uživatel“) prokáže jiné straně („serveru“), že zná heslo, aniž by zaslala samotné heslo ani žádné jiné další informace, ze kterých lze odvodit heslo. Heslo nikdy neopustí klienta a je serveru neznámé.
Kromě toho server potřebuje také vědět o hesle (ale ne o samotném hesle), aby bylo možné zahájit zabezpečené připojení. To znamená, že server se také sám autentizuje u klienta, aniž by se spoléhal na to, že uživatel analyzuje složité adresy URL, což brání phishing.
Přehled
Protokol SRP má řadu žádoucích vlastností: umožňuje uživateli ověřit se na serveru, je vůči němu odolný slovníkové útoky namontován odposlechem a nevyžaduje a důvěryhodná třetí strana. Účinně vyjadřuje a důkaz nulové znalosti hesla od uživatele k serveru. V revizi 6 protokolu lze u každého pokusu o připojení uhodnout pouze jedno heslo. Jednou ze zajímavých vlastností protokolu je, že i když jsou napadeni jeden nebo dva kryptografické primitivy, které používá, je stále zabezpečený. Protokol SRP byl několikrát revidován a aktuálně je v revizi 6a.
Protokol SRP vytváří velký soukromý klíč sdílený mezi oběma stranami podobným způsobem Výměna klíčů Diffie – Hellman na základě klientské strany s uživatelským heslem a na straně serveru s a kryptografické ověřovatel odvozený z hesla. Sdílený veřejný klíč je odvozen ze dvou náhodných čísel, jednoho generovaného klientem a druhého generovaného serverem, která jsou jedinečná pro pokus o přihlášení. V případech, kdy je vyžadována šifrovaná komunikace i ověřování, je protokol SRP bezpečnější než alternativa SSH protokol a rychlejší než použití Výměna klíčů Diffie – Hellman s podepsanými zprávami. Na rozdíl od toho je také nezávislá na třetích stranách Kerberos. Protokol SRP, verze 3 je popsán v RFC 2945. SRP verze 6 se také používá pro silnou autentizaci pomocí hesla v SSL / TLS[3] (v TLS-SRP ) a další standardy jako např EAP[4] a SAML a je standardizován v IEEE P1363 a ISO / IEC 11770-4.
Protokol
V tomto popisu protokolu verze 6 se používá následující zápis:
- q a N = 2q +1 jsou vybrány tak, aby oba byly prvočísla (což činí q A Sophie Germain prime a N A bezpečný prime ). N musí být dostatečně velký, aby výpočet diskrétních logaritmů modulo N je nemožné.
- Celá aritmetika se provádí v kruhu celých čísel modulo N, . To znamená, že níže GX by měl být čten jako GXmod N
- G je generátor multiplikativní skupiny .
- H() je hash funkce; např. SHA-256.
- k je parametr odvozený oběma stranami; v SRP-6, k = 3, zatímco v SRP-6a je odvozen od N a G : k = H(N, G). Používá se k zabránění odhadu 2 za 1, když se aktivní útočník vydává za server.[5][6]
- s je malý sůl.
- Já je identifikační uživatelské jméno.
- str je heslo uživatele.
- proti je ověřovatel hesla hostitele, proti = GX kde minimálně X = H(s, str). Tak jako X je počítán pouze na straně klienta, je na svobodě zvolit silnější algoritmus. Implementace se může rozhodnout použít X = H(s | Já | str) bez ovlivnění jakýchkoli kroků vyžadovaných od hostitele Standardní RFC2945 definuje X = H(s | H ( Já | ":" | str) ). Použití Já v rámci X zabrání tomu, aby škodlivý server mohl zjistit, zda dva uživatelé sdílejí stejné heslo.
- A a B jsou náhodné jednorázové pomíjivé klíče uživatele a hostitele.
- | (potrubí) označuje zřetězení.
Všechny ostatní proměnné jsou definovány z hlediska těchto.
Nejprve vytvořit heslo str se serverem Steve si klient Carol vybere malý náhodný údaj sůl sa počítá X = H(s, str), proti = GX. Steve obchody proti a sindexováno Jájako ověřovatel hesla a sůl Carol. Carol nesmí sdílet X s kýmkoli a musí to v tomto kroku bezpečně vymazat, protože je ekvivalent na prosté heslo str. Tento krok je dokončen, než se systém použije jako součást registrace uživatele u Steva. Všimněte si, že sůl s je sdílena a vyměněna za účelem vyjednání klíče relace později, takže hodnotu mohla zvolit obě strany, ale provádí ji Carol, aby se mohla zaregistrovat Já, s a proti v jedné žádosti o registraci. Na přenos a ověřování žádosti o registraci se SRP nezabývá.
K pozdějšímu provedení ověření hesla pak dojde k následujícímu výměnnému protokolu:
- Carol → Steve: vygenerujte náhodnou hodnotu A; poslat Já a A = GA
- Steve → Carol: vygenerujte náhodnou hodnotu b; poslat s a B = kv + Gb
- Oba: u = H(A, B)
- Koleda: SKoleda = (B − kgX)(A + ux) = (kv + Gb − kgX)(A + ux) = (kgX − kgX + Gb)(a + ux) = (Gb)(A + ux)
- Koleda: K.Koleda = H(SKoleda)
- Steve: SSteve = (Avu)b = (GAprotiu)b = [GA(GX)u]b = (Ga + ux)b = (Gb)(a + ux)
- Steve: K.Steve = H(SSteve) = K.Koleda
Nyní mají obě strany sdílený a silný klíč relace K.. K dokončení ověřování si musí navzájem prokázat shodu svých klíčů. Jeden možný způsob je následující:
- Carol → Steve: M1 = H[H(N) XOR H(G) | H(Já) | s | A | B | K.Koleda]. Steve ověří M1.
- Steve → Carol: M2 = H(A | M1 | K.Steve). Carol ověřuje M2.
Tato metoda vyžaduje hádání většího počtu sdíleného stavu, aby byla úspěšná v zosobnění, než jen klíč. Zatímco většina dalšího stavu je veřejná, soukromé informace lze bezpečně přidat ke vstupům do funkce hash, jako je soukromý klíč serveru.[je zapotřebí objasnění ]
Alternativně, v důkazu pouze s heslem, výpočet K. lze přeskočit a sdílet S prokázáno:
- Carol → Steve: M1 = H(A | B | SKoleda). Steve ověří M1.
- Steve → Carol: M2 = H(A | M1 | SSteve). Carol ověřuje M2.
Při použití SRP k vyjednání sdíleného klíče K. které budou okamžitě použity po vyjednání kroků ověření M1 a M2 může být přeskočeno. Server odmítne první požadavek od klienta, který nemůže dešifrovat. Přeskočení kroků ověření může být nebezpečné.[Citace je zapotřebí ]
Obě strany rovněž používají následující záruky:
- Carol přeruší, pokud přijme B = 0 (mod N) nebo u = 0.
- Steve přeruší, pokud přijme A (mod N) = 0.
- Carol musí prokázat svůj důkaz K. (nebo S) První. Pokud Steve zjistí, že Carolin důkaz není správný, musí potratit, aniž by ukázal svůj vlastní důkaz K. (nebo S)
Příklad implementace v Pythonu
# Příklad SRP autentizace# UPOZORNĚNÍ: Nepoužívejte pro skutečné kryptografické účely nad rámec testování.# UPOZORNĚNÍ: Tento kód níže postrádá důležitá ochranná opatření. Nezkontroluje, že A, B a U nejsou nula.# na základě http://srp.stanford.edu/design.htmlimport hashlibimport náhodnýdef global_print(*jména) -> Žádný: X = lambda s: ["{}", „0x{:X}"][hasattr(s, "nemovitý")].formát(s) tisk("".připojit se("{} = {} n".formát(název, X(globálové()[název])) pro název v jména))# Poznámka: str převádí tak, jak je, str ([1,2,3,4]) se převede na „[1,2,3,4]“def H(*args) -> int: "" "Jednosměrná hašovací funkce." "" A = ":".připojit se(str(A) pro A v args) vrátit se int(hashlib.sha256(A.zakódovat("utf-8")).hexdigest(), 16)def kryptrand(n: int = 1024): vrátit se náhodný.SystemRandom().getrandbits(n) % N# Velké bezpečné prvočíslo (N = 2q + 1, kde q je prvočíslo)# Veškerá aritmetika se provádí modulo N# (generováno pomocí „openssl dhparam -text 1024“)N = "" "00: c0: 37: c3: 75: 88: b4: 32: 98: 87: e6: 1c: 2d: a3: 32: 4b: 1b: a4: b8: 1a: 63: f9: 74: 8f: ed: 2d: 8a: 41: 0c: 2f: c2: 1b: 12: 32: f0: d3: bf: a0: 24: 27: 6c: fd: 88: 44: 81: 97: aa: e4: 86: a6: 3b: fc: a7: b8: bf: 77: 54: df: b3: 27: c7: 20: 1f: 6f: d1: 7f: d7: fd: 74: 15: 8b: d3: 1c: e7: 72: c9: f5: f8: ab: 58: 45: 48: a9: 9a: 75: 9b: 5a: 2c: 05: 32: 16: 2b: 7b: 62: 18: e8: f1: 42: bc: e2: c3: 0d: 77: 84: 68: 9a: 48: 3e: 09: 5e: 70: 16: 18: 43: 79: 13: a8: c3: 9c: 3d: d0: d4: ca: 3c: 50: 0b: 88: 5f: e3 „“ “N = int("".připojit se(N.rozdělit()).nahradit(":", ""), 16)G = 2 # Generátor modulo Nk = H(N, G) # Parametr multiplikátoru (k = 3 ve starší SRP-6)tisk("#. H, N, ga ak jsou klientovi i serveru známy předem:")global_print("H", „N“, "G", „k“)tisk("0. server ukládá (I, s, v) do své databáze hesel")# Server musí nejprve vygenerovat ověřovač heslaJá = "osoba" # Uživatelské jménostr = „heslo1234“ # Heslos = kryptrand(64) # Sůl pro uživateleX = H(s, Já, str) # Soukromý klíčproti = prášek(G, X, N) # Ověřovač heslaglobal_print("Já", „p“, „s“, "X", "proti")tisk("1. klient pošle na server uživatelské jméno I a veřejnou prchavou hodnotu A")A = kryptrand()A = prášek(G, A, N)global_print("Já", "A") # klient-> server (I, A)tisk("2. server odešle klientovi soli uživatele a veřejnou prchavou hodnotu B")b = kryptrand()B = (k * proti + prášek(G, b, N)) % Nglobal_print(„s“, „B“) # server-> klient (s, B)tisk("3. klient a server vypočítají náhodný kódovací parametr")u = H(A, B) # Náhodný kódovací parametrglobal_print("u")tisk("4. klient počítá klíč relace")X = H(s, Já, str)S_c = prášek(B - k * prášek(G, X, N), A + u * X, N)K_c = H(S_c)global_print(„S_c“, „K_c“)tisk("5. server počítá klíč relace")S_s = prášek(A * prášek(proti, u, N), b, N)K_s = H(S_s)global_print(„S_s“, "K_s")tisk("6. klient odešle na server důkaz o relačním klíči")M_c = H(H(N) ^ H(G), H(Já), s, A, B, K_c)global_print("M_c")# klient-> server (M_c); server ověří M_ctisk("7. server odešle klientovi doklad o relačním klíči")Slečna = H(A, M_c, K_s)global_print("Slečna")# server-> klient (M_s); klient ověří M_s
Výstupy
#. H, N, G, a k je předem známo, že klienta a server: H =N = 0xc037c37588b4329887e61c2da3324b1ba4b81a63f9748fed2d8a410c2fc21b1232f0d3bfa024276cfd88448197aae486a63bfca7b8bf7754dfb327c7201f6fd17fd7fd74158bd31ce772c9f5f8ab584548a99a759b5a2c0532162b7b6218e8f142bce2c30d7784689a483e095e701618437913a8c39c3dd0d4ca3c500b885fe3g = 0x2k = 0xb317ec553cb1a52201d79b7c12d4b665d0dc234fdbfd5a06894c1a194f818c4a0. server obsahuje (I, s, v) ve své heslo databaseI = personp = password1234s = 0x23c52769f89b02c0x = 0x28a914ef69978f5fe544f030bea89eab675bcaa2ec79cd36efa1d410d27d5215v = 0xa636254492ec0f7391d6b596ec926b91866775072dfd758c6ebc51bf7277ec6ca97f6cf0316d7fa90a2b9e87366cf813a53dcdc6ab303fcc932a5783f62affb7e0275189f165b8b919a2067404e6f2aa0534c99a3224a6365c1367dcd9ef005376d6f20a2b300c307f7afcedea08fb2d7a3340f13b5b9e35d52f0b82670ab17e1. klient odešle uživatelské jméno I a veřejnou hodnotu A prchavý do serverI = persona = 0x48147d013e3a2e08ace222a0ab914a7ed67c704b2480716b53f9d229243d1725473cf4451904658597f487b0fa8bc7d544671b25563f095bad384cbb8da7f58f7f13c8fa8bb9d6aade5fe02df288f2b38d71d51036ede52802645f82cd7216535c0c978f90230e0f878163a638cf57ad11968169c26e467b8ee14eb2ca5b16142. Server odešle sůl ů uživatele a veřejnou hodnotu B prchavý klientům = 0x23c52769f89b02c0B = 0x709f340738e62e46184634acd2cd7c861a7d92c5fde9eb43ac120226a0eb6601ee5d1a0b92ffb6254170d91fb451c3c02bbf8b41f9e7e3e885d709f0dc4808048e595c68448a2111b45eefaa1e2d6a4814d99ae038a5f2371c753b312c529cada66b23e6512c7ef814683f4cfe2a4c5413c434e21bc689d869fc969141b84a613. klient a server vypočítají parametr náhodného kódování u = 0x78e4f2723b9ee5f69c7225469c70263cb39580dd4414b82ab9960def0ac9ef684. Klient vypočítá zasedání keyS_c = 0x94ea4b72b61d4330cf44f31e5c710491d41abdd6dd5b66b277bc517addbe89d9aa002645897567ae7796d1574f5d7f62cf96d2246dabfbc919cf1444d69097ceaf5476bc3964cacd52697e346f5e5a424c2c89b661d2eba34e5c7195573442195611497f606fa49639f873f385d0f6cdb9308fe2b0777d1a89bbaebe9df237a4K_c = 0x3f1e089e02b3770a5e4ab27b3a04415e54826fe4b729cd37b86fbe59b9e0d3c65. serverové Vypočte zasedání keyS_s = 0x94ea4b72b61d4330cf44f31e5c710491d41abdd6dd5b66b277bc517addbe89d9aa002645897567ae7796d1574f5d7f62cf96d2246dabfbc919cf1444d69097ceaf5476bc3964cacd52697e346f5e5a424c2c89b661d2eba34e5c7195573442195611497f606fa49639f873f385d0f6cdb9308fe2b0777d1a89bbaebe9df237a4K_s = 0x3f1e089e02b3770a5e4ab27b3a04415e54826fe4b729cd37b86fbe59b9e0d3c66. klient odešle důkaz klíče relace na serverM_c = 0x21d1546a18f923907b975091341316ca03bacf9cfd61b33f66d87e07eacff187. server odešle důkaz klíče relace klientovi M_s = 0x937ee2752d2d0a18eea2e7d4c5aa0dd0df54970f4c99fc13c75c5db3bba45643
Implementace
- OpenSSL verze 1.0.1 nebo novější.
- Botan (kryptografická knihovna C ++) obsahuje implementaci SRP-6a
- TLS-SRP je sada šifrovacích systémů pro zabezpečení transportní vrstvy který používá SRP.
- srp klient Implementace SRP-6a v JavaScript (kompatibilní s RFC 5054 ), otevřený zdroj, Veřejná licence Mozilla (MPL) s licencí.
- The Crypto knihovna JavaScript zahrnuje implementaci protokolu SRP pomocí JavaScriptu, otevřený zdroj, BSD licencováno.
- Gnu Crypto poskytnout a Jáva implementace licencována pod GNU General Public License s „knihovní výjimkou“, která umožňuje její použití jako knihovny ve spojení s nesvobodným softwarem.
- Legie skákacího hradu poskytuje Java a C# implementace v rámci Licence MIT.
- Nimbus SRP je knihovna Java poskytující ověřovací generátor, relace na straně klienta a serveru. Zahrnuje rozhraní pro vlastní klíč hesla, rutiny důkazních zpráv klienta a serveru. Žádné externí závislosti. Vydáno pod Licence Apache 2.0.
- srplibcpp je C ++ implementovat základ na MIRACL.
- DragonSRP je modulární implementace C ++, se kterou v současné době pracuje OpenSSL.
- Json2Ldap poskytuje ověřování SRP-6a LDAP adresářové servery.
- csrp Implementace SRP-6a v C.
- Crypt-SRP Implementace SRP-6a v Perl.
- pysrp Implementace SRP-6a v Krajta (kompatibilní s csrp ).
- py3srp Implementace SRP-6a v čistém Python3.
- srptools Nástroje pro implementaci ověřování zabezpečeného vzdáleného hesla (SRP) v systému Windows Krajta. Ověřené kompatibilní knihovny.
- Meteor Systém účtů webového rámce implementuje SRP pro ověřování pomocí hesla.
- srp-rb Implementace SRP-6a v Rubín.
- falkmueller ukázka SRP-6a provádění Stanford Návrh protokolu SRP v systému Windows JavaScript a PHP pod Licence MIT.
- srp-6a-demo Implementace SRP-6a v PHP a JavaScript.
- thinbus-srp-js Implementace SRP-6a v JavaScript. Dodává se s kompatibilními Jáva třídy, které používají Nimbus SRP demonstrační aplikace pomocí Jarní bezpečnost. K dispozici je také demonstrační aplikace provádějící ověřování do a PHP serveru. Vydáno pod Licence Apache.
- Stanfordská šifrovací knihovna JavaScript (SJCL) implementuje SRP pro výměnu klíčů.
- uzel-srp je implementace SRP klienta a serveru JavaScript (node.js).
- SRP6 pro C # a Java implementace v C # a Java.
- ALOSRPAuth je implementace SRP-6a Objective-C.
- go-srp je Go implementace SRP-6a.
- tssrp6a je strojopisová implementace SRP-6a.
Reference
- ^ „Co je SRP?“. Stanfordská Univerzita.
- ^ Sherman, Alan T .; Lanus, Erin; Liskov, Mojžíš; Zieglar, Edward; Chang, Richard; Golaszewski, Enis; Wnuk-Fink, Ryan; Bonyadi, Cyrus J .; Yaksetig, Mario (2020), Nigam, Vivek; Ban Kirigin, Tajana; Talcott, Carolyn; Guttman, Joshua (eds.), „Formální analýza metod zabezpečeného protokolu vzdáleného hesla“, Logika, jazyk a bezpečnost: Eseje věnované Andreu Scedrovovi u příležitosti jeho 65. narozenin, Lecture Notes in Computer Science, Cham: Springer International Publishing, pp. 103–126, doi:10.1007/978-3-030-62077-6_9, ISBN 978-3-030-62077-6, vyvoláno 2020-12-02
- ^ Taylor, David; Tom Wu; Nikos Mavrogiannopoulos; Trevor Perrin (listopad 2007). „Používání protokolu Secure Remote Password (SRP) pro ověřování TLS“. RFC 5054
- ^ Carlson, James; Bernard Aboba; Henry Haverinen (červenec 2001). „Ověřovací protokol EAP SRP-SHA1“. IETF. Návrh.
- ^ Wu, Tom (29. října 2002). „SRP-6: Vylepšení a zdokonalení zabezpečeného vzdáleného protokolu hesla“.
- ^ „Návrh protokolu SRP“.
Viz také
- Ověřování výzev a odpovědí
- Dohoda s klíčem ověřeným heslem
- Mechanismus ověřování odpovědi solené výzvy (SCRAM)
- Jednoduchá výměna hesla s exponenciálním heslem
- Důkaz nulové znalosti hesla
externí odkazy
- Oficiální webové stránky
- Licence SRP —BSD jako otevřený zdroj.
- US6539479 - Patent SRP (Platnost vypršela 12. května 2015 z důvodu nezaplacení poplatků za údržbu (podle patentů Google). Původně vyprší v červenci 2018).
Ruční stránky
- pppd (8): Démon protokolu z bodu do bodu
- srptool (1): Jednoduchý nástroj pro heslo SRP
RFC
- RFC 2944 - Ověřování Telnet: SRP
- RFC 2945 - Systém ověřování SRP a výměny klíčů (verze 3)
- RFC 3720 - Internetové rozhraní malých počítačových systémů (iSCSI)
- RFC 3723 - Zabezpečení protokolů blokového úložiště přes IP
- RFC 3669 - Pokyny pro pracovní skupiny pro otázky duševního vlastnictví
- RFC 5054 - Používání protokolu Secure Remote Password (SRP) pro ověřování TLS
Další odkazy
- IEEE 1363
- Prezentace duševního vlastnictví SRP (prosinec 2001 - možné zastaralé) Platnost uvedených patentů EKE vypršela v letech 2011 a 2013.