Vraag:
Is het gebruik van de gebruikersnaam gecodeerd met het wachtwoord als sleutel een goed wachtwoordopslagschema?
Rudy
2015-09-23 16:08:27 UTC
view on stackexchange narkive permalink

Op webapplicaties die ik bouw, hasht ik de wachtwoorden niet. In plaats daarvan codeer ik de gebruikersnaam symmetrisch met het wachtwoord van de gebruiker en bewaar ik het resultaat in het wachtwoordveld. Ik gebruik RijndaelManaged op dotnet.

Bij het inloggen doe ik het opnieuw en controleer of er een match is.

Mijn vraag is, hoe veilig is dit nu wanneer steeds meer databases worden gehackt? Ik weet op geen enkel moment het echte wachtwoord van de gebruiker. Wat de hacker van db zou krijgen, is de gebruikersnaam die is gecodeerd met een onbekend wachtwoord. Met hashing is er het probleem van de regenboogtabellen, maar met deze methode niet.

Als je de gedecodeerde waarde al kent (gebruikersnaam), is het gemakkelijker om het wachtwoord te vinden?

In grote lijnen is dit hetzelfde als het gebruik van een snelle hash met de gebruikersnaam als zout. Niet verschrikkelijk onzeker, maar je kunt beter een standaardaanpak gebruiken. [Niet zelf rollen] (http://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own)
Ik begrijp het niet, als je een ander wachtwoord gebruikt dat exclusief is voor de server om de gebruikersnaam te versleutelen, en zoals je zei, je weet nooit het echte wachtwoord van de gebruiker, hoe kun je dan een bepaalde login bevestigen (met een geldige gebruiker name) wordt verzonden met het geldige wachtwoord van de gebruiker?
@WDS - Bij het inloggen doe ik het opnieuw en controleer of er een overeenkomst is.
@paj28 - Ik rol de mijne niet. Ik gebruik de klasse RijndaelManaged die door Microsoft wordt aangeboden in .Net, zelfs de implementatie daarvan is van een voorbeeld in een website met een hoge oplage. Als het is zoals je zegt: "Niet verschrikkelijk onzeker", dan ben ik er ok mee.
@Rudy - Hoewel je een bibliotheek gebruikt voor de onbewerkte crypto, ben je nog steeds aan het rollen met je eigen schema. Ik denk dat dit wordt uitgelegd als je de link voorleest, of het kan in een ander antwoord zijn dat daar naar is gelinkt.
@Rudy: Je schreef >> zelfs de implementatie ervan is van een voorbeeld in een website met een hoge oplage. << Kunt u die weblink verstrekken?
Als je out-of-the-box implementaties kunt krijgen van dingen als 'bcrypt' en zijn vrienden, waarom zou je dan tijd verspillen met het bedenken van verschillende dingen? Ik laat de experts me liever een gemakkelijke en veilige manier vertellen om het te doen en klaar te zijn met de hele zaak.
Gerelateerd: http://security.stackexchange.com/questions/73766/password-storage-self-encryption-vs-hashing
Ik begrijp dat u een gecodeerde versie van de gebruikersnaam opslaat. Slaat u de gebruikersnaam ook duidelijk op? Als u de gebruikersnaam ook duidelijk opslaat, is uw schema een beetje zwak. Als u de gebruikersnaam niet duidelijk opslaat, is uw schema erg zwak.
Bedankt allemaal voor je antwoorden. Nu weet ik dat het niet oké is en voor applicaties waartoe ik nog steeds toegang heb en voor de nieuwe die ik zal maken, zal ik ze upgraden naar scrypt of bcrypt.
Drie antwoorden:
Thomas Pornin
2015-09-23 17:36:45 UTC
view on stackexchange narkive permalink

Wat je echt doet, is hashen: je hebt een hash-functie gebouwd uit een blokcijfer. Overigens is "versleuteling van een bekende waarde met het wachtwoord als sleutel" de manier waarop het traditionele DES-gebaseerde cryptoschema voor Unix is ontworpen.

Aan de positieve kant omvat uw constructie de gebruikersnaam, die gedeeltelijk het effect van een salt: parallel kraken geeft, wordt afgeraden omdat twee gebruikers die hetzelfde wachtwoord gebruiken, uiteindelijk twee verschillende hash-outputs krijgen. "Gedeeltelijk", omdat bij het wijzigen van het wachtwoord de gebruiker zijn gebruikersnaam behoudt, dus een vorm van parallellisme is hier nog steeds mogelijk; en misschien nog belangrijker is dat dezelfde gebruikersnaam kan worden gebruikt in verschillende webapps (bijv. 'admin'), waardoor vooraf berekende tabellen de moeite waard zijn (en het punt van zout is om parallellisme te voorkomen, met name het efficiënte gebruik van vooraf berekende tabellen).

Aan de minkant:

  • Dit is een zelfgemaakte constructie. 50 jaar onderzoek in cryptografie hebben ons geleerd dat zelfgemaakte crypto zeer zelden goed is. In feite kunnen we "weten" dat een bepaald algoritme alleen correct is door jarenlange beoordeling door andere bekwame onderzoekers, en zelfgemaakte schema's hebben per definitie nooit veel aandacht gekregen.

  • Dit is beperkt. Rijndael is een blokcijfer dat sleutels tot 256 bits kan accepteren; dus als u het wachtwoord als sleutel gebruikt, moet het binnen 256 bits passen. Dit voorkomt het gebruik van zogenaamde "wachtzinnen" die sterk kunnen zijn, maar gemakkelijk te onthouden wachtwoorden door veel ruimte te gebruiken voor de entropie ervan (menselijke hersenen houden niet van geconcentreerde entropie, maar zijn blij met verdunde entropie).

  • Dit gaat veel te snel, en dit is het grootste directe probleem in uw schema. Met een standaard-pc kan een aanvaller veel wachtwoorden per seconde proberen, vooral omdat moderne pc's speciale opcodes voor AES hebben. Met een quad-core pc zou je ongeveer een half miljard moeten kunnen proberen wachtwoorden per seconde . Er zijn niet veel door de gebruiker gekozen wachtwoorden die een dergelijke aanval lang kunnen overleven.

Als je geïnteresseerd bent in hoe wachtwoordhashing werkt, lees dan dit. Het korte antwoord is echter nog steeds hetzelfde: gebruik geen zelfgemaakt schema; gebruik bcrypt.

Bedankt, ik zal meer onderzoeken over bcrypt voor dotnet.
Zoals je in het gekoppelde antwoord zegt, deelt bcrypt het beperkte invoerprobleem.
@otus: dat is waar, maar met een hogere limiet (minimaal 50 tekens, meer voor de meeste implementaties).
@otus Je kunt het beperkte invoerprobleem omzeilen door een hash van de hele string uit te voeren in een veilige hashing-omgeving die niet het beperkte invoerprobleem heeft om de entropie te condenseren en dat te versleutelen.
Ik ben het er niet mee eens dat het gebruik van een snelle hash-functie het grootste probleem is. Ik beschouw het gebruik van de gebruikersnaam als salt in plaats van een willekeurige string met hoge entropie als een groter probleem.
@kasperd: Er is geen vereiste dat salt willekeurig is als men op een andere manier kan verzekeren dat het zeer onwaarschijnlijk is dat een aanvaller die het wachtwoord kent dat is gekoppeld aan een hash + salt-paar ooit hetzelfde hash + salt-paar zal vinden dat geassocieerd is met iets anders. Willekeurigheid met lage entropie is mogelijk niet voldoende, maar willekeur met hoge entropie wel. Aan de andere kant is er geen behoefte aan * enige * willekeur als uniciteit kan worden verzekerd door andere methoden [gebruikersnaam alleen zou niet voldoende zijn, maar gebruikersnaam plus een unieke hostnaam zouden tegen alles beschermen behalve de mogelijkheid om ...
... onderzoek twee wachtwoordrecords die op verschillende tijdstippen zijn gegenereerd en zie dat ze hetzelfde wachtwoord vertegenwoordigden (dus als een gebruiker het wachtwoord "Foo" gebruikt, verandert hij het in "Bar" en vervolgens terug in "Foo", een aanvaller die kon de gehashte wachtwoorden op de verschillende tijdstippen zien, kon zien dat het wachtwoord was gewijzigd en weer teruggezet - informatie die de aanvaller niet zou moeten hebben, maar die waarschijnlijk niet direct schadelijk is).
@supercat Als de salt voorspelbaar is, kan een aanvaller hashes van veelvoorkomende wachtwoorden gaan berekenen voordat een database met gehashte wachtwoorden wordt gelekt. Dit geeft de aanvaller meer tijd om het wachtwoord te vinden dat overeenkomt met een specifieke hash dan hij zou hebben als het salt onvoorspelbaar was. Als het zout onvoorspelbaar is, heeft de aanvaller alleen de tijd tussen het lek en wordt het wachtwoord gewijzigd in brute kracht van de hash.
@kasperd: Als de aanvaller het systeem kent en een accountnaam van belang waarvoor de database gaat lekken, kan een aanvaller deze informatie gebruiken voordat hij de database ophaalt, maar in de meeste bedreigingsmodellen zou ik de waarschijnlijkheid daarvan verwachten scenario te klein om van belang te zijn in vergelijking met andere, meer ernstige risico's.
@supercat Het risico is mogelijk klein. Maar de bescherming ertegen is zo goedkoop, dat er geen excuus is om het niet goed te doen. Het komt er echt op neer om het zout willekeurig te kiezen en het zo lang te maken als de uiteindelijke hasjwaarde.
@kasperd: Als er geen goede bron van entropie is, kan het gebruik van een "puur willekeurige" salt resultaten opleveren die inferieur zijn aan het combineren van gebruikersnaam + hostnaam of gebruikersnaam + hostnaam + wachtwoordChangeDatestamp. Het zou geen kwaad kunnen om een ​​beetje extra willekeur toe te voegen aan de laatste vorm, maar ik zou het beschouwen als een voorstel van weinig kosten en weinig voordelen.
Er is nog een ander punt waarvan ik niet weet of het in deze lijst thuishoort, maar het vermelden waard is: als * ontwikkelaar * wilt u over het algemeen niet meer tijd aan elke functie besteden dan nodig is om de Product. Als een gebruikersnaamveld en een bcrypted wachtwoord "gewoon werken", waarom zou u dan klanturen verbranden door dit te doen?
@supercat U kunt enkele bytes nemen van elke willekeurige bron waartoe u toegang heeft (zelfs als ze niet erg goed zijn) en de resultaten samenvoegen met hostnaam, gebruikersnaam en tijdstempel. Een enkele hashing van de laatste aaneenschakeling levert een goed zout op. Maar als uw toegang tot entropie zo beperkt is, dan is het produceren van een goed zout het minste van uw problemen. Hoe zou je überhaupt een beveiligde verbinding opzetten om het wachtwoord te ontvangen, als je geen entropiebron hebt?
@kasperd: Veel protocollen vereisen een nonce die nooit wordt hergebruikt, maar vereist niet dat deze willekeurig is. Als men een teller heeft met een betrouwbare "increment and report" -functie [die garandeert dat een stroomuitval die verhindert dat de teller wordt verhoogd, deze ook niet gerapporteerd zal worden], dan zal een dergelijke teller voldoende zijn voor dat doel.
@supercat U zult op die manier geen voorwaartse geheimhouding bereiken.
@kasperd: Dat is waar. Verschillende applicaties hebben verschillende beveiligingseisen; Als je er zeker van wilt zijn dat niemand ooit zal kunnen ontdekken dat je de thermostaat afgelopen dinsdag op 68F hebt gezet, kan geheimhouding belangrijk zijn. Als u alleen wilt voorkomen dat andere mensen uw thermostaat veranderen, is deze wellicht minder belangrijk. Ik denk dat gedeelde geheime authenticatie veilig kan zijn tegen passieve ontdekking, zelfs tegen brute kracht, als * een van beide * kanten in staat is een bron van entropie te leveren die de aanvaller niet kent. Ik denk dat man-in-the-middle misschien een groter probleem is, maar ...
... als beide partijen een gedeeld geheim hebben, zou ik denken dat de een een entropie naar de ander zou kunnen sturen, die het vervolgens zou versleutelen met behulp van het gedeelde geheim en dat zou gebruiken bij het maken van een sessiesleutel, die vervolgens zou kunnen worden gevalideerd met behulp van het gedeelde geheim. Een MITM-aanvaller kan nep-entropie verzenden, maar zonder het gedeelde geheim te kennen, kan hij niet weten hoe hij het resultaat moet interpreteren, en als de aanvaller het gedeelde geheim heeft, hoeft een aanvaller geen nep-entropie te gebruiken.
NoAnswer
2015-09-24 15:29:09 UTC
view on stackexchange narkive permalink

De andere antwoorden zeggen al Nee, "rol je eigen" is zelden een goed wachtwoordopslagschema en die van jou is geen uitzondering.

Ik zou graag willen toevoegen: is ook geen goed schema voor het opslaan / communiceren van de gebruikersnaam.
Je bent eigenlijk aan het hashen. Daar is niets mis mee, behalve:

  • Je gebruikt een functie die niet ontworpen is als een veilige hashfunctie. Omdat het een cijfer is, is het zeker aan het "veilige" einde van de schaal, maar hashing houdt ook in dat hash-botsingen worden vermeden. Een cijfer is doorgaans niet geoptimaliseerd om geen botsing te hebben. One-Time Pads staan ​​erom bekend dat ze onbreekbaar zijn, omdat ze het maximale aantal botsingen hebben. Dus een sterk cijfer maakt een slechte hash in termen van botsingen.
  • Als je gebruikersnaam en gebruikersnaam-versleuteld-met-wachtwoord opslaat, zijn er meer kwetsbaarheden:
    • In dit geval, als je database wordt gehackt, krijgt de aanvaller niet alleen de gebruikersnaam versleuteld met een onbekend wachtwoord . Hij krijgt ook de duidelijke tekst aka. gebruikersnaam. Het is dus een duidelijke tekstanalyse, die voor sommige cijfers veel gemakkelijker is dan brute kracht.
    • Hash-botsingen: de aanvaller hoeft het wachtwoord niet te weten, maar alle die dezelfde codering produceert voor een korte en duidelijke tekst. Dit is misschien zelfs eenvoudiger dan analyse in zuivere tekst.
  • Als u de gebruikersnaam niet opslaat maar vertrouwt op één gecombineerde verzonden waarde, zijn er nog steeds nadelen:
    • In dit geval heb je waarschijnlijk geen rekening gehouden met hash-botsingen. Hoe zit het met twee gebruikers die dezelfde gebruikersnaam hebben? Hoe zit het met twee idioten, die dezelfde gebruikersnaam en hetzelfde wachtwoord hebben? Hoe zit het met hash-botsingen van verschillende gebruikersnamen en wachtwoorden door puur toeval (onthoud: cijfers zijn niet geoptimaliseerd om botsingen te voorkomen!)?
  • In elk geval is er de "Pass the hash" -aanval: een aanvaller die netwerkcommunicatie snuffelt, kan eenvoudig uw applicatie emuleren om dezelfde gegevens door te geven als de gebruiker. Heb je daar iets aan gedaan? Als dat niet het geval is, moet u daarom niet "uw eigen rol spelen".

Vaak is het overdrachtsprotocol net zo belangrijk voor de beveiliging als een sterke cryptografische functie, onafhankelijk van hashing of versleuteling. Een slecht protocol kan uw functie blootstellen aan aanvallen waarvoor het niet geschikt is, met name "side channel-aanvallen" zoals "pass the hash" of "man in the middle" die de daadwerkelijke crypto-analyse aan de kant van de aanvaller omzeilen.

Uw wachtwoordopslagschema kan vatbaar zijn voor dergelijke aanvallen, omdat u niet hebt aangegeven of de gebruikersnaam ook in gewone tekst wordt opgeslagen. Hierdoor wordt uw plan blootgesteld aan de hierboven beschreven aanvallen. Als u het niet in gewone tekst opslaat, kan een overdrachtsprotocol nodig zijn dat vatbaar is voor aanvallen, zoals hierboven beschreven.

Hier zijn enkele aanvullende gedachten over overdrachtsprotocollen in uw geval, enigszins algemeen:

Als u dat niet deed doe niets aan de "pass the hash" -aanval, dan is je plan erger dan die van heel veel andere. Een aanvaller hoeft uw database niet te hacken of uw cijfer te kraken. Hij krijgt gratis wat hij nodig heeft door netwerkverkeer te snuiven.

HTTPS kan volstaan, hoewel het kan worden omzeild door "man in the middle": gebruikers controleren niet op authenticatiecertificaten, toch? Een aanvaller opent eenvoudig een niet-geverifieerde maar gecodeerde verbinding met uw gebruiker en wat er ook maar naar u wordt verwacht.

Een extra Challenge-Response-schema kan de beveiliging toevoegen. Voorafgaand aan het inloggen ontvangt de client een eenmalige willekeurige string (challenge) die hij in de hash (response) moet inbouwen. Een aanvaller kan een gesnoven hash niet opnieuw gebruiken, omdat de uitdaging ook niet opnieuw wordt gebruikt.
Maar nogmaals, het is niet nodig om je eigen hash te rollen.

Welkom bij Security Stack Exchange. Uw antwoord toont enige goede schrijfvaardigheid en kennis. Er zijn echter enkele twijfelachtige delen. Dubbele gebruikersnamen zijn bijvoorbeeld normaal gesproken niet toegestaan. Mag ik u aanmoedigen om uw feiten opnieuw te bekijken en u op de vraag te concentreren? De vraag omvatte geen overdracht van inloggegevens, dus HTTPS en "pass the hash" zijn niet strikt relevant.
Heroverweeg de inspringing van alinea's: Meer ingesprongen opsommingstekens zijn alleen van toepassing in het geval van het vorige normale opsommingsteken, d.w.z. u kunt alleen controleren op dubbele gebruikersnamen wanneer u de gebruikersnaam in platte tekst opslaat => Platte tekst + Hash-botsingsaanvallen. De vraag specificeert niet of de gebruikersnaam in platte tekst is opgeslagen. Eigenlijk geeft het anders aan, omdat het beweert dat hackers alleen de versleutelde gebruikersnaam zouden krijgen. Dit is onjuist als de gebruikersnaam is opgeslagen. Als de gebruikersnaam niet wordt opgeslagen, ontstaan ​​er andere problemen vanwege de verzending. Als er geen overdracht is, kan elk cijfer worden geopend voor aanvallen.
Bewerkt om uw punten te verduidelijken.
Ok, dat is een verbetering. Ik heb nog steeds problemen met enkele van uw claims, maar over het algemeen is dit een redelijk antwoord. Problemen: Het is niet bekend dat duidelijke tekstanalyse een probleem is bij Rijndael; niets wat hij heeft gedaan is bijzonder slecht voor hash-botsingen; je hebt pass-the-hash herhaaldelijk genoemd, maar als webapp is het zeer waarschijnlijk dat de server een ongehasht wachtwoord over SSL neemt, dus PTH is niet van toepassing. Hoe dan ook, maak je niet al te veel zorgen, ik ben er in het verleden van beschuldigd een pedant te zijn :-)
Ik word regelmatig als pedant beschuldigd. Ik ben er trots op. Daarom denk ik dat je niets kunt weglaten, tenzij duidelijk is aangegeven dat het geen probleem is. De vraag specificeert noch opslag van gebruikersnaam, noch verzending. Er kan dus een probleem zijn. SSL zou ook in orde moeten zijn. HTTPS is problematisch voor niet-geverifieerde verbindingen. Of dat een probleem is, hangt af van de interpretatie van "webapplicatie". Ik had niet verwacht dat duidelijke tekstanalyse een probleem zou zijn. Nog steeds worden cijfers zelden geoptimaliseerd om botsingen te verminderen. Dat zijn slechts punten die in overweging moeten worden genomen, die kunnen worden overgeslagen door niet "zelf te rollen".
Oké meneer Pedant, ik denk dat u hier wel in de buurt zult zijn :-) Normaal zou ik niet zo zwaar reageren, maar uw bericht verscheen in de First Post Queue. Trouwens, als er informatie ontbreekt bij een vraag, kun je commentaar geven op de vraag en om aanvullende informatie vragen. Hoe dan ook, je hebt me gewonnen, laat je stem horen!
Laten we [deze discussie voortzetten in de chat] (http://chat.stackexchange.com/rooms/29490/discussion-between-noanswer-and-paj28).
Bristol
2015-09-23 23:23:12 UTC
view on stackexchange narkive permalink

TL; DR: gebruik scrypt. Waarom zelf rollen als er een prima standaard is?

(Ik beschouw scrypt als superieur aan bcrypt, maar bcrypt is nog steeds mijlenver beter dan zelf kweken.)

Eén ding tot nu toe ontbreekt het zich uitrekken. Stel je voor dat je wordt gehackt en dat je database in pastebin wordt gedumpt - het kan de besten van ons overkomen.

De mensen die 123456 of een van de andere top 20 wachtwoorden gebruiken, krijgen ontdekte wat je ook doet, en ze verdienen niet beter. Voor de mensen die redelijk goede wachtwoorden hebben gekozen, maakt het verschil of de tijd die de aanvaller per item moet besteden in de orde van microseconden of seconden is.

Je bent ook niet aan het zouten - stel je voor dat twee van uw webapplicaties worden gehackt en één persoon heeft accounts onder dezelfde gebruikersnaam met hetzelfde wachtwoord voor beide. Het klinkt voor mij alsof de aanvaller identieke cijferteksten krijgt in beide stortplaatsen, om hen te vertellen dat er een crack-one-get-one-free aanbieding is.

Mijn enige opmerking over de laatste alinea is deze: gebruik een ander zout voor elke site, zodat twee sites die dezelfde techniek gebruiken niet dezelfde gegevens zouden hebben :-)
@Rycochet: Um, je zou altijd een ander salt ** per wachtwoord ** moeten gebruiken (willekeurig gegenereerd via een veilige bron van willekeurige getallen), niet per site.
Dat is waar - maar je moet nog steeds een zout op een herhaalbare manier genereren - dus als dat deel wordt gegenereerd, moet de manier waarop het wordt gegenereerd anders zijn - zolang het niet hetzelfde zout is op de twee (of meer) sites, dan is dat het doel , ongeacht de gebruikte methode ;-)
Herhaalbaar? Ik weet niet zeker of ik het begrijp. Ik trek meestal wat bits uit / dev / random en bewaar ze in een aparte kolom naast hun naam; wanneer iemand inlogt, gebruik dan de naam om hun rij op te zoeken en het zout voor te lezen. Het is niet nodig om het te regenereren.


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 3.0-licentie waaronder het wordt gedistribueerd.
Loading...