Я подаю заявку в PHP и существует требование, чтобы было возможно дешифровать пароли для предотвращения проблем в будущем с переключающейся пользовательской базой данных к другой системе. Полагайте, что не возможно изменить метод пароля этой будущей системы, и мне нужны незашифрованные пароли, чтобы генерировать пароли.
План состоит в том, чтобы зашифровать пароль пользователя с открытым ключом, который хранится на сервере. Аутентификация сделана путем шифрования входа и сравнения результатов. Нет НИКАКОГО сделанного дешифрования. Закрытый ключ, способный к дешифрованию, хранится удаленный для более позднего использования.
Какой алгоритм шифрования/дешифрования Вы предложили бы? Зашифрованные пароли все еще так же безопасны как хеширующий (MD5/SHA1), когда Вы полагаете, что закрытый ключ не доступен взломщику?
Возможность расшифровывать пароли - плохая идея (и, вероятно, нет способа сделать это лучше, чем хранить их в незашифрованном виде). Похоже, ваша основная проблема заключается в возможности использовать пароли, если вы измените метод хранения. Просто делайте то, что делает Linux, храните, как вы хешируете пароль с паролем. Так, например, $ 1 $ salt $ hash - это MD5. Таким образом, если вы решите изменить способ хранения паролей, вы все равно сможете проверить их на соответствие старым паролям (и, если кто-то войдет в систему правильно, вы сможете обновить его пароль с новым хешем).
Не расшифровывать пароль. Если вам нужно будет изменить систему паролей в будущем, добавьте поле с именем storage_type (или что-то еще).
Затем, когда вам нужно изменить пароли, вы проверите, является ли это старым паролем. Если это так, то при следующем входе в систему можно изменить кодировку пароля. В противном случае войдите в новую систему.
Единственная проблема, которую я вижу, это то, что наиболее общедоступные- Код шифрования с закрытым ключом будет шифровать симметричный ключ с помощью открытого ключа и полагаться на его расшифровку с помощью закрытого ключа, а затем использовать симметричный ключ для шифрования сообщения.
Вы хотите использовать открытый ключ, чтобы напрямую зашифровать пароль + соль.
Итак, атаки на вашу систему сводятся к:
Для большинства приложений более чем достаточно хранить хэши паролей SHA-1.
Да, в большинстве алгоритмов хеширования есть известные конфликты, но это не означает реального вектора атаки. Особенно когда солишь хеши.
Для вашего удобства: сохраните его в файле конфигурации, который недоступен извне, но может быть прочитан вашей установкой PHP.
Я перефразирую подход Джаммера -
Если злоумышленник получит базу данных, он не сможет расшифровать пароли, потому что у него нет закрытого ключа. Он не может получить закрытый ключ, потому что он находится в банковском хранилище вне его досягаемости. Два идентичных пароля по-прежнему будут храниться в базе данных по-разному из-за соли.
Я не рекомендую использовать описанный выше подход, потому что в любой момент в будущем кто-то может злоупотребить закрытым ключом и получить доступ ко всем паролям.
Но если вы гарантируете, что закрытый ключ всегда останется закрытым, я не вижу технической ошибки.
Я, конечно, мог ошибаться.