it-swarm-eu.dev

Může kdokoli poskytnout reference pro implementaci mechanismů automatického resetování hesla pro webové aplikace?

Ve webové aplikaci implementujeme resetování vlastního hesla a vím, jak to chci (časově omezená adresa URL pro resetování e-mailu uživatelům předběžně zaregistrovanou e-mailovou adresu).

Mým problémem je, že nemůžu najít žádné odkazy, které by vývojářům ukázali, jak tuto techniku ​​používat. Může mi někdo nasměrovat směr některých dobrých odkazů na tuto techniku?

96
bdg

Několik návrhů:

Neaktualizujte heslo uživatele, dokud není potvrzeno. Neprovádějte okamžité resetování hesla uživatele. Resetujte jej pouze tehdy, když uživatel klikne na potvrzovací odkaz zaslaný na svou předběžnou e-mailovou adresu.

Vyžadovat CAPTCHA. Když uživatel požádá o resetování hesla, vynutit je, aby vyřešili CAPTCHA před dalším pokračováním. Tím se zabrání automatizovaným nástrojům, aby se pokusily dát žalu mnoho uživatelů, a nutit uživatele, aby prokázal, že jsou lidé (nikoli robot).

Náhodnost Časově omezená adresa URL pro resetování hesla by měla zahrnovat náhodnou, nezvladatelnou součást. Ujistěte se, že používáte náhodnost v krypto kvalitě. Výstup z /dev/urandom Nebo System.Security.Cryptography.RNGCryptoServiceProvider By byl dobrou volbou. Výstup z Rand() nebo random() nebo System.Random Není dost náhodný a byl by špatnou volbou. A GUID nebo časové razítko není dost náhodné a nebylo by dobrou volbou.

Uveďte časový limit. Potvrzovací odkaz na reset by měl vypršet po uplynutí přiměřené doby: řekněme 24 hodin. Odkaz by měl být použitelný pouze jednou a měl by okamžitě vypršet, jakmile bude použit.

Vložte do e-mailu vysvětlující text. Možná budete chtít do e-mailu přidat vysvětlující text, který vysvětlí, proč byl e-mail odeslán, v případě, že někdo požádá o reset pro účet, který není váš vlastní. Mohli byste přidat nějaký text, například „Někdo požádal o obnovení hesla pro váš účet username on site. Pokud jste tento požadavek zadali, klikněte sem a změňte své heslo. Pokud jste neučinili tuto žádost kliknutím sem zrušíte. "

Po obnovení hesla odešlete e-mail. Jakmile je heslo úspěšně resetováno, pošlete uživateli e-mail, aby mu oznámil, že heslo bylo změněno. Nezahrnujte do tohoto e-mailu nové heslo.

Sledování zrušení. Možná byste měli zvážit zahrnutí nějaké logiky pro sledování frekvence, se kterou uživatelé kliknou na odkaz pro zrušení, což naznačuje, že nepožadovali reset. Pokud tato hodnota překročí určitou prahovou hodnotu, může být užitečné zaslat výstrahu operátorům systému. Také pokud je navštíven zrušovací odkaz pro některý požadavek po potvrzovacím odkazu, je to potenciální náznak útoku proti tomuto uživateli - možná budete chtít v této věci podniknout kroky např. zneplatnit heslo uživatele a požadovat, aby heslo znovu nastavili. (Jedná se o obranu proti následujícímu útoku: útočník získá přístup k poštovní schránce uživatele, poté požádá o resetování hesla na vašem webu, pak navštíví potvrzovací odkaz. Pokud útočník tyto e-maily nevymaže z doručené pošty uživatele, poté, když skutečný uživatel přečte svůj e-mail, může kliknout na odkaz pro zrušení, což vám dá náznak možného problému.)

Použijte HTTPS. Odkaz by měl používat https (nikoli http :), k ochraně před různými útoky (např. Útoky Firesheep na uživatele, kteří surfují po webu z Internetu) kavárna).

Protokolovat tyto operace. Navrhuji protokolovat všechny takové požadavky. Kromě protokolování uživatelského jména uživatele můžete chtít protokolovat IP adresu klienta, který požádal o resetovací odkaz, e-mailem uživateli, a IP adresu klienta, který navštívil resetovací odkaz.

Další čtení. Možná si také budete chtít přečíst vynikající blogový příspěvek Troy Hunt, Vše, co jste kdy chtěli vědět o vytváření bezpečné funkce obnovení hesla . Díky @coryT za odkaz na tento zdroj.

A konečně zvažte ověření bez hesla. Hesla mají mnoho problémů jako mechanismus ověřování a můžete zvážit další metody ověřování uživatelů, například uložení bezpečného perzistentní cookie na jejich stroji s neotřesitelným tajemstvím k jejich ověření. Tímto způsobem neexistuje žádné heslo, na které by bylo možné zapomenout, a žádný způsob, jak by měl být uživatel phishingem, i když musíte uživateli poskytnout způsob, jak autorizovat přístup z nového počítače nebo z nového prohlížeče (případně e-mailem uživateli předem registrovaná e-mailová adresa). Tento průzkumový dokument má vynikající přehled o mnoha metodách záložní autentizace a jejich silných a slabých stránkách.

93
D.W.

Troy Hunt má velmi pěkný zápis k této přesné otázce. Vše, co jste kdy chtěli vědět o vytváření bezpečné funkce obnovení hesla

15
coryT

Jakékoli místo, které vám může poslat heslo, znamená, že heslo nemá hash, ale uloží jej tam, kde je nějakým způsobem dešifrovatelné na „prostý text“. To samo o sobě je špatné.

Pravděpodobně ne „nejbezpečnější“, ale bezpečnější by bylo:

