Det är bra att använda sig av iterationer i samband med hashing. Man gör det inte enbart för att det skall 'se komplicerat och ut'. Och som i detta fallet där man endast gör det tre gånger så ser jag en liten fördel, men inte jättestor.
Det jag brukar vilja ha i ett lösenordssystem är dessa komponenter:
lösenord,användarsalt,systemsalt,iterationer,sammansättning,hashalgoritm,versionshantering
En annan sak jag noterar är att md5 används. md5 rekommenderas inte eftersom den är "knäckt". Använd Sha512 eller bättre istället.
Lösenord
Ditt system bör se till att användarna har valt ett bra lösenord. Du kan sätta riktlinjer i samband med registrering exempelvis. Minst 8 tecken, minst 1 siffra, minst en versal, ej endast versaler, etc.
Användarsalt
Ett långt salt för varje användare. 128 tecken är en bra start. Här skall hela teckenuppsättningen användas. Detta salt lagras förmodligen i databasen.
Systemsalt
Ett långt som är samma för alla användare (det kan dock variera även bland användare om du använder versioner). 128 tecken är en bra start. Här skall hela teckenuppsättningen användas. Detta är ett salt som är lagrat i applikationen. Ofta kanske säkerhetshålet gör att man kommer åt antingen databasen eller applikationskoden, men båda delar är inte lika vanliga. Därför vill man lägga ett salt i databasen och ett salt i applikationen.
Iterationer
Man vill göra många iterationer, kanske flera tusen. Detta gör man inte för att det i sig är jättemycket säkrare, utan man gör det för att hashningen av lösenordet skall ta lång tid. För när man kör brute force eller liknande så får man testa sig fram, och man vill att varje test för en eventuell hacker skall ta lång tid. Så även om han har alla komponen
r, det hashade lösenordet, alla salt och sammansättningen så skall det ta lång tid att få fram ursprungslösenordet.
Sammansättning
Hur man skapar sitt hashade lösenord kan variera, och det bör variera. Detta eftersom det för en hackare är en okänd komponent som behövs för att knäcka ett lösenord. Ibland vill man kanske köra hash(hash(password)+salt+systemsalt), ibland vill man köra hash(systemsalt+password+salt), och många gånger mycket mer komplext än mina två exempel. Här blandar du även in iterationerna. Du kan ju välja att lägga iterationerna på en liten del, eller på hela delen.
Hashalgoritm
Här finns mängder. MD5, sha1, sha512, etc. Du bör välja en som är känd (försök inte att bygga en egen). Eftersom det tar längre tid att hasha en sträng med sha512 än med sha1 så rekommenderas sha512 i de flesta fall.
Versionshantering
Du vill kunna byta algoritm vid behov. Kanske kör du på sha1 och när den sedan "knäcks" (eller datorerna blir snabbare så det går fort med brute force), så kanske du vill byta till en annan hashalgoritm.
En annan fördel är att man har olika versioner för olika användare, vilket gör att om en hackare lyckas komma över ett lösenord för en användare, så kan inte samma metod användas för att knäcka lösenordet för nästa användare.