@Cyperfriend
Nein, das ist so nicht richtig! Ein salt schützt durchaus auch wenn der Angreifer DB + Scripte in die Finger kriegt. Hier auch noch mal der Link zu einem guten Text dazu:
http://crackstation.net/hashing-security.htm
Um das kurz zu erklären:
Der salt schützt vor einem Angriff mit Rainbow Tables. Ein Hash ist ein Einweg-Operation. Die Idee dabei ist, das man aus einem Text einen Hash errechnen kann, aber niemals umgekehrt. Das soll verhindern, dass jemand der die DB hat an das Klartext Passwort kommt, welches u.U. auch wo anders benutzt wird.
Nehmen wir an, der Benutzer nutzt das Passwort 'password'. Den daraus errechneten SHA256 hash '5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8' speicherst du dann in der DB.
Der Angreifer hat nun das '5e884...', kann jedoch daraus nicht das 'password' errechnen. Er kann jedoch einen Brute Force Angriff machen, und z.B. anhand eines Passwort-Wörterbuchs (Also ein Liste mit
sehr vielen möglichen passwörten) einfach für alles in der Liste den Hash errechnen. Steht in dieser Liste nun 'password' und er errechnet daraus '5e884...', und vergleich das mit dem '5e884...' in der DB, stellt er fest, dass das identisch ist, und er kennt das Klartextpasswort.
Nun kostet er Rechenzeit so einen Hash zu errechnen. Will ich also nun z.B. alle möglichen 8-stelligen Passwörter errechnen, wäre das ein unrealistischer Aufwand! Der trick hierzu ist nun die Rainbow table. Stelle dir eine Tabelle vor, mit sämtlichen 8-stelligen Zeichenketten, und den dazugehörigen hashes. Diese Tabellen sind teilweise mehrere TB gross, aber wenn man sie mal hat, muss man nurnoch den Hash aus der liste nehmen, und schon hat man das Passwort dazu.
Hier kommt nun der Salt ins Spiel. Hier kommen z.B. so den 8 Stellen vom Passwort noch die 100 vom Salt dazu.
Also, quasi statt das du den hash von 'password' errechnest, errechnest du den von 'password012345678901234567890123456789012345678901234567890'.
Eine so grosse Rainbow-Table ist weder machbar, noch könnte man sie irgendwo speichern, da sie schlicht zu gross wäre!
Hast du jedoch nur einen Salt für alle User, wäre es möglich eine Rainbow-table genau für diesen Salt zu errechnen. Dass ich also statt den hash für 'a' den für 'aMEINSALT' errechne. den hash nur für 'a' müsste ich ja nicht errechnen. Das reduziert wieder die Grösse der Rainbow-Table und macht ein errechnen der Rainbow-Table möglich. Mit dieser Rainbow-Table wäre es nun möglich, an die Klartest-Passwörter
sämtlicher Benutzer von dir zu kommen!
Deswegen: Generiere für jeden User einen eigenen Salt (sollte lang sein) und speichere den in der DB.
Von der Idee her, musst du dann wenn ein User sich einloggen will, erstmal den salt aus der DB holen, und machst dann ein hash('sha512', salt + password) und vergleichst das Ergebnis mit dem Passwort in der DB. Das MD5 würde ich übrigens weglassen, wenn du auf SHA512 setzt. Bringt dann auch keine zusätzliche Sicherheit.
Um der Wahrheit genüge zu tun:
Kryptografie und Sicherheit sind keine einfachen Themen. Dazu kommt, dass es oftmals falsch gemacht wird. Ich habe auch schon eine Software von einem IT Professor gesehen, die alle Passwörter im Klartext speichert, und sogar noch eine ungeschützte API anbietet, auf der man diese manipulieren könnte. Und nein, dies war kein Studienprojekt sondern eine Produktiv im Einsatz befindliche Webseite, bei der es um Kreditkartendaten ging!
Was du aber immer beachten musst, das schlimmste was passieren kann, ist nicht das jemand in deine Applikation kommt, sondern das ein User die gleiche Username-Passwort kombination für PayPal o.ä. nutzt, und der Angreifer über dich an diese Daten kommt! Von daher befreit dich auch die Tatsache das deine Applikation ja unkritisch ist, nicht vor einem vertrauensvollen Umgang mit Passwörtern.