Na žádost o heslo zašlete uživateli odkaz s resetem hesla s vloženým GUID. Relace v GUID vyprší za, hmm, hodinu nebo tak).

9
Rich Homolka

Dobře, takže otázkou je, jak byste měli strukturovat proces obnovy hesla/účtu? To bude záviset na tom, co chcete optimalizovat: bezproblémové uživatelské prostředí nebo dobrá bezpečnost.

Pokud chcete dobré zabezpečení:

  • Během registrace musí uživatel zadat svou e-mailovou adresu.
  • Během registrace musí uživatel zadat sekundární kanál pro ověření - číslo mobilního telefonu nebo otázku a odpověď na výzvu (tj. „ jaké je vaše rodné jméno vaší matky “ nebo lepší).

  • Během zotavení váš systém nejprve získá hrubé ověření identity pomocí výše uvedeného sekundárního kanálu - výzvu nebo SMS zprávou do mobilního telefonu nebo podobně.

  • Po vymazání první kontroly totožnosti výše vyšle systém e-mail pro resetování hesla pouze na dříve zadanou e-mailovou adresu. Toto je další důležité opatření, aby se zabránilo f.x. Využívá se typu Sarah Palin .

  • E-mail nesmí obsahuje nové heslo nebo podobné. Měl by mít kliknutelný odkaz na HTTPS šifrovanou webovou stránku na vašem webu, která a) je propojena s účtem pomocí neověřitelné tajné hodnoty uvedené v URL, b ) je časově omezeno, takže obnovení účtu funguje pouze x hodin po vyžádání, c) poskytuje koncovému uživateli způsob, jak vytvořit nové heslo.

  • Dobře se přihlašujte ke všem transakcím resetování účtu a lidská bytost je musí skutečně sledovat a jednat, pokud se zdají podezřelé (podívejte se na protokoly serveru pro adresy IP fx, dochází mnoho požadavků ze stejné adresy IP, existují případy, kdy uživatel se pokouší obnovit hesla z jiné země než je registrovaný majitel účtu atd.).

Tuto složitost můžete také zcela obejít: Je to stále ještě brzy, ale OAuth/OpenID/přihlášení přes Facebook, Google atd. Tuto složitost zcela odstraňuje z vašich systémů, ale s snad méně dobře zavedenou použitelností .

9
Jesper M

Nejbezpečnější způsob, jak provést reset hesla, je vygenerovat velký náhodný jedinečný resetovací token s datem exspirace, svázaný s ID uživatele. Token by měl být v databázi hash, protože útočník s přístupem SQL by jej mohl použít k obnovení libovolných uživatelských hesel.

Na e-mailovou adresu by měl být odeslán resetovací odkaz obsahující resetovací token. Když uživatel klikne na odkaz, hash tokenu by měl být nalezen v databázi a datum vypršení platnosti by mělo být ověřeno v budoucnu. Pokud jsou tyto podmínky splněny, měl by být uživateli nabídnut obrazovka, která jim umožní zadat nové heslo.

Celý tento proces musí se provádí přes SSL, jinak by útočník mohl načichat URL a resetovat heslo dříve, než to uživatel udělá.

Několik dalších tipů:

  1. Tajné otázky zpochybňují menší nepříjemnost útočníkům a velkou nepříjemnost uživatelů. Vyhněte se jim úplně.
  2. Před odesláním nového hesla předložte uživateli výzvu k ověření člověka (např. CAPTCHA). Tím se zabrání automatickým požadavkům na reset.
  3. Zkontrolujte, zda IP adresa provádějící reset je ta, která se dříve úspěšně přihlásila k účtu. Pokud tomu tak není, zeptejte se na další podrobnosti o účtu/uživateli, např. rok vytvoření účtu, datum narození, první řádek adresy.
  4. Přidejte odkaz „Nevyžádal jsem si tento e-mail“, aby uživatelé mohli nahlásit chybné žádosti o obnovení hesla.
6
Polynomial

Jiný, který může nebo nemusí být vhodný pro vaši aplikaci, ale je používán v aplikacích online bankovnictví a podobných typech věcí, je poslat polovinu resetovacího kódu SMS zasílání zpráv na registrovaný mobilní telefon). Z pohledu útočníka je to úplná PITA, protože k rozbití vyžaduje kompromis několika kanálů.

6
Rory Alsop

2faktorová autentizace prostřednictvím SMS!! 1 znáte zákazníka a jeho mobilní číslo, SMS je jedinečný kód, který lze přidat na web k ověření, že je to: )

0
frank

Udělejte to pár kroků. Například něco takového:

  1. Uživatel odpouští své heslo. Klikne na tlačítko „Zapomněl jsem heslo, pošlete mi e-mail, co mám dělat dál“ (štítek tlačítka se může lišit;))
  2. Váš server mu pošle odkaz www.yourdomain.com/lostpassword?param_1=x;param_2=y
  3. Klikne na odkaz a dokáže si vytvořit nové heslo
  4. Klikne na odeslání. Všechno hotovo. Všichni šťastní

Jeden a jediný úlovek je v bodě 3). Hodnoty X a Y by měly být náhodné, nepředvídatelné a měly by být spojeny s tímto konkrétním účtem. Měly by být také jednorázové, a po krátké době (24 hodin?) By se měly stát zastaralými. Uložte obě hodnoty do vyhrazené tabulky s odpovídajícími sloupci:

| some_id | user_id | X | Y | expire_time

Pokud se uživatel pokusí použít správný odkaz, zkontrolujte, zda není splněna doba použitelnosti, a pokud ne, povolte mu změnu hesla.

0
Andrzej Bobak