Зашифровать пароль перед сохранением в базе данных? - PullRequest
6 голосов
/ 20 октября 2010

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

Переменная $ pass заполняется следующим образом:

$pass = str_replace("'", "", $_REQUEST['pass']);

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

Спасибо всем.

Ответы [ 7 ]

7 голосов
/ 20 октября 2010

Хотя ответ, приведенный ниже, технически все еще корректен, у php есть новые рекомендации относительно используемых алгоритмов хеширования. Их рекомендация с php> = 5.5.0 - использовать функции password_hash и password_verify для хеширования и проверки хешированных паролей. В качестве дополнительного преимущества эти функции автоматически включают индивидуализированную соль как часть возвращаемого хэша, поэтому вам не нужно об этом беспокоиться явно. <ч /> Если вам не нужно извлекать фактическое значение пароля (из зашифрованного значения базы данных), вы можете запустить односторонний алгоритм хеширования (например, sha1). Эта функция будет возвращать строку определенной длины (хеш), которую нельзя использовать для поиска исходной строки (теоретически). Возможно, что две разные строки могут создать один и тот же хеш (называемый коллизией), но это не должно быть проблемой с паролями.
Пример: $pass = sha1($_REQUEST['pass']);

Одна вещь, чтобы сделать ее немного более безопасной, это добавить соль в хеш и снова запустить хеш-функцию. Это затрудняет злонамеренное создание хэша пароля, поскольку солт-значение обрабатывается только на стороне сервера.
Пример: $pass = sha1(sha1($_REQUEST['pass']).sha1("mySalt@<em>$#</em>(%"));

7 голосов
/ 20 октября 2010

Используйте библиотеку php's crypt .Md5 - это не шифрование, это хеширование.

Кроме того, соль ваши пароли. Почему?

2 голосов
/ 21 октября 2010

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

$salt = md5(unique_id().mt_rand().microtime());
$pass = sha1($salt.$_REQUEST['pass']);

и сохраните $ salt и $ pass в базе данных. Затем, когда они заходят в систему, вы просматриваете их строку и проверяете хеш:

$user = query('SELECT * FROM `user` WHERE username = ?', array($_REQUEST['username']));

if($user)
{
    // If the password they give maches
    if($user->pass === sha1($user->salt. $_REQUEST['pass']))
    {
        // login
    }
    else
    {
        // bad password
    }
}
else
{
    // user not found
}

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

1 голос
/ 20 октября 2010

Используйте crypt с солью. Такие как

$user = strip_tags(substr($_REQUEST['user'],0,32));
$plain_pw = strip_tags(substr($_REQUEST['pass'],0,32));

$password = crypt(md5($plain_pw),md5($user));

как на http://www.ibm.com/developerworks/opensource/library/os-php-encrypt/

1 голос
/ 20 октября 2010

Самое основное: хешировать его с помощью MD5 или SHA1

$newpass = md5($_REQUEST['pass']);

или

$newpass = sha1($_REQUEST['pass']);

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

Вы можете "засолить" хэши дополнительными данными, поэтому, если они скомпрометированы, их значение не может быть найдено (попробуйте поискать в гугле несколько простых хэшированных слов) .. т.е. используйте строку для всего сайта, чтобы просто изменитьстандартный хеш типа md5("mySiteSalt!!" . $_REQUEST['pass']); или что-то более продвинутое.

0 голосов
/ 21 октября 2010

Чтобы узнать, почему md5, sha1 и их быстрые друзья не могут быть хорошей идеей, вы должны прочитать пост Достаточно с таблицами Радуга: что вам нужно знать о безопасных схемах паролей by Thomas Ptacek , Суть:

Наконец, мы узнали, что если мы хотим надежно хранить пароли у нас есть три разумные варианты: схема PHK MD5, Схема Bocrypt Провоса-Мазьера и SRP. Мы узнали что правильно выбор Bcrypt.

Примечание: это PHK, а не php.

0 голосов
/ 20 октября 2010

Вы должны использовать SHA1 для хэширования ваших паролей для хранения в базе данных. Это самый простой, но самый эффективный способ хранения паролей:

$password = sha1($password);

Это также исключительно безопасно. Хотя его целостность начинает сказываться, довольно просто обновить эту функцию до SHA-256 (что невероятно безопасно).

...