PHP und selbst MySQL bieten von sich aus genügend Möglichkeiten, um Passwörter (oder andere Zugangsdaten) zu speichern. Dabei spielt es keine Rolle, ob eine Verschlüsselung (eine Entschlüsselung ist möglich) oder lediglich eine Verschleierung (Bildung eines Hashs) stattfinden soll.
Auf webmasterpro.de oder php-einfach.de sind Beispiele zur Hash-Bildung unter PHP zu finden. Dies ist ein einfacher und zugleich relativ sicherer Weg, um Zugangsdaten per Hash zu speichern.
Per Hash abgelegte Daten können allerdings nicht wiederhergestellt werden. Um Daten zu kodieren und später wieder zu entschlüsseln, sind Verschlüsselungsalgorithmen wie AES oder (der veraltete) DES nötig. MySQL bietet AES bereits von Haus aus an, was das Verschlüsseln eigentlich recht einfach macht. Mit
SELECT AES_ENCRYPT('secret', 'my_salt');
kann bereits eine verschlüsselte Zeichenkette erzeugt werden. Mit
UPDATE table SET value_crypt = AES_ENCRYPT('secret','my_salt');
wird der verschlüsselte String secret in der Datenbank gespeichert, verstärkt durch den Salz my_salt. Dabei spielt es keine Rolle, ob das Passwort-Salz aus einem Datenbank-Datensatz oder per PHP aus einer externen Datei kommt. Wichtig ist aber, dass das Salz möglichst lang ist (bspw. 1024 Zeichen). Auslesen bzw. Entschlüsseln funktioniert mittels der Funktion AES_DECRYPT():
SELECT CAST(AES_DECRYPT(cryptedValue, 'my_salt') AS CHAR) AS decrypted;
Der CAST ist bei Verwendung im PHP-Kontext dringend nötig, wie die Praxis (nicht nur bei mir) zeigt.
Die Techniken lassen sich natürlich beliebig kombinieren. So verwende ich das Hashing per PHP-crypt() bei reinen Zugangskontrollen (Login in Anwendung XY), da dort keine Dechiffrierung nötig ist. Die Verschlüsselung per AES (MySQL) mit per PHP eingebundener Salz-Datei kommt (zusätzlich) in Systemen zum Einsatz, bei denen die Wiederherstellung der (Zugangs-)Daten auf einfache Weise benötigt wird, z.B. einer Passwortverwaltung.
Vielen Dank!
Das war genau das, was ich gesucht hatte. Zwar versucht man, die Files und die MySQL-Daten so gut zu schützen, dass eine Verschlüsselung „eigentlich“ nicht notwendig wird, aber mir lag dennoch daran, bestimmte Felder so zu verschlüsseln, dass ich diese wieder entschlüsseln kann.
Evtl. wäre als Ergänzung noch der Hinweis sinnvoll, dass in der MySQL der Typ nicht auf varchar, string o. ä. stehen darf, sondern auf varbinary stehen muss, damit es funktioniert.