Безопасный способ хранения расшифрованных паролей - PullRequest
8 голосов
/ 31 марта 2010

Я делаю приложение на PHP, и существует требование, чтобы была возможность расшифровать пароли, чтобы избежать проблем в будущем с переключением пользовательской базы данных на другую систему. Учтите, что невозможно изменить метод паролей этой будущей системы, и мне нужны обычные текстовые пароли для генерации паролей.

План состоит в том, чтобы зашифровать пароль пользователя с помощью открытого ключа, который хранится на сервере. Аутентификация выполняется путем шифрования входных данных и сравнения результатов. Нет расшифровки. Закрытый ключ, способный к расшифровке, хранится вне сайта для дальнейшего использования.

Какой алгоритм шифрования / дешифрования вы бы предложили? Являются ли зашифрованные пароли такими же безопасными, как хеширование (MD5 / SHA1), если вы считаете, что закрытый ключ недоступен для злоумышленника?

Ответы [ 5 ]

8 голосов
/ 01 апреля 2010

Я перефразирую подход Джаммера -

  1. Создание пары открытый / закрытый ключ. Жесткий код открытого ключа на вашем веб-сервере. Храните закрытый ключ в физическом банковском шкафчике, вне досягаемости веб-сервера / базы данных / любого разработчика.
  2. Когда пользователь регистрируется, зашифруйте пароль + соль с помощью открытого ключа. Этот шаг идентичен использованию алгоритма хеширования. Храните зашифрованный пароль + соль в базе данных.
  3. Если вы хотите проверить пароль, снова зашифруйте его и сравните со значением, хранящимся в базе данных.

Если злоумышленник получает базу данных, он не может расшифровать пароли, поскольку у него нет личного ключа. Он не может получить закрытый ключ, потому что он находится в банковском хранилище вне его досягаемости. Два идентичных пароля по-прежнему будут храниться в базе данных по-разному из-за соли.

Я не рекомендую использовать вышеуказанный подход, потому что в любой момент в будущем кто-то может злоупотребить закрытым ключом и получить доступ ко всем паролям.

Но если вы гарантируете, что закрытый ключ всегда будет закрытым, то я не вижу технического недостатка.

Конечно, я могу ошибаться.

4 голосов
/ 01 апреля 2010

Не расшифровывать пароль. Если вам необходимо изменить систему паролей в будущем, добавьте поле с именем storage_type (или любым другим).

Затем, когда вам нужно изменить пароли, вы проверите, является ли это старым паролем. Если это так, при следующем входе в систему вы можете изменить кодировку пароля. В противном случае войдите в систему с новой системой.

2 голосов
/ 01 апреля 2010

Возможность расшифровывать пароли - плохая идея (и, вероятно, нет способа сделать это лучше, чем хранить их в незашифрованном виде). Похоже, вашей главной проблемой является возможность использования паролей, если вы измените свой метод хранения. Просто делайте то, что делает Linux, сохраняйте, как вы хэшируете пароль с паролем. Например, $ 1 $ salt $ hash - это MD5. Таким образом, если вы решите изменить способ хранения паролей, вы все равно сможете проверить старые пароли (и, если кто-то войдет в систему правильно, вы сможете обновить свой пароль с новым хэшем).

1 голос
/ 02 апреля 2010

Единственная проблема, которую я вижу, состоит в том, что большинство кодов шифрования с открытым-закрытым ключом шифруют симметричный ключ с использованием открытого ключа и полагаются на его расшифровку, а затем используют симметричный ключ для шифрования сообщения.

Вы хотите использовать открытый ключ для прямого шифрования пароля + соли.

Таким образом, атаки на вашу систему сводятся к:

  1. Атаки против общего шифрования с открытым / закрытым ключом
  2. Атаки против вашего хранилища закрытых ключей.
0 голосов
/ 01 апреля 2010

Для большинства приложений более чем достаточно хранить хэши паролей SHA-1.

Да, в большинстве алгоритмов хеширования есть известные коллизии, но это не означает фактический вектор атаки. Особенно, когда вы солите хеш.

Для вашего удобства: сохраните его в файле конфигурации, который недоступен извне, но может быть прочитан вашей установкой PHP.

...