Moin!
Ich würde das so machen:
md5($pw.'dc237üsjü29');Jedes Pw mit dem gleichen Salt der normal im Quelltext steht.
Aber ist das sicher genug?
Der Salt bei jedem gleich und als Klartext im PHP Quelltext?
Und ist md5 sicher genug?
Erstmal zu MD5: Wenn du nichts besseres hast, ist MD5 immer noch sicher genug. Aber eigentlich überall, wo MD5 existiert, existiert auch SHA-1. Das macht längere Hashes und deshalb mehr Aufwand.
Längere Hashes sind immer besser. SHA256, SHA384 oder SHA512 stehen dir in PHP zur Verfügung, wenn die Erweiterung "Hash" integriert ist.
Zum Salt: Man muß davon ausgehen, dass ein Angreifer in jedem Fall den Salzwert in Erfahrung bringen kann. Ein konstanter Wert bietet ihm den Vorteil, dass er nicht für jedes Passwort komplett neu suchen muß, sondern die gesamte Passworttabelle in einem Abwasch durchchecken kann. Er prüft dann alle generierten Passworte mit 1, 2, 3, ... X Zeichen (oder Wörterbuchtabellen) plus dem Salt (egal ob es vorn oder hinten angehängt wird) - der dadurch generierte Hashwert wird dann mit allen verfügbaren Passworthashes verglichen, anstatt nur mit genau einem.
Sofern sich in der Datenbank überhaupt irgendein brute-force-knackbares Passwort befindet (dem kannst du durch eine geeignete Prüfung entgegenwirken: Mindestlänge und z.B. müssen auch Ziffern enthalten sein), ist ein konstantes Salt natürlich nicht so schön.
Da du das Salt aber ja nicht mehr aus dem Hashwert zurückrechnen kannst, mußt du auch ein pro Passwort zufällig generiertes Salt irgendwo im Klartext abspeichern - das würde also dem Angreifer ebenfalls in die Hände fallen, wenn er den Passworthash abgreifen kann. Und es vergrößert seinen Aufwand nur marginal: Statt z.B. alle 50 Accounts mit einmal Rechnen zu checken, muß er jeden Account einzeln checken - also wird er vermutlich 50 Rechner benutzen. Böse Angreifer haben sowas, oder können es sich beschaffen.
DIe Kontodaten würde ich gerne anders verschlüsseln.
Ich generiere einen zufälligen schlüssel, mit diesem Schlüssel verschlüssel ich wiederum die Daten per Blowfish mit diesem Skript, das heißt also wenn jemand dieses Skript auch hat, und weiß das die Daten Blowfish sind und die Schlüssel aus der anderen Tabelle hat, hat er die Passwörter.
http://php-einfach.de/sonstiges_generator_blowfish.php
Den Schlüssel speicher ich in einer extra Tabelle, allerdings in der selben Datenbank.
Ist dies sicher? Oder sollte ich dort lieber Hash+Salt oder eine andere Verschlüsselungsmethode verwenden?
Bei reversibler symmetrischer Verschlüsselung hast du das grundsätzliche Problem, dass du auf dem System, was die Verschlüsselung herstellt, alle Zutaten vorliegen haben mußt, mit dem man auch wieder Entschlüsseln kann. Im Falle eines Eindringens von Unbefugten sind also im Prinzip alle Daten als kompromittiert anzusehen.
Die einzige Lösung dagegen wäre ein asymmetrisches Verfahren wie PGP bzw. GnuPG. Hier gibt es einen öffentlichen Schlüssel, mit dem man verschlüsselt, und einen ganz anderen, privaten Schlüssel, mit dem man den Inhalt wieder entschlüsseln kann. Sofern du also nicht darauf angewiesen bist, an die Kontodaten auch vom Server her wieder heranzukommen, könnte sich diese Methode anbieten.
Andererseits: Wenn du serverseitig nicht an die Kontodaten ran mußt, dann müssen die auch nicht auf dem Server liegen. Was wiederum eher dagegenspricht, dass du serverseitig nicht ran mußt.
Andererseits: Kontodaten sind nicht unbedingt als supergeheim anzusehen, sie sind durch den alltäglichen Zahlungsverkehr eigentlich weiträumig bekannt - wenngleich nicht der gesamten Welt, so aber doch einer ausreichenden Zahl von Menschen. Das Abgreifen dieser Daten wäre also zwar extrem ärgerlich, aber von weitaus geringerem Übel als der Verlust des Passwortes.
Nichtsdestotrotz solltest du den Aufwand gerne so hoch wie möglich treiben.
- Sven Rautenberg
"Love your nation - respect the others."