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