Citat:
Ursprungligen postat av anders.n
Citat:
Ursprungligen postat av eg0master
Efetrsom MD5 är en envägsfunktion så har du ingen nytta av MD5 hashen när du ska lista ut lösenordet. Du kan inte göra någon form av analys av hashen som hjälper dig att hitta lösenordet. Det enda du kan göra är att pröva alla möjliga lösenord. Att du har hashen betyder bara att du vet när du ska sluta (precis som om du har en robot som försöker logga in genom att prova olika lösenord).
|
Dock så är det viktigt att man använder någon form av "salt" också, då det finns färdiga rainbow tables (för-uträknade hashsummor) för olika hash-algoritmer. Har man även med ett bra "salt" när man lagrar hashet så måste man brute-forcea lösenorden.
Sedan är det ju alltid bra att tvinga användarna att ha relativt säkra lösenord också. 
|
*Hugger ett inlägg från högen*
Först av allt, som flera redan nämnt är det bra att skapa krypterade lösenord. Först för att man vet att flera använder samma lösenord till allt möjligt och sen även för att minimera skadan ifall någon skulle komma åt databasen.
Massa folk pratar om "bra salt". Vad är salt för något? 2 stycken slumpmässiga ASCII-tecken. Iallafall ifall man pratar om salt till crypt()-funktionen. (PHP använder ju unix-standardlibbet för det).
Om du i php kör crypt("foobar") så klämmer den dit 2 stycken tecken som salt. Vilka? Ja de får man reda på genom att titta på det krypterade lösenordet. Är krypterade lösenordet "RS4CNv1lS3cLo" så har saltet varit "RS". Salt är ju inte på något sätt hemligt. Snarare tvärtom. Det är allmänt känt.
Därför är det viktigt att när man ska KRYPTERA lösenordet så ska man inte använda samma lösenord som salt. Betrakta liten visning i python:
>>> from crypt import crypt
>>> crypt("foobar","RS")
'RS4CNv1lS3cLo'
>>> crypt("foobar","foobar")
'foa3VCPbMb8XQ'
>>>
(Cryptmodulen i python använder samma libbar som crypt() i php)
Som vi kan se.. så är första lösenordet "foobar" krypterat med salt RS. Vi fick RS4CNv1lS3cLo. Andra lösenordet är krypterat med "foobar" som salt, eller rättare sagt "fo". Som vi kan se börjar den andra krypterade strängen med "fo" i så fall och kan avslöja hur vårt lösenord börjar. (Ja förutsatt man har tillgång till koden och kan se denna miss).
Så i och med att crypt krypterar alltid likadant ifall man använder samma salt är ju det sättet det enda vi kan verifera lösenord.
Med andra ord... crypt("foobar", $cryptedpwd) använder första två tecken från $cryptedpwd som salt till att kryptera foobar. Är "foobar" rätt lösenord så ska resultatet bli samma som $cryptedpwd.
Med andra ord. "Bra salt" som någon skrev är allt förrutom de första två bokstäverna på lösenordet.
Det finns INGET sätt att dekryptera lösenordet. PUNKT. Det finns sätt att gissa dåliga lösenord (brute force), och det är inget som kan hindra en från att göra det mer än att ha databasen skyddad och kanske tillåta max 3 felaktiga loginförsök på en timma.
Om det är någon som känner eller tror att jag har fel där kan denne gärna försöka dekryptera:
BassB1YipTunI
Så personligen tycker jag inte något finns att säga emot crypt() när det kommer till UNIX. På Windows vet jag ärligt talat inte, men jag bryr mig inte heller. Den tar jag inte ens i med tång för att inte tala om att försöka implementera ens låtsassäkerhet.
/Zoran