2010-10-20 2 views
6

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

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

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

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

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

+0

Несвязанный: используйте правильное входное экранирование и не полагайтесь на 'str_replace', чтобы отфильтровать все апострофы. – knittl

+0

это приложение iPhone, прошедшее через URL-адрес скрипта. – BigMike

+0

Также см. Раздел «Переносимая хеширование паролей PHP» (http://www.openwall.com/phpass/) (PHPass). Он затвердел против ряда распространенных атак на пароли пользователей. – jww

ответ

6

Если вы не заботитесь о получении значения фактического пароля (от зашифрованного значения базы данных), вы можете запустить односторонний хэш-алгоритм на него (например, sha1: http://php.net/manual/en/function.sha1.php). Эта функция вернет определенную длину строки (хэш), которая не может быть использована для поиска исходной строки (теоретически). Возможно, что две разные строки могут создать один и тот же хэш (называемый столкновением), но это не должно быть проблемой с паролями.
Пример: $pass = sha1($_REQUEST['pass']);

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

+1

Это не соль. Соль не одинакова для каждого пользователя приложения. Вместо этого он зависит от пользователя. – middus

+0

Я использовал этот. Он работает и не нуждается в сверхкритичности. – BigMike

1

Самое основное: хэш его с MD5 или SHA1

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

или

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

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

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

+2

md5 не предназначен для шифрования. – Chris

+1

@Chris Для записи хеширование - это форма шифрования (хотя и односторонняя). Несмотря на это, MD5 никогда не должен использоваться для хранения паролей. С сегодняшними радужными столами он так же хорош, как и открытый текст. – mattbasta

+0

Никогда не говорил, что хеширование - это не форма шифрования, я только что сказал, что md5 не для шифрования. Итак, почему вы предлагаете использовать md5 для «шифрования» паролей OP. По крайней мере, объясните в своем ответе, прежде чем создавать другого пользователя с запутанным чувством безопасности, используя md5 для шифрования паролей. – Chris

0

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

$password = sha1($password); 

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

+0

SHA1 слишком быстр. См. Ссылку в моем ответе. – middus

+0

@middus Это, конечно, слишком быстро, но на 30% больше места, чем MD5, поэтому по крайней мере таблицы больше. Кроме того, если у кого-то есть достаточный доступ к вашей базе данных для сбора хешированных паролей, скорее всего, они могут украсть много другой незашифрованной информации. SHA1 не «отлично», но он будет работать в 95% сценариев. – mattbasta

0

Чтобы узнать, почему md5, sha1 и их скоростные друзья не могут быть хорошей идеей, вы должны прочитать сообщение Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes Thomas Ptacek. Суть:

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

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

2

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

$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 
} 

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

Смежные вопросы