Соление моих хэшей с помощью PHP и MySQL

Как и большинство пользователей, я просто пытаюсь выяснить безопасный способ хранения паролей. То ,что я не нашел здесь (или, может быть, это мое непонимание), - это как получить соленый хэш в моей базе данных и отделить соль от хэшированного пароля, особенно с уникальными солями к каждому паролю пока поддерживающ соль + пароль в одиночном столбце.

Я нахожу все эти классные способы шифрования паролей (SHA-256, но поддерживает ли MySQL только SHA / 1 и MD5?) и другие вещи из руководства PHP, но не уверен, как хранить и извлекать пароли.

пока это все, что я понял:

SHA('$salt'.'$password') // My query sends the password and salt 
                         // (Should the $salt be a hash itself?)

после этого я теряюсь с солями.

получить пароль без соли легко, но соль меня смущает. Где я могу получить ценность от $salt снова, особенно если она уникальна и безопасна? Спрятать их в другой базе данных? Константа (кажется небезопасной)?

EDIT: является ключевой переменной в HMAC должен быть солью или это что-то еще?

3 ответов


прежде всего, вашей СУБД (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, связанный С.


Это, кажется, подробно описано в предыдущем посте: Безопасный хэш и соль для паролей PHP


лично я рекомендую позволить MySQL сделать это со встроенными функциями.

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

function enc_key(){
     return "aXfDs0DgssATa023GSEpxV";
}

затем в вашем скрипте используйте его с SQL-запросом и функциями AES_ENCRYPT и AES_DECRYPT в MySQL следующим образом:

require_once('dbconf.inc.php');

$key = enc_key();

//When creating a new user
$sql = "INSERT INTO users (username, password) VALUES ('bob', AES_ENCRYPT('{$key}', {$password}))";

//When retrieving users password
$sql = "SELECT AES_DECRYPT('{$key}', password) AS password FROM users WHERE username like 'bob'";