2013-03-19 6 views
0

Когда пользователь пытается войти в систему, существует два способа проверить, является ли пользователь действительным или нет.Лучше проверить имя пользователя и пароль или просто имя пользователя?

Метод 1: Выполните следующий запрос и проверить количество возвращаемых строк идентична 1.

SELECT * FROM users WHERE username = $_POST['username'] AND password = md5($_POST['password']) 

Способ 2: Выполните запрос, а затем проверить матч паролей.

SELECT * FROM users WHERE username = $_POST['username'] 

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)){ 
    if($row['password'] == md5($_POST['password'])) $logged_in = TRUE; 
} 

Является ли один из этих методов предпочтительным по сравнению с другим? И если да, то почему?

ответ

4

Используйте ключ, соль и пароль. md5 небезопасен.

На сервере вы храните ключ:

$key = 'fPu6AY;h0-5Q>cIel,@n2$gickGs9{ys~+DT,v|Mz-]~EU3tuj18|~Ch#1_$)fGR'; 

уникальной соли генерируется, когда пользователь регистрируется и хранится на сервере вместе с зашифрованным паролем:

|  SALT |               PASSWORD | 
--------------------------------------------------------------------------------- 
| jAcTgi~4(Z | 877236d15a7b7a1f36febc49e58b142d70d72cf7d6e54dcfb252d7cde6b62a2d |

Пароль зашифрован так:

$hash = hash('sha256', $keyFromServer . $saltFromDb . $userPassword); 

Затем вы должны использовать метод 2 для извлечения соли и хэша, чтобы сравнить его с паролем базы данных.

+0

Но если я использую ключ, хэш и соль, предпочтительнее метод 1 или метод 2? – Lars

+0

Вам нужно будет использовать метод 2 для извлечения соли. – Kermit

+0

Но я не могу использовать метод 1, например ... "WHERE username = $ _POST ['username'] И пароль = hashed_salted_password ($ _ POST ['password'])", где эта функция выполняет для меня работу? – Lars

2

Способ 2 предпочтителен, потому что вы можете использовать библиотеки, такие как PHPass. Он также дает вам возможность сообщить пользователю, что они набрали неверное имя пользователя, вместо того, чтобы угадать, не ошибаются ли они тем или иным способом. Ааролама прав насчет того, чтобы md5 не был в безопасности. К сожалению, ни одна из них не относится к серии SHA. Оба эти файла являются хешами файлов, которые используются для уникальной маркировки и идентификации файлов. Используйте криптографический хеш для защиты пароля, например, blowfish. PHPass обрабатывает много безопасности для вас. Соли должны быть случайным образом сгенерированы и уникальны для каждого пользователя, и единственный способ получить их для собственного использования - через второй метод.

0

Чтобы добавить ответе FreshPrinceOfSO «s, не просто сцепить секретный ключ с подсоленной открытым текстом - использовать HMAC подход вместо:

$hash = hash_hmac('sha256', $saltFromDb . $userPassword, $keyFromServer); 

Более подробную информацию о HMAC можно найти в Wikipedia и RFC 2104, а также объяснение причин неправильного подхода. Также стоит отметить, что HMAC существенно меньше подвержены столкновениям, чем их основные алгоритмы хэширования, i. е. они более безопасны, несмотря на тот же основной алгоритм и размер вывода.

Кстати, относительно выходного размера. В разделе 5 вышеупомянутого RFC 2104 указано, что усеченные хэши (половина оригинального размера или больше), а также уменьшают общее количество возможных значений, в то же время затрудняют восстановление открытого текста грубой силой, поскольку полное значение хэша для проверки недоступно для злоумышленника. Это относится и к хэшам, отличным от HMAC.

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