Лучший способ хранения паролей в базе данных MYSQL

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

+23
10 февр. '13 в 13:34
источник поделиться
6 ответов

Во-первых, md5 и sha1 оказались уязвимыми для атак на столкновение и могут быть легко добавлены радугой (когда они видят, что ваш хэш одинаковый в своей базе данных общих паролей).

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

Первое - это sha512. sha512 является под-версией SHA2. SHA2 еще не доказано, что он уязвим для столкновений, а sha512 будет генерировать 512-битный хеш. Вот пример как использовать sha512:

<?php
hash('sha512',$password);

Другой вариант называется bcrypt. bcrypt славится своими безопасными хэшами. Это, вероятно, самый безопасный и самый настраиваемый.

Прежде чем вы начнете использовать bcrypt, вам нужно проверить, включен ли ваш сервер, Enter этот код:

<?php
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
    echo "CRYPT_BLOWFISH is enabled!";
}else {
echo "CRYPT_BLOWFISH is not available";
}

Если он вернет, что он включен, то следующий шаг будет прост. Все, что вам нужно сделать, чтобы выполнить bcrypt пароль (обратите внимание: для большей настраиваемости вам нужно увидеть это Как сделать вы используете bcrypt для хеширования паролей в PHP?):

crypt($password, $salt);

Соль обычно представляет собой случайную строку, которую вы добавляете в конце всех своих паролей, когда вы их используете. Использование соли означает, что если кто-то получает вашу базу данных, они не могут проверить хеши для общих паролей. Проверка базы данных вызывается с использованием таблицы радуги. Вы всегда должны использовать соль при хешировании!

Вот мои доказательства уязвимостей атаки SHA1 и MD5:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html, http://eprint.iacr.org/2010/413.pdf,
http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf,
http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf и
Понимание слабости столкновений sha-1

+34
10 февр. '13 в 13:40
источник

Хеширующие алгоритмы, такие как sha1 и md5, не подходят для хранения паролей. Они разработаны, чтобы быть очень эффективными. Это означает, что грубое форсирование происходит очень быстро. Даже если хакер получает копию ваших хешированных паролей, довольно быстро переборщить ее. Если вы используете соль, это делает таблицы радуги менее эффективными, но ничего не делает против грубой силы. Использование более медленного алгоритма делает грубую силу неэффективной. Например, алгоритм bcrypt можно сделать так медленно, как вы хотите (просто измените коэффициент работы), и он использует соли внутри, чтобы защитить от радужных таблиц. Я бы пошел с таким подходом или подобным (например, scrypt или PBKDF2), если бы я был вами.

+3
10 февр. '13 в 13:39
источник

Связанные вопросы


Похожие вопросы

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

+2
10 февр. '13 в 13:40
источник

Пароли в базе данных должны храниться в зашифрованном виде. Рекомендуется одностороннее шифрование (хеширование), такое как SHA2, SHA2, WHIRLPOOL, bcrypt DELETED: MD5 или SHA1. (те, кто старше, уязвим

В дополнение к этому вы можете использовать дополнительную генерируемую пользователем произвольную строку - "соль":

$salt = MD5($this->createSalt());

$Password = SHA2($postData['Password'] . $salt);

createSalt() в этом случае является функцией, которая генерирует строку из случайных символов.

EDIT: или если вы хотите больше безопасности, вы можете даже добавить 2 соли: $ salt1. $pass. $Salt2

Еще одна мера безопасности, которую вы можете предпринять, - это инактивация пользователя: после 5 (или любого другого номера) неправильных попыток входа пользователь блокируется в течение минут (15 минут можно сказать). Это должно свести к минимуму успех нападений грубой силы.

+1
10 февр. '13 в 13:40
источник

лучше всего использовать crypt для хранения паролей в DB

пример кода:

$crypted_pass = crypt($password);

//$pass_from_login is the user entered password
//$crypted_pass is the encryption
if(crypt($pass_from_login,$crypted_pass)) == $crypted_pass)
{
   echo("hello user!")
}

:

http://www.php.net/manual/en/function.crypt.php

0
10 февр. '13 в 13:42
источник

Вы должны использовать одностороннее шифрование (что является способом шифрования значения, поэтому его очень сложно отменить). Я не знаком с MySQL, но быстрый поиск показывает, что у него есть функция password(), которая делает именно такое шифрование. В БД вы храните зашифрованное значение, и когда пользователь хочет пройти аутентификацию, вы берете пароль, который он предоставил, вы шифруете его с использованием того же алгоритма/функции, а затем вы проверяете, что это значение совпадает с паролем, хранящимся в базе данных, для этого пользователя. Это предполагает, что связь между браузером и вашим сервером безопасна, а именно, что вы используете https.

0
10 февр. '13 в 13:43
источник

Посмотрите другие вопросы по метке или Задайте вопрос