лучший алгоритм хранения паролей в 2016 году

На самом деле я прочитал много сообщений, связанных с алгоритмом для использования, например, md5 , sha1 и т. Д. Но я до сих пор не уверен, какой из них безопасный и лучший для использования в наши дни. Я начинаю с веб-разработки, и я прошу всех лучших программистов по всему миру научить и показать мне. Надеюсь, вы, ребята, можете дать мне выбор и пример для его использования. Спасибо

Кстати: как безопасно хранить пароли пользователей в 2016 году .

Ваш выбор:

  • Argon2 (требуется расширение PHP)
  • Scrypt (требуется расширение PHP)
  • Bcrypt

Если вам действительно нужно, также не стесняйтесь рассматривать PBKDF2.

Старый режим ожидания: Bcrypt

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

 // Creating your hashed password: $hash = password_hash($userPassword, PASSWORD_DEFAULT); // Checking a user-supplied password against a stored hash: if (password_verify($userPassword, $hash)) { // Login successful. if (password_needs_rehash($hash, PASSWORD_DEFAULT)) { // Recalculate a new password_hash() and overwrite the one we stored previously } } 

Нижняя сторона для bcrypt:

  • Пароли более 72 символов усекаются.
  • Пароли с байтом NUL будут усекаться.

Стоп-пробел, который работает с этими ограничениями, встроен в Password Lock : он предварительно хеширует пароли с SHA384, а base64-кодирует необработанный хеш, прежде чем перейти к API-интерфейсу PHP.

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

 $newKey = \Defuse\Crypto\Key::createNewRandomKey(); file_put_contents( '/outside/document/root/enckey.txt', $newKey->saveToAsciiSafeString() ); 

Теперь вы можете использовать этот ключ вместе с вашими паролями:

 $key = Key::loadFromAsciiSafeString( file_get_contents('/outside/document/root/enckey.txt') ); // Hashing a password with PasswordLock: $storeMe = PasswordLock::hashAndEncrypt($_POST['password'], $key); // Verifying a password with PasswordLock: if (PasswordLock::decryptAndVerify($_POST['password'], $storeMe, $key)) { // Success! } 

Новый стандарт: Argon2 (через Libsodium)

Вам нужно будет установить libsodium и расширение PHP для использования Argon2. Вероятно, я собираюсь предоставить патч для PHP 7.1, чтобы сделать его доступным для password_hash() .

 // Password hashing: $hash_str = \Sodium\crypto_pwhash_str( $password, \Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, \Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE ); // Password verification: if (\Sodium\crypto_pwhash_str_verify($hash_str, $password)) { // recommended: wipe the plaintext password from memory \Sodium\memzero($password); // Password was valid. } else { // recommended: wipe the plaintext password from memory \Sodium\memzero($password); // Password was invalid. } 

Промежуточное число: Scrypt

Вам понадобится расширение scrypt , доступное через PECL:

 pecl install scrypt echo "extension=scrypt.so" > /etc/php5/mods-available/scrypt.ini php5enmod scrypt 

Как только это установлено, использование его довольно просто:

 // Hashing: $hash = \Password::hash($userProvidedPassword); // Validation: if (\Password::check($userProvidedPassword, $hash)) { // Logged in successfully. } 

Единственная причина для использования scrypt – совместимость; на данный момент, перейдите либо с аргоном2, либо с помощью bcrypt.

Допустимый, но не большой: PBKDF2

Я настоятельно рекомендую использовать кросс-платформенную библиотеку Password Hashing Defuse Security, если вам нужен PBKDF2. (Однако вы должны просто использовать password_* !)

 $hash = PasswordStorage::create_hash($password); if (PasswordStorage::verify_password($password, $hash)) { // Success } 

Любой из приведенных выше вариантов допустим . Argon2, вероятно, самый безопасный, но пока он еще не доступен на PHP. Все, что отсутствует в этом списке, следует рассматривать со здоровой дозой скептицизма.

Важно то, что алгоритм предлагает коэффициент затрат , который контролирует необходимое время для вычисления хэша. Чем больше времени вы можете инвестировать в расчет одного хэша, тем дороже будет принудительное форсирование (например, 100 Giga MD5 в секунду против 10 бит / с в секунду).

Сегодня рекомендуемыми алгоритмами являются BCrypt, PBKDF2 и SCrypt. Алгоритм BCrypt поддерживается PHP, функция-оболочка заботится о генерации соли и является будущим доказательством.

 // Hash a new password for storing in the database. // The function automatically generates a cryptographically safe salt. $hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); // Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb. $isPasswordCorrect = password_verify($password, $existingHashFromDb);