Ответ 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. Все, что отсутствует в этом списке, следует рассматривать со здоровой дозой скептицизма.