Давайте уточним кое-что здесь: Сервер должен иметь возможность восстановить незашифрованный пароль.
Рассмотрим некоторые вещи, которые вы можете сделать:
- Зашифруйте паролис ключом.Сохраните ключ в файле конфигурации.
- Зашифруйте пароли с помощью смарт-карты / черного ящика.
- Зашифруйте / расшифруйте пароли с помощью другого сервера, отправив запросы HTTPS.
- Зашифруйте ключ ключом в оперативной памяти.Используйте mlock (), чтобы предотвратить его замену на диск.Надеюсь, что вам не нужно перезапускать.
Ни один из них не поможет вам, если у атакующего есть root (но ничего нет).Большинство из них не помогут вам, если злоумышленник отключит питание и украдет коробки (оперативная память не такая энергонезависимая, как вам хотелось бы для этой цели).
От каких атак вы пытаетесь защищаться?Какие атаки вы игнорируете?
Одной из возможностей является шифрование паролей с помощью ключа, полученного из пароля пользователя (например, связка ключей OSX и эквивалентное хранилище паролей Windows, которое никто не использует).Когда пользователь вошел в ваш веб-сервис, вы можете сохранить ключ в сеансе (или XOR его с помощью одноразовой панели и сохранить панель в файле cookie, и восстанавливать ключ только тогда, когда пользователь отправляет запрос).Это делает кражу внешних паролей из резервной копии базы данных как минимум такой же трудной, как взлом пароля пользователя.Хотя это не очень помогает против других.