Прежде всего, вашей СУБД (MySQL) не требуется поддержка криптографических хэшей. Вы можете делать все это на стороне PHP, и это также то, что вы должны делать.
Если вы хотите хранить соль и хеш в одном столбце, вам нужно объединить их.
// the plaintext password
$password = (string) $_GET['password'];
// you'll want better RNG in reality
// make sure number is 4 chars long
$salt = str_pad((string) rand(1, 1000), 4, '0', STR_PAD_LEFT);
// you may want to use more measures here too
// concatenate hash with salt
$user_password = sha512($password . $salt) . $salt;
Теперь, если вы хотите подтвердить пароль, вы делаете:
// the plaintext password
$password = (string) $_GET['password'];
// the hash from the db
$user_password = $row['user_password'];
// extract the salt
// just cut off the last 4 chars
$salt = substr($user_password, -4);
$hash = substr($user_password, 0, -4);
// verify
if (sha512($password . $salt) == $hash) {
echo 'match';
}
Возможно, вы захотите взглянуть на phpass , который также использует эту технику. Это решение для хэширования PHP, которое использует соление среди других вещей.
Вы обязательно должны взглянуть на ответ на вопрос, связанный с WolfOdrade.