2013-05-23 4 views
3

Для моего сайта я хранить свои пароли пользователей в базе данных с помощью этой функции MySQL:Как проверить значение шифрования mysql с солью в PHP?

ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))) 

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

Я предположил, что это было бы так просто, как это:

SELECT user FROM users WHERE id = $id AND password = ENCRYPT('$password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))) 

Однако стало очевидно, что это не будет работать из-за RAND() функция ...

Так как я бы воссоздать этот пароль в PHP (или mysql), чтобы сопоставить его с зашифрованным паролем? Я предполагаю, что мне нужно будет использовать crypt() или hash(), но я честно не уверен, что PHP должен использоваться или MySQL.

Я использую MySQL версии 5.5, PHP версии 5.3

+0

Вы - СОЛ. Извините – Orangepill

+0

Может ли этот язык, кроме MySQL/PHP, сделать это? – Andy

+0

@Orangepill: Нет, он в порядке. 'ENCRYPT()' плохо назван; это фактически хеш-функция. – duskwuff

ответ

3

Соль используется ENCRYPT() (более известный как функция crypt()) хранится как часть хэша, и может быть использован как часть хэша:

SELECT ... FROM users WHERE ... AND password = ENCRYPT('swordfish', password); 

(то есть, если введенный пароль пользователя был «рыба-меч». Я избежать «пароль», потому что это также имя столбца.)

Вы можете (и должны) делать то же самое в PHP путем проверки:

crypt($user_password, $hashed_password) == $hashed_password 

Отметьте, что crypt() не является особо безопасным способом хранения паролей. Пожалуйста, см. Secure hash and salt for PHP passwords.

+0

Спасибо за ответ, поэтому я бы использовал crypt() для значения, которое пользователь предоставляет, а затем передает это в запрос, не соль? Я смущен, потому что я не уверен, что значение $ hashed_password должно быть, и я полагаю, что моя соль - это CONCAT ('$ 6 $', SUBSTRING (SHA (RAND()), -16)), или я ошибаюсь на что также? – Andy

+1

'$ hashed_password' будет паролем, который хранится в базе данных. Но, пожалуйста, прочитайте вопрос, с которым я связался. – duskwuff

+0

А теперь, я понимаю! Я только что прочитал его, и теперь я изучаю использование scrypt, и я буду придерживаться этих действий и не делать этого. Спасибо за вашу помощь, вы просто сделали еще один сайт безопасным: D – Andy