На самом деле я прочитал много сообщений, связанных с алгоритмом для использования, например, md5 , sha1 и т. Д. Но я до сих пор не уверен, какой из них безопасный и лучший для использования в наши дни. Я начинаю с веб-разработки, и я прошу всех лучших программистов по всему миру научить и показать мне. Надеюсь, вы, ребята, можете дать мне выбор и пример для его использования. Спасибо
Кстати: как безопасно хранить пароли пользователей в 2016 году .
Ваш выбор:
Если вам действительно нужно, также не стесняйтесь рассматривать PBKDF2.
Учитывая, что вы новичок, вы должны написать свою проверку пароля следующим образом:
// 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:
Стоп-пробел, который работает с этими ограничениями, встроен в 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! }
Вам нужно будет установить 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 , доступное через 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.
Я настоятельно рекомендую использовать кросс-платформенную библиотеку 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);