2009-06-21 6 views
2

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

Однако, следующая функция, что я придумал:

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

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

ответ

6

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

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

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

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

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

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

+0

Удивительно, спасибо! – Tom

6

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

Ive услышал, что phpass (Openwall) - хорошая схема хэширования, я предлагаю вам использовать это.

Они используют соли в своих хешах и имеют довольно определенные параметры для настройки хэша.

+0

спасибо. Хотелось бы, чтобы была какая-то документация для этой структуры. – Tom

+0

К сожалению, они все еще используют MD5. – molf

+0

О, может быть, мне лучше не использовать его тогда. – Tom

1

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

  • Избежание атак радуги стол (через Солей)
  • Secure Вход
5

Вы на самом деле не с помощью соли.

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

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

+0

Интересно. Однако, если соль различна все время, как вы можете сравнить хэш с той, что находится в базе данных? Разве это не будет отличаться все время? – Tom

+0

Да, поэтому вы также храните его в базе данных. Это лучший механизм, чтобы убедиться, что хеш не предсказуем, основываясь на комбинации имени пользователя и пароля. – molf

+0

Я что-то пропустил, потому что я не совсем уверен, как вы можете видеть, хороша ли строка A по сравнению со строкой B, хотя обе строки разные? Надеюсь, я понимаю. – Tom

1

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

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

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

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

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

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