Шифрование базы данных - php / mysql - PullRequest
2 голосов
/ 14 марта 2011

У меня есть некоторые сомнения относительно лучшего способа сделать базу данных с паролями. Мне нужно шифрование паролей, но если я использую MD5, я не могу восстановить пароль, не так ли?

А кодировщик base64? это безопасно? с этим шифрованием восстановление больше не проблема.

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

Спасибо !!!

Если кто-нибудь знает хорошее руководство по безопасным паролям в базе данных, я действительно ценю это

Ответы [ 7 ]

4 голосов
/ 14 марта 2011

если я использую MD5, я не могу восстановить пропуск, не так ли?

Действительно, если вы хешируете свой пароль, используя md5 или sha1 (добавление соли хорошая идея, кстати) , вы не сможете восстановить пароль; и это цель этого!

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


как лучше? мы предпочитаем решение, которое позволяет помните старый проход и не определяйте новый пароль.

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

Таким образом, вы гарантируете, что никто не сможет получить дамп ваших логинов и соответствующий пароль; что сделает ваш сервис более безопасным для ваших пользователей (особенно если учесть, что многие люди используют одну и ту же пару логин / пароль на нескольких сайтах) .

2 голосов
/ 14 марта 2011

MD5 используется не для шифрования (что означает, что его можно расшифровать), а скорее для переваривания / хэширования сообщений.Base64 - это также не шифрование, а кодирование, которое можно легко декодировать.

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

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

1 голос
/ 14 марта 2011

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

Теперь, что касается вашего точного вопроса, есть несколько способов решить его.

  1. Зашифруйте свои пароли с помощью надежного шифра, чтобы вы могли расшифровать их при необходимости.Для этого может подойти решение , такое как в этом посте .Тем не менее, обратите внимание, что это не очень хорошая идея, так как, если ваша система когда-либо будет взломана, все пароли будут утечки (никогда не хорошая идея).Существует очень немного вариантов использования, в которых имеет смысл хранить их в зашифрованном виде, но если вам абсолютно необходимо , используйте для этого надежную процедуру криптографического шифрования ...

  2. Храните ваши пароли, используя надежный односторонний метод хеширования.Нет, md5($password) недостаточно хорош.Но ни один не sha1($salt . $password).Первый тривиален для поиска большинства паролей , а второй может быть взломан за разумное время простым методом проб и ошибок.Вместо этого итеративно растягивайте ваши пароли .Лучше всего использовать стандартную функцию PBKDF2 для создания надежного одностороннего ключа из пароля.

    Что касается восстановления, если пользователь забыл пароль, не беспокойтесь об этом.Если пользователь забывает свой пароль, создайте новый и передайте его пользователю.Это стандартный для отрасли способ работы с забытыми паролями (черт возьми, и Windows, и Mac делают это так).Вы можете подумать, что вы делаете своим пользователям одолжение, отправляя их им, но все, что вы делаете, это отключаете любого, кто имеет представление о безопасности при каждом использовании вашего приложения (и делает лот людей сумасшедших, если тебя скомпрометируют).

0 голосов
/ 14 марта 2011

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

Кроме того, для паролей вы должны в любом случае искать bcrypt или аналогично медленные хеш-функции для паролей вместо использования алгоритма быстрого хеширования, такого как MD5 или SHA.

0 голосов
/ 14 марта 2011

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

$salt = $_POST['password'];
$hash = sha1( $salt . $_POST['password'] );
0 голосов
/ 14 марта 2011

Вам никогда не нужно запоминать пароль пользователя - это является нарушением его доверия и создает дыру в безопасности.

Обычно вы хэшируете пароль с помощью MD5 (в наши дни лучше использоватьSHA-2), и когда пользователь отправляет свой пароль, чтобы попытаться войти в систему, также хешируйте этот пароль и посмотрите, совпадают ли хэши.

Для дополнительной безопасности вы можете создать «соль»столбец в базу данных и генерировать случайную соль при первом введении пароля.Добавьте соль в начало пароля, а затем хэшируйте его.Сохраните хэш соли + пароль и соль вместе.Теперь, когда пользователь вводит свой пароль для входа в систему, вы объединяете его с солью, хэшируете его и проверяете, совпадает ли хэш.

Соль гарантирует, что, если несколько пользователей имеют один и тот же пароль (шансыесли они это сделают), их хэши паролей не будут идентичны.

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

0 голосов
/ 14 марта 2011

base64 не является «шифрованием». Он предназначен для преобразования двоичных данных в формат, безопасный для передачи через потенциально «сломанные» системы электронной почты, которые не могут правильно обрабатывать 8-разрядные двоичные данные. Это лучший эквивалент кольца декодера для зерновых.

Если вам нужно шифрование, есть AES, DES и другие доступные функции. Проблема в том, что если ваш код может расшифровать пароль, злоумышленник может понять, как вы это делаете, и / или подорвать ваш код, чтобы сделать это для них.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...