2016-04-12 6 views
1

Я собираюсь использовать функцию хэширования, с солью:Ключ Хэши/Безопасность входа?

$ stored_pass = md5 (md5 ($ salt) .md5 ($ plain_pass)); **

/// Я хочу знать эффективный способ ключа/аутентификации этого хэша. Я немного прочитал о хэшах ключей и MAC, но не совсем понял HMAC; поэтому просто решил, что обработка хэша в функции шифрования, например, aes, будет работать. ///

EG $ stored_pass = aes (md5 (md5 ($ salt) .md5 ($ plain_pass))); **

Я хотел бы знать следующее:

Почему ключевые хэши для входа в систему? (Примеры были бы хорошими)

Методы для хэширования ключей? (Специально для использования в лохмоть)

Недостатки?

Есть ли еще способы, чтобы наша система хеширования/проверки пароля могла быть более безопасной? (После того, как мы фактор в хэш, соленая, ключом)

** Что является наиболее «безопасный алгоритм хеширования?

» Закрепить на труднее взломать.

/// Я читал, что sha-512 был одним из самых безопасных; но затем читать противоречивые статьи, в которых говорится: sha в любой форме не следует использовать, и что-то вроде bcrypt/scrypt следует использовать или PBKDF2. Затем я прочитал, что bcrypt не должен использоваться и имеет ограничения. Поэтому я немного смущен. ///

При предоставлении алгоритмов хэширования, я хотел бы знать следующее:

  • Каковы ограничения алгоритма хеширования?
  • Усилия?
  • Недостатки?

/// Моя главная забота - безопасность пользователей, поэтому, если это означает, что «скорость» меня не беспокоит. На мой взгляд, задача входа в систему - это безопасность пользователей, поэтому снижение доверия к этой безопасности на несколько миллисекунд мне кажется глупым. (Просто личное мнение). ///

Также я оценил бы комментарии на моей функции:

$ stored_pass = АЕС (md5 (md5 ($ соль) .md5 ($ plain_pass))); **

И любые альтернативы были бы оценены.

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

+0

Вы могли бы быть заинтересованы в этой рецензии http://security.stackexchange.com/a/6415 –

ответ

1

Я собираюсь использовать функцию хеширования, с солью:

$stored_pass = md5(md5($salt).md5($plain_pass)); 

Не используйте MD5. Learn how to safely store passwords.Эта страница может очень хорошо ответить на все ваши вопросы.

/// Я хочу знать эффективный способ ключа/аутентификации этого хэша. Я немного прочитал о хэшах ключей и MAC, но не совсем понял HMAC; поэтому просто решил, что обработка хэша в функции шифрования, например, aes, будет работать. ///

MAC-адреса не являются подходящим инструментом для работы здесь, даже если кажется соблазнительным использовать их. Возможно, this primer on cryptography concepts поможет осветить разницу, но в основном:

  • MAC - Обеспечить защиту от несанкционированного доступа для сообщения.
  • Password hash - медленный, соленый алгоритм хеширования.

Это совершенно разные прецеденты. (Хотя PBKDF2 использует алгоритм MAC внутри, поэтому я могу понять, если вы были в замешательстве.)

Шифрование хэша не то, что делает MAC. HMAC в частности в основном:

  1. Хешируйте ваше сообщение (с незначительной трансформацией).
  2. Хеш-ключ и вывод шага 1 (с другим незначительным преобразованием).

/// Я читал, что sha-512 был одним из самых безопасных; но затем читать противоречивые статьи, в которых говорится: sha в любой форме не следует использовать, и что-то вроде bcrypt/scrypt следует использовать или PBKDF2. Затем я прочитал, что bcrypt не должен использоваться и имеет ограничения. Поэтому я немного смущен. ///

Легкий ответ:

  1. Использование password_hash() для создания хэшей паролей.
  2. Используйте password_verify() для аутентификации паролей против хешей.
  3. Остановите беспокоиться об этом.

Ограничения Bcrypt (усечение после 72 символов или первый байт - NUL, которые упомянуты в первой статье я связан с) не практический интерес, и rolling your own crypto, безусловно, менее безопасным, чем при использовании Bcrypt.

Если вы абсолютно обеспокоены ограничениями Bcrypt, сделайте следующее:

function bcrypt_sha384_hash($password, $cost = 10) 
{ 
    $fasthash = base64_encode(
     hash('sha384', $password, true) 
    ); 
    return password_hash($fasthash, PASSWORD_BCRYPT, ['cost' => $cost]); 
} 

function bcrypt_sha384_verify($password, $storedHash) 
{ 
    $fasthash = base64_encode(
     hash('sha384', $password, true) 
    ); 
    return password_verify($fasthash, $storedHash); 
} 
+0

Спасибо за некоторые из информации , MD5 был примером кстати. – Reality

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