Насколько хорошо мое шифрование аутентификации? - PullRequest
2 голосов
/ 21 июня 2009

Итак, я много читал о шифровании в PHP. Настолько, что я не уверен, что это действительно хороший способ надежно хранить информацию для входа.

Однако мне пришла в голову следующая функция:

function loginHash($username, $password){
    $salt = str_split($password,(strlen($password)/2)+1);
    $hash = hash('whirlpool', $username.$salt[0].'centerSalt'.$salt[1]);
    return $hash;
}

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

Ответы [ 5 ]

6 голосов
/ 21 июня 2009

Шифрование! = Хеширование. Обе они, как принято считать, относятся к категории криптографии, но когда что-то может быть зашифровано, оно может быть дешифровано, что не имеет место в хешировании. Хеширование - это просто хеширование, и все.

Соль действительно построена неправильно. Это должны быть x-байты, прочитанные из / dev / urandom с помощью вызова fopen (). Например, 16 байтов соли - это то, что я лично использую. Это эффективно предотвращает атаки радужного стола.

Чтобы сделать вещи более безопасными, используйте также секретный ключ. Например:

$hashedPassword = hash_hmac('whirlpool',$password.$salt,$key);

Ключ $ - это просто случайные данные. Например, можно создать файл размером 64 КБ, который называется «key.bin» в скрытой папке над корнем документа, и использовать file_get_contents () перед процессом хеширования.

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

6 голосов
/ 21 июня 2009

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

Я слышал, что phpass (Openwall) - хороший фреймворк хэширования, я бы посоветовал вам его использовать.

Они используют соли в своих хэшах и имеют довольно много параметров, чтобы настроить хеш.

5 голосов
/ 21 июня 2009

На самом деле вы не используете соль.

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

Идея состоит в том, что вы генерируете соль, когда пользователь хранит пароль, и эта соль входит в ваше хранилище данных. При аутентификации вы извлекаете соль и сохраненный хеш, вы добавляете префикс данного пароля к сохраненной соли и хешируете их вместе. Затем сравните результат с сохраненным хешем.

1 голос
/ 21 июня 2009

использование соли решает две проблемы:

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

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

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

блог matsano chargen - хороший (и забавный) ресурс для подсказок и указателей относительно безопасности.

1 голос
/ 21 июня 2009

Я думаю, что приведенный выше код проверяет два поля.

  • Предотвращение атак с помощью радужного стола (через соли)
  • Безопасный вход
...