Little America - Officiell trailer Apple TV

När du lagrar användaruppgifter i en databas vet vi alla att hashning av lösenordet är det minsta du bör göra, men att salta det innan hashing är bättre. Saltet ska genereras slumpmässigt, tillräckligt långt och unikt för varje användare.

Jag minns att jag läste någonstans (men jag kommer inte ihåg var) en artikel om att använda två salter (både tillräckligt långa och slumpmässigt genererade):

  1. Ett globalt salt
  2. Ett unikt salt per ingång

Den resulterande hash skulle vara: hash(globalSalt + password + uniqueSalt) (ordningen för sammankoppling är inte riktigt viktig).

Finns det någon anledning till att detta skulle vara säkrare än att bara ha ett unikt salt per post? Vi antar att angriparen har tillgång till kodfilerna där det globala saltet lagras.

Jag skrev ett svar, läste sedan lite mer och redigerade mitt svar substatiskt. Denna fråga har redan diskuterats i Stack Overflow. Det accepterade svaret på denna fråga är en bra utgångspunkt, följ länkarna.

Min uppfattning är att:

Det statiska saltet (som du kallar globalt) är något värdefullt för:

  • Det är enkelt att implementera och kräver ingen databasuppslag vid körning, det vill säga det är lätt att skala.
  • Detta salt är statiskt och kan lagras som en global konstant i applikationskoden eller läsas från en INI-fil. Det här sättet att få tillgång till databasen (till exempel SQL-injektionsattack) avslöjar inte nödvändigtvis detta salt.

Saltet per lösenord är viktigt eftersom:

  • Det är en slumpmässig sträng, unik för varje lösenord, som genereras på serversidan och lagras i klartext i databasen. För N-lösenord gör detta effektivt det totala sökutrymmet för en regnbågstabell som bifogas N x N. Detta kan inte effektivt angripas av förberäknade regnbågstabeller idag på grund av datamängden.

Ett annat användbart tips som jag lärde mig från Stack Overflow-diskussionerna är att kryptera Användarnamn om möjligt. Jag hade faktiskt inte tänkt på det, men det är naturligtvis bra i vissa scenarier.

REDIGERA: Vänligen läs den utmärkta artikeln "Nog med regnbågens bord: vad du behöver veta om säkra lösenordsscheman". Det mesta av det som sägs om lösenordshashing är fel, inklusive hela "MD5 / SHA256 med salt" -metod som ofta används.

  • Tack för länken och kommentarerna. Jag tittade lite på SO, men tänkte att den här typen av frågor hör hemma här.
  • Den främsta anledningen till att salta lösenord är att "salta jorden" för angripare som får tillgång till din webbserver och DB. Om allt du gör är det statiska saltet kan du inte vara säker på att lösenorden inte dekrypteras enkelt. Om webserverkoden lagras i klartext (PHP, Python, Ruby etc.) kommer saltet att hittas och utnyttjas med ett enda regnbågstabell. Om du gör ett salt per konto måste de bygga ett regnbågsbord PER LÖSENORD som blir omöjligt. Vissa angripare har mycket tid på sina händer så även detta kan brytas. Salter per konto köper fortfarande dina användare en stund.
  • Gareth Farrington: Jag håller med. Min poäng är huvudsakligen att (a) att få tillgång till databasfilen och webbserverkoden är två olika saker, tänk SQL-injektionsattack mot ett 2-nivåssystem, och (b) hela saltdiskussionen är mindre viktigt än att "använda en säkert system designat av någon annan och peer reviewed 'som artikeln "Enough With The Rainbow Tables".

Detta har ganska mycket redan blivit ombedd på StackOverflow: Dubbelsalt för hashing-lösenord?

Jag läste just den här frågan och den påminde mig om en fråga som jag skrev på SO för ungefär ett år sedan: Omfattande information om hasjsalter. Du kan vara intresserad av att läsa igenom frågan och svaren eftersom den har annan information som kan vara mycket användbar för alla som är intresserade av att lära sig lite mer om hash.

Jag bör också notera att implementering av användarautentisering i allmänhet inte är något som du verkligen vill ta itu med på egen hand om du kan undvika det. Kom ihåg att inte uppfinna hjulet på nytt, såvida du inte planerar att lära dig mer om hjul.

fungerat för dig: Charles Robertson | Vill du kontakta oss?

Användbar information