PHP bietet da mehrere Möglichkeiten. Eine davon wäre z.B. MD5.
Andere sind natürlich auch verwendbar. Wichtig ist meiner Meinung nach, dass keine "Entschlüsselung" des Passworts möglich ist, man als nur mit Checksummen arbeitet. In diesem Zusammenhang sollte man auch immer mit einem Salt arbeitet.
Für Passwörter nimmt man Hashing, keine Verschüsselung, da du die Passwörter ja nicht wieder zurückschlüsseln willst. Und auf jeden Fall SHA anstatt MD5 nutzen. MD5 ist mittlerweile reproduzierbar!
"Es ist aber dank der Kollisionsangriffe in vielen Fällen möglich, zwei Dokumente zu erstellen, die den gleichen MD5-Hash ergeben, dann das erste, legitime Dokument signieren zu lassen, und anschließend dieses durch das zweite, gefälschte Dokument auszutauschen. Vor diesem Hintergrund ist von einer Weiterverwendung von MD5 abzuraten." - Wikipedia
Hier also SHA256 oder SHA512 nutzen und diese Hashes dann in der Datenbank ablegen. Bei erneuter Eingabe des Passworts machst du darauf ebenfalls wieder einen SHA Hash und vergleichst diesen mit den, der in der Datenbank hinterlegt ist.
Die Frage ist ob du verschlüsseln oder hashen möchtest. Mußt du das Klartextpasswort nochmal entschlüsseln können, musst du eine (symmetrische) Verschlüsselung nehmen, siehe zum Beispiel: http://de3.php.net/manual/en/book.mcrypt.php
Solltest du das Kennwort nicht wieder entschlüsseln müssen, sondern mußt später nur wissen ob ein vom Nutzer eingegebenes Passwort mit dem gespeicherten übereinstimmt, dann solltest du einen Hash-Algorithmus nutzen, wenn es geht nicht MD5, sondern direkt SHA1 oder noch besser SHA2, wie bereits gesagt mit einem Salt und eventuellen Runden (also statt einmal SHA2 darauf anzuwenden hashst du es einfach 1000 Mal): http://de3.php.net/manual/en/book.hash.php
um etwaigen md5 reverse datenbanken zuvor zu kommen, habe ich mir als best practise angewöhnt immer die kombination aus benutzernamen und passwort als md5 zu speichern. also angenommen der benutzername ist fritz und das passwort walter, mache ich ein´ md5 über den string "fritzwalter", weil die wahrscheinlichkeit einfach geringer ist, dass dieser "lange string" in solchen datenbanken existiert. (das jemand den namen walter als ge-md5-tes passwort in einer reverse datenbank gespeichert hat, ist dann noch nicht gerade unwahrscheinlich ...)
aber zur eigentlichen frage :) :
bei postgres könnte man das dann z.b. so machen (da bringt die datenbank die funktionalität schon mit):
insert into meinebenutzer (name, pwd) values ('fritz', md5('fritz' || 'walter'));