2012-06-05 4 views
1

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

Любые идеи?
Я разместил свой код.

<?php 
$password = 'passwordwhatever'; 

//generate the salt 
function gen_salt() { 
    $salt = uniqid(mt_rand(), true) . sha1(uniqid(mt_rand(), true)); 
    $salt = crypt('sha512', $salt); 
    return $salt; 
} 

//generate the hash 
function gen_hash($salt, $password) { 
    $hash = $salt . $password; 
    for($i = 0; $i < 100000; $i++) { 
     $hash = crypt('sha512', $hash); 
    } 

    $hash = $salt . $hash; 
    return $hash; 
} 

$password = gen_hash(gen_salt(), $password); 
echo $password; 

?> 
+0

Соленое поколение может быть сделано в менее переполненном виде; просто 'uniqid (mt_rand(), true)' достаточно для этой цели и добавляет 'sha512', что не сделает его более случайным ;-) –

ответ

0

Соль должна содержаться где-то в базе данных (или где-то еще). Некоторые варианты - добавить соль в хэш или сохранить в качестве собственного поля. Мне нравится добавлять его в хэш.

$password = $salt . '.' . $hash; 

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

list($salt,$hash) = explode('.', $password); 
$check = gen_hash($salt, $input_pass); 
if ($check === $password) 
    // valid 
2

До тех пор, пока вы производите ту же соль, это не должно иметь большого значения. Храните его в своем db, в конфигурации, пока вы можете добраться до него. Усилия по реверсии хэша SHA512 настолько велики, что, если вы не являетесь Пентагоном, никто не будет беспокоиться. Дело в том, что вы хотите иметь возможность повторять хеш с той же солью, чтобы быть уверенным, что вход был таким же, не имея необходимости хранить чувствительный вход. Если это имеет смысл.

+0

Прямо на деньги. Я собирался прокомментировать, что вам действительно не нужно много усиливать шифрование таких солей. Самое главное, что это случайность, а не то, что она очень безопасна. Даже если кто-то получает соль и хеш, создание таблицы радуги специально для этой соли не является затратопринимательной практикой. Я бы не отказался от него волей-неволей (сохраните его в фоновом режиме, не публиковать его публично), но просто придумывание случайной строки букв и цифр обычно достаточно безопасно. –

+0

Пара примечаний стороны: 1) Не используйте одну соль для каждого пароля; каждая соль должна быть уникальной для каждого пароля. Не LITERALLI уникально; вам не нужно проверять, что этого не существует или что-то еще, просто сделайте их достаточно длинными, так что практически говоря, очень мало шансов на дублирование. 2) Обычно я храню соль с хешем, используя что-то вроде двоеточия в качестве разделителя. Если вы, возможно, захотите использовать другие вещи, используя его, вы можете сохранить его в своем столбце в таблице паролей. –

0

Возможно, вам стоит взглянуть на bcrypt. This может вам помочь. Я написал tutorials, но они на немецком языке. Ох и PHP 5.3 поддерживают bcrypt изначально.

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