MD5 вопросы безопасности хранения паролей и альтернативы

md5 безопасно?

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

Вот скрипт , чтобы проверить скорость MD5 , результаты тестов:

[root@f4d5945f1d7c tools]# php speed-of-md5.php
Array
(
    [rounds] => 100
    [times of a round] => 1000000 [avg] => 0.23415904045105 [max] => 0.28906106948853 [min] => 0.21188998222351 )

Не нашли проблему: MD5 слишком быстро, легко привести к грубой силе.

Простой расчет:

> Math.pow(10, 6) / 1000000 * 0.234 0.234 > Math.pow(36, 6) / 1000000 * 0.234 / 60 8.489451110400001 > Math.pow(62, 6) / 1000000 * 0.234 / 60 / 60 3.69201531296
  1. Используйте шесть чисто цифровой пароль, взломать всего 0,234 секунды!

  2. Используйте 6 номеров + строчные буквы пароля, трещины всего 8,49 минут!

  3. С помощью 6-значного пароля + смешанно-буквы, до тех пор, как 3,69 часов, чтобы взломать!

Конечно, использовать более длинные пароли значительно увеличить сложность угадывания:

> Math.pow(10, 8) / 1000000 * 0.234
23.400000000000002 > Math.pow(36, 8) / 1000000 * 0.234 / 60 / 60 / 24 7.640505999359999 > Math.pow(62, 8) / 1000000 * 0.234 / 60 / 60 / 24 / 365 1.6201035231755982
  1. Используя восемь чисто цифровой пароль, взломать 23,4 секунд!

  2. 8-разрядные числа + строчные буквы пароля, трещины на 7,64 часов!

  3. + 8-битный цифровой смешанный буквами пароль, трещины до 1,62 лет!

Но не стоит забывать, что это только скорость, с PHP интерпретировать этот язык, чтобы выбежать на (i5-4460 3.20GHz CPU) слабого цыпленка в моем компьютере, просто использовать поток ядра процессора. Если поставить на последнем сервере Xeon E7 v4 серии CPU для выполнения в полной мере использовать его 48 потоков, а также использовать язык C, чтобы повторно написать тестовый код, то легко повысить скорость в несколько сотен тысяч раз. Так что даже с паролем + смешала буквами 8 цифр, трещины до тех пор, как 14 часов!

Более того, многие люди используют пароли более регулярные буквы или цифры, может уменьшить сложность грубой силы ... Если вы не добавить соль или соль фиксированной, то таблица радуга еще более легко сломать ...

Так как повысить безопасность паролей, хранящихся в нем? Bcrypt!

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

Здесь есть пятна: PHP действительно лучший язык в мире - стандартная библиотека, которая получила решение.

PHP версии 5.5 добавлен  password_xxx ряд функций , в то время как в предыдущей версии, есть также совместимы с библиотекой могут быть использованы: password_compat .
Предоставляет ряд лаконичной пароль хранится в пакете под названием «криптографический алгоритм хеширования,» расширение ядра функция. Краткое введение:

  1. password_hash Функция шифрования md5 пароля (хеш), в настоящее время используется по умолчанию (используется только) Bcrypt алгоритма, эквивалент расширенной версии

  2. password_verify Есть функция проверки пароля, безопасное сравнение строк алгоритм внутреннее использование, и атаки, основанные на время может быть предотвращена, что эквивалентны $hashedPassword === md5($inputPassword)

  3. password_needs_rehash Есть функция, чтобы определить, нужно ли обновить, эта функция является мощной, и снова нижеследующим подробным разговор

password_hash Нам нужно пройти алгоритм, который может быть использован, по умолчанию, и только Bcrypt алгоритм, который, как алгоритм делать? Почему стандартная библиотека PHP, который будет выбрать Bcrypt это?

Bcrypt Blowfish алгоритм является алгоритм, основанный на выделенных хэши паролей Нильс Провосом и дизайн Дэвид Mazieres. Этот специальный алгоритм, что стремление других алгоритмов быстро, этот алгоритм имеет решающее аргумент :. Стоимость, как предполагает его название, тем больше значение, тем больше время, но экспоненциально - - шифрование части процесса таково, что:

EksBlowfishSetup(cost, salt, key)
    state <- InitState()
    state <- ExpandKey(state, salt, key)
    repeat (2^cost)                         // "^"表示指数关系 state <- ExpandKey(state, 0, key) state <- ExpandKey(state, 0, salt) return state

Ниже приведены результаты такого теста автора (личная слабая машина PC, i5-4460 CPU 3.20GHz):

      cost       time
         8   0.021307
         9   0.037150
        10   0.079283 11 0.175612 12 0.317375 13 0.663080 14 1.330451 15 2.245152 16 4.291169 17 8.318790 18 16.472902 19 35.146999

Attachment: тестовый код

Эта скорость просто разница по сравнению с md5 улиткой и гепард - даже по стоимости = 8, 8-разрядные пароли прописные и строчные буквы + цифры имеют 14 лет, чтобы вырваться из насилия, не говоря уже о целом сервер будет установлен, по крайней мере, значение 10 или более (54 лет или дольше потребуется).

Очевидно, что стоимость не больше, тем лучше, тем больше потом будет занимать сервера центрального процессора, но легко привести к атакам DOS. Рекомендуемое значение составляет от 10 до 12 могут быть сконфигурированы в соответствии с потребностями и операций сервера. Лучшим в то время как один и тот же пользователь регистрируется на то же IP ограничить количество попыток предотвратить DOS атаки.

Надежная программа для хранения паролей

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

class User extends BaseModel { const PASSWORD_COST = 11; // 这里配置bcrypt算法的代价,根据需要来随时升级 const PASSWORD_ALGO = PASSWORD_BCRYPT; // 默认使用(现在也只能用)bcrypt /** * 验证密码是否正确 * * @param string $plainPassword 用户密码的明文 * @param bool $autoRehash 是否自动重新计算下密码的hash值(如果有必要的话) * @return bool */ public function verifyPassword($plainPassword, $autoRehash = true) { if (password_verify($plainPassword, $this->password)) { if ($autoRehash && password_needs_rehash($this->password, self::PASSWORD_ALGO, ['cost' => self::PASSWORD_COST])) { $this->updatePassword($plainPassword); } return true; } return false; } /** * 更新密码 * * @param string $newPlainPassword */ public function updatePassword($newPlainPassword) { $this->password = password_hash($newPlainPassword, self::PASSWORD_ALGO, ['cost' => self::PASSWORD_COST]); $this->save(); } }

Таким образом, в момент регистрации или изменить пароль на вызовы  , $user->updatePassword() чтобы установить пароль для входа в систему и когда звонить  , $user->verifyPassword() чтобы проверить пароль правилен под.
Когда производительность аппаратного обеспечения в определенной степени, и стоимость = 11 не может удовлетворить требования безопасности во время в соответствии с измененной  PASSWORD_COST стоимости можно легко модернизировать, сделать более безопасное хранение паролей.

 

 

 

 

Алгоритм хеширования паролей

рекомендация

отwww.cnblogs.com/2019gdiceboy/p/11121425.html