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

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

Ответ 1

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

Ваши варианты:

  • Argon2 (требуется PHP 7.2 или расширение 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 будут усекаться.

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

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

$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 с password_hash() в PHP 7.2

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

Если вы не используете PHP 7.2 или выше, вам нужно установить libsodium и расширение PHP для использования Argon2. Хеширование паролей является одной из функций не, предоставляемой натрием_compat.

// 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

Вам понадобится расширение расширений, доступное через 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

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

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

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

Ответ 2

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

Сегодня рекомендуемыми алгоритмами являются 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);