Vraag:
Kan iemand referenties geven voor het correct implementeren van mechanismen voor het zelf opnieuw instellen van wachtwoorden van webtoepassingen?
bdg
2011-01-28 04:39:03 UTC
view on stackexchange narkive permalink

We implementeren het zelf opnieuw instellen van het wachtwoord in een webtoepassing en ik weet hoe ik dat wil doen (URL voor het opnieuw instellen van het wachtwoord met beperkte tijd voor e-mail naar het vooraf geregistreerde e-mailadres van de gebruiker).

Mijn probleem is dat ik geen referenties kan vinden om de ontwikkelaars te wijzen op het gebruik van die techniek. Kan iemand mij wijzen in de richting van enkele goede referenties over deze techniek?

Welke programmeertaal gebruik je?
Zie ook een [soortgelijke vraag] (http://stackoverflow.com/q/664673/10080) op SO.
Zie: [Wachtwoord vergeten · OWASP Cheat Sheet-serie] (https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html)
Acht antwoorden:
D.W.
2011-01-30 12:05:38 UTC
view on stackexchange narkive permalink

Enkele suggesties:

Stel het wachtwoord van de gebruiker niet opnieuw in totdat het is bevestigd. Stel het wachtwoord van de gebruiker niet onmiddellijk opnieuw in. Stel het pas opnieuw in als de gebruiker op een bevestigingslink klikt die naar zijn vooraf geregistreerde e-mailadres is verzonden.

Een CAPTCHA vereist. Wanneer een gebruiker vraagt ​​om zijn wachtwoord opnieuw in te stellen, forceer hem dan om een ​​CAPTCHA op te lossen voordat u verder gaat. Dit is bedoeld om te voorkomen dat geautomatiseerde tools veel gebruikers verdriet proberen te bezorgen, en de gebruiker te dwingen te bewijzen dat ze een mens zijn (geen robot).

Willekeurig. De beperkte tijd URL voor het opnieuw instellen van een wachtwoord moet een willekeurig, niet te raden onderdeel bevatten. Zorg ervoor dat u willekeurigheid van cryptokwaliteit gebruikt. De uitvoer van / dev / urandom of System.Security.Cryptography.RNGCryptoServiceProvider zou een goede keuze zijn. De uitvoer van rand () of random () of System.Random is niet willekeurig genoeg en zou een slechte keuze zijn. Een GUID of tijdstempel is niet willekeurig genoeg en zou geen goede keuze zijn.

Voeg een tijdslimiet toe. De bevestigingslink voor het opnieuw instellen moet na een redelijke tijd verlopen: bijvoorbeeld 24 uur . De link mag slechts één keer bruikbaar zijn en moet onmiddellijk vervallen zodra deze wordt gebruikt.

Voeg een verklarende tekst toe aan de e-mail. Misschien wilt u wat verklarende tekst toevoegen aan de e-mail, om uit te leggen waarom de e-mail is verzonden, voor het geval iemand een reset aanvraagt ​​voor een account dat niet van jou is. U kunt tekst toevoegen zoals "Iemand heeft gevraagd om het wachtwoord opnieuw in te stellen voor uw account gebruikersnaam op site . Als u dit verzoek heeft gedaan, klikt u hier om uw wachtwoord te wijzigen. Als u heeft dit verzoek niet gedaan, klik hier om het verzoek te annuleren. "

Stuur een e-mail nadat het wachtwoord opnieuw is ingesteld. Zodra het wachtwoord is gereset, stuurt u een e-mail naar de gebruiker naar laat hen weten dat het wachtwoord is gewijzigd. Voeg het nieuwe wachtwoord niet toe aan die e-mail.

Annuleringen controleren. U kunt overwegen wat logica op te nemen om te controleren hoe vaak gebruikers op de annuleringslink klikken om aan te geven dat ze geen reset hebben aangevraagd. Als dit boven een bepaalde drempel uitkomt, kan het handig zijn om een ​​waarschuwing te sturen naar de netbeheerders. Ook als een annuleringslink voor een bepaald verzoek wordt bezocht nadat de bevestigingslink is bezocht, is dat een mogelijke indicatie van een aanval op die gebruiker - misschien wilt u op dat moment actie ondernemen, bijvoorbeeld ongeldig maken het wachtwoord van de gebruiker en vereisen dat ze hun wachtwoord opnieuw instellen. (Dit is een verdediging tegen de volgende aanval: de aanvaller krijgt toegang tot de mailbox van de gebruiker, vraagt ​​vervolgens om het wachtwoord op uw site te resetten en bezoekt vervolgens de bevestigingslink. Als de aanvaller deze e-mails niet uit de inbox van de gebruiker verwijdert, wanneer de echte gebruiker zijn e-mail leest, kan hij op de annuleringslink klikken, waardoor u een indicatie krijgt van mogelijke problemen.)

Gebruik HTTPS. De link moet https gebruiken (niet http :), ter bescherming tegen verschillende aanvallen (bijv. Firesheep-aanvallen op gebruikers die op internet surfen vanuit een internetcafé).

Log deze bewerkingen. Ik raad aan om al dergelijke verzoeken te loggen. Naast het loggen van de gebruikersnaam van de gebruiker, wil je misschien het IP-adres van de client die om een ​​reset-link heeft gevraagd, per e-mail naar de gebruiker sturen, evenals het IP-adres van de client die de reset-link heeft bezocht.

Meer lezen. Misschien wil je ook de uitstekende blogpost van Troy Hunt lezen, Alles wat je ooit wilde weten over het bouwen van een veilige functie voor het opnieuw instellen van wachtwoorden. Met dank aan @coryT voor een link naar deze bron.

Ten slotte overweeg authenticatie zonder wachtwoord. Wachtwoorden hebben veel problemen als authenticatiemechanisme, en u zou andere methoden kunnen overwegen om gebruikers te authenticeren, zoals het opslaan van een veilige permanente cookie op hun computer met een niet te raden geheim om ze te authenticeren. Op deze manier is er geen wachtwoord om te vergeten en kan de gebruiker geen phishing krijgen, hoewel u een gebruiker wel een manier moet bieden om toegang te verlenen vanaf een nieuwe machine of een nieuwe browser (mogelijk via e-mail naar de pre- geregistreerd e-mailadres). Dit enquêtedocument bevat een uitstekend overzicht van veel alternatieve verificatiemethoden en hun sterke en zwakke punten.

+1, merk ook op dat hoewel het populair is (zoals blijkt uit de meeste foute antwoorden [op deze SO-vraag] (http://stackoverflow.com/q/664673/10080)), een GUID * niet * willekeurig genoeg is . Ik zou ook gewoon een beperkingsmechanisme toevoegen, d.w.z. een gebruiker kan niet vragen om zijn wachtwoord opnieuw in te stellen, bijv. 3000 keer in een uur.
Om mijn gesprek met @avid bij zijn antwoord op die vraag samen te vatten, zou ik zeggen dat een GUID van versie 4 inderdaad grotendeels willekeurig is, en [ik denk dat het lang genoeg is] (http://security.stackexchange.com/questions/ 1952 / how-long-a-random-nonce-be). Maar het is waarschijnlijk gek en een beetje gevaarlijk om te gebruiken, omdat het oorspronkelijk niet voor de taak was ontworpen. En wie weet waar uw code vervolgens wordt geporteerd?
Het lijkt er niet op dat "Als u dit verzoek niet heeft gedaan, klik hier om het verzoek te annuleren" nodig zou zijn voor de e-mail.
@nealmcb Hier is een link van een man van het C # -compilerteam die praat over GUID's en die heel sterk vermeldt dat GUID's op geen enkele manier cryptografisch willekeurig zijn: http://blogs.msdn.com/b/ericlippert/archive/2012/05 /07/guid-guide-part-three.aspx - er was een andere studie die aantoont dat Windows GUID's niet cryptografisch willekeurig zijn: http://www.gotdotnet.ru/blogs/denish/1965/ - Conclusie: niet doen gebruik GUID's voor cryptografische doeleinden :) (ik weet niet of een niet-Windows-besturingssysteem garanties biedt in dat aspect, maar Unices hebben meestal zowel / dev / random als / dev / urandom)
Hoeveel tekens moet het willekeurige gedeelte zijn?
"Voeg het nieuwe wachtwoord niet toe aan die e-mail." Als u het wachtwoord van de gebruiker in duidelijke tekst heeft, doet u het verkeerd.
@DavidMurdoch, 64-80 bits zouden voldoende moeten zijn voor het willekeurige gedeelte. (40 bits zou eigenlijk waarschijnlijk genoeg zijn voor dit doel, maar waarom zou je risico's nemen?)
AilighlwfoCMT See the link I posted above for more on D.W.'s answer (i.e. that a nonce of 64 bits is probably fine for this purpose): [How long should a random nonce be? - IT Security](http://security.stackexchange.com/questions/1952/how-long-should-a-random-nonce-be)
@MichaelStum Bedankt voor de links, en zoals ik al zei is het een slechte keuze. Maar wat betreft het inschatten van het werkelijke risico, hielp Google translate niet veel met dat Russische bericht van Nikolay Denishchenko over zoiets als "Device and cryptanalysis UUID-Generator for Windows". Kun je de resultaten samenvatten in termen van hoeveel onvoorspelbare stukjes entropie hij denkt dat Windows versie 4 GUID's hebben, en hoe moeilijk het zou zijn om ze op afstand te raden?
coryT
2012-07-20 02:11:58 UTC
view on stackexchange narkive permalink

Troy Hunt heeft een heel mooie beschrijving van deze exacte vraag. Alles wat je ooit wilde weten over het bouwen van een veilige functie voor het opnieuw instellen van wachtwoorden

Troy's blog is een geweldige bron voor alles wat met webbeveiliging te maken heeft
Jesper Mortensen
2011-04-05 14:25:56 UTC
view on stackexchange narkive permalink

OK, dus uw vraag is: hoe moet u het proces voor wachtwoord- / accountherstel structureren? Dat hangt af van waarvoor u wilt optimaliseren: probleemloze gebruikerservaring of goede beveiliging.

Als u een goede beveiliging wilt:

  • Tijdens het aanmelden moet de gebruiker zijn e-mailadres invoeren.
  • Tijdens het aanmelden moet de gebruiker een secundair kanaal invoeren voor authenticatie: mobiel telefoonnummer of uitdagingsvraag &-antwoord (bijv. " wat is de meisjesnaam van je moeder "of beter).

  • Tijdens het herstel krijgt je systeem eerst een ruwe identiteitsverificatie door middel van het bovenstaande secundaire kanaal - de uitdaging vraag, of door een code naar de mobiele telefoon of iets dergelijks te sms'en.

  • Wanneer de eerste identiteitscontrole hierboven is voltooid, stuurt het systeem een ​​e-mail voor het opnieuw instellen van het wachtwoord alleen naar het eerder ingevoerde e-mailadres . Dit is een aanvullende, belangrijke maatregel om f.x. exploits van het type Sarah Palin.

  • De e-mail mag geen een nieuw wachtwoord of iets dergelijks bevatten. Het moet een klikbare link bevatten naar een HTTPS-gecodeerde webpagina op uw site die a) aan het account is gekoppeld via een niet-radenbare geheime waarde in de URL, b) is in de tijd beperkt, dus het accountherstel werkt slechts x uur nadat het werd aangevraagd, c) biedt de eindgebruiker een manier om een ​​ nieuw wachtwoord aan te maken.

  • Zorg voor een goede logboekregistratie bij alle accountresettransacties, en laat een mens deze daadwerkelijk controleren en handelen als ze verdacht lijken (kijk in de serverlogboeken voor de IP-adressen fx, veel verzoeken komen van hetzelfde IP-adres, zijn er gevallen waarin een gebruiker wachtwoorden probeert te resetten uit een ander land dan dat van de geregistreerde accounteigenaar, enz.).

U kunt deze complexiteit ook helemaal omzeilen: het is nog pril, maar OAuth / OpenID / inloggen via Facebook, Google enz. verwijdert deze complexiteit volledig uit uw systemen, maar met een misschien minder gevestigde bruikbaarheid.

Uitdagingsvragen zijn het tegenovergestelde van beveiliging.
@DavidMurdoch: kunt u een referentie geven die dit bespreekt? Ik zou er graag meer over willen lezen.
@David Murdoch: De uitdagingsvragen zijn equivalent aan wachtwoorden - maar de belangrijkste vraag is: wat? In mijn schema ontgrendelen ze een wachtwoordherstelmechanisme dat (vermoedelijk) * niet onder de controle van de aanvaller staat *; het originele e-mailadres. Maar waar, mechanismen voor het opnieuw instellen van wachtwoorden ruilen over het algemeen verminderde beveiliging in voor meer bruikbaarheid, misschien had ik dat duidelijker moeten maken.
Merk op dat hier in de oogverblindende toekomstige wereld van 2015 het gebruik van een telefoonnummer als onderdeel van een MFA-regeling een beetje uit elkaar is gevallen, aangezien hetzelfde kleine, losse apparaat dient als toegangspoort tot zowel e-mail als sms.
Rich Homolka
2012-07-23 22:18:52 UTC
view on stackexchange narkive permalink

Elke plaats die je een wachtwoord kan sturen, betekent dat ze het wachtwoord niet hashen, maar opslaan waar het op de een of andere manier kan worden ontsleuteld tot 'leesbare tekst'. Dit op zichzelf is slecht.

Waarschijnlijk niet "meest" veilig, maar veiliger zou zijn om:

Na wachtwoordverzoek een wachtwoordherstellink naar de gebruiker te sturen met ingesloten GUID. De sessie in de GUID verloopt over, hmm, uur of zo.

Yeah no issues with it as I have session protected from SQL injection, so I send mail with well randomised password reset session code and allow hour to change it, that's OK.
AilivsqpglCMT - You should allow the user to select the new password not send it to them, as already explained, if your able to send the password to the user there is something broken about your security model.
This website currently generates a NEW password, sends by email, hash it and store in db, which is not good I believe.
het genereren van een wachtwoord en het niet laten verlopen bij de volgende verbinding is inderdaad een slecht idee.
Als deze GUID in platte tekst is, kan deze worden verkregen met sql-injectie en dan verslaat je het hele doel van wachtwoordhashing. Dit bericht is een gevaarlijke suggestie door middel van dubbelzinnigheid.
Dus ik moet een goed gerandomiseerde sessiecode voor het opnieuw instellen van het wachtwoord coderen en in een venster van 1 uur daarna wijzigingen toestaan ​​- geen probleem.
Rory Alsop
2011-01-31 01:58:25 UTC
view on stackexchange narkive permalink

Een andere die al dan niet geschikt is voor uw toepassing, maar die wordt gebruikt in toepassingen voor internetbankieren en dergelijke, is om de helft van de resetcode per sms naar een geregistreerde mobiele telefoon te verzenden. Vanuit het perspectief van een aanvaller is dit een complete PITA, aangezien er een aantal kanalen moet worden gecompromitteerd om te breken.

Polynomial
2012-07-24 01:31:29 UTC
view on stackexchange narkive permalink

De veiligste manier om een ​​wachtwoordreset uit te voeren, is door een grote willekeurige unieke eenmalige reset-token te genereren, met een vervaldatum, gekoppeld aan de gebruikers-ID. Het token moet in de database worden gehasht, aangezien een aanvaller met SQL-toegang het kan gebruiken om willekeurige gebruikerswachtwoorden opnieuw in te stellen.

Er moet een reset-link naar het e-mailadres worden gestuurd dat het reset-token bevat. Wanneer de gebruiker op de link klikt, moet de hash van het token in de database worden gevonden en moet de vervaldatum worden geverifieerd als in de toekomst. Als aan deze voorwaarden is voldaan, moet de gebruiker een scherm te zien krijgen waarop hij een nieuw wachtwoord kan typen.

Dit hele proces moet worden uitgevoerd via SSL, anders een aanvaller kan de URL opsnuiven en het wachtwoord resetten voordat de gebruiker het doet.

Een paar andere tips:

  1. Geheime vragen een kleine ergernis voor aanvallers en een grote ergernis voor gebruikers. Vermijd ze volledig.
  2. Stel de gebruiker voor met een menselijke verificatie-uitdaging (bijv. Een CAPTCHA) voordat het wachtwoord opnieuw wordt ingesteld. Dit voorkomt geautomatiseerde resetverzoeken.
  3. Controleer of het IP-adres dat de reset uitvoert, het IP-adres is dat eerder met succes op het account is ingelogd. Is dit niet het geval, vraag dan wat meer details over het account / de gebruiker, bijv. aanmaakjaar van account, geboortedatum, eerste adresregel.
  4. Voeg een link 'Ik heb niet om deze e-mail gevraagd' toe, zodat gebruikers foutieve verzoeken voor wachtwoordherstel kunnen rapporteren.
  5. ol >
Zelfs als het wordt gegenereerd via SSL: u bent niet verzekerd dat de e-mail zelf wordt verzonden via SSL en dus heeft deze methode een enorme fout tijdens het transport - de basisfout van het doorsturen en ophalen van e-mail.
@EvanCarroll "_de basisfout van e-mail doorsturen en ** ophalen ** ._" met betrekking tot e-mail ** ophalen **: het is de verantwoordelijkheid van de gebruiker om een ​​e-mailhersteladres te gebruiken van een e-mailprovider met POPS, IMAPS of HTTPS-webmailondersteuning (en de meeste e-mailproviders bieden ze alle drie tegenwoordig).
AiliuofzxeCMT Whilst it's not an ideal situation, security is *always* secondary to usability. If you implement the world's most secure browser login, but it requires JavaScript, Flash, Java, ActiveX, Silverlight, and a degree in Computer Science to use, your users will switch off. Email is the de-facto standard for this kind of functionality, primarily because it's usable by everyone. The burden of security on a user's email system and personal network is *not* with me, nor should it be.
AiliagebleCMT if plausible deniability is your goal, then yes. If security is your goal, then no.
@polynomial "de-facto" standaarden hebben niets met beveiliging te maken. Dat is slechts een argument om de status-quo te handhaven zonder rekening te houden met de gevolgen voor de veiligheid.
AilizpoykkCMT The argument for the status quo is that there is no acceptable alternative.
I agree with your answer, but why would you include the user-id into the link? If for example this user-id is an 8 character number, these 8 characters are equally easy to guess, as 8 additional random characters in your token. With the random characters you would not expose the user-id though.
AilidikupuCMT True, but exposing the user ID isn't usually a big deal. You're likely to do it through the interface to your site anyway - look at StackExchange. Question 17542, answer 17547, your comment is 28508, you're user 8343, I'm user 5400, OP is user 10787. Trying to hide that info is difficult and would only introduce obscurity. In this case, though, the tokens should be unique, so the search should always return a single row regardless of whether the user ID is in the link.
frank
2011-04-06 10:36:01 UTC
view on stackexchange narkive permalink

2-factor authenticatie via sms! 1 je kent de klant en zijn gsm-nummer, sms hem een ​​unieke code om toe te voegen aan de website om te valideren dat hij het is :)

Dat is niet per se een 2-factoroplossing, maar het is out-of-band.
Tot iemand zijn telefoon steelt.
Andrzej Bobak
2012-07-24 19:28:06 UTC
view on stackexchange narkive permalink

Maak er een paar stappen van. Bijvoorbeeld zoiets als dit:

  1. Gebruiker is zijn wachtwoord vergeten. Hij klikt op de knop "Ik ben mijn wachtwoord vergeten, stuur me een e-mail wat ik nu moet doen" (knoplabel kan verschillen;))
  2. Je server stuurt hem een ​​link www.uwdomein.com/lostpassword?param_1 = x; param_2 = y
  3. Hij klikt op de link en kan zelf een nieuw wachtwoord aanmaken
  4. Hij klikt op verzenden. Alles klaar. Iedereen tevreden

Een en enige vangst is in punt 3). X- en Y-waarden moeten willekeurig en onvoorspelbaar zijn en aan dit ene specifieke account zijn gekoppeld. Ze mogen ook slechts voor eenmalig worden gebruikt en moeten na een korte tijd (24 uur?) Oud worden. Sla beide waarden op in een speciale tabel met de bijbehorende kolommen:

  | some_id | user_id | X | Y | expire_time  

Als een gebruiker de juiste link probeert te gebruiken, controleer dan of de vervaltijd niet gehaald is en zo niet, laat hem dan het wachtwoord wijzigen.

Hoe verschilt dit van de andere antwoorden? Het heeft geen voordeel om zowel X als Y te hebben, gebruik gewoon een enkele willekeurige waarde.
OK cool, but how it's secure agaist SQL Injection? Is it because of dedicated table?
@Polynominal één waarde is gemakkelijk te doorbreken via een brute force-aanval.
AilinxcuxoCMT you prevent yourself from an sql injection in a complete different way. It's how you filter user input and how you pass it to your queries.
@AndrzejBobak: Twee waarden zijn even gemakkelijk door brute kracht te breken als een waarde die twee keer zo lang is als een van beide.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 2.0-licentie waaronder het wordt gedistribueerd.
Loading...