gpt4 book ai didi

php - 2016年存储密码的最佳算法

转载 作者:可可西里 更新时间:2023-10-31 22:08:45 25 4
gpt4 key购买 nike

其实我看了很多跟md5, sha1等算法相关的帖子。但是我仍然不确定现在哪一个是安全的和最好的。我是 Web 开发的初学者,我请求世界上所有最优秀的程序员来教我并向我展示。我希望你们能给我选择和使用它的例子。谢谢你

最佳答案

顺便说一句:How to safely store your users' passwords in 2016 .

您的选择是:

  • Argon2(需要 PHP 7.2 或 PHP 扩展)
  • Scrypt(需要 PHP 扩展)
  • 解密

如果你真的需要,也可以考虑 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 预散列密码,然后在传递给 PHP 的密码 API 之前对原始散列进行 base64 编码。

首先,创建一个加密 key 并将其存储在您的文档根目录之外。 (否则,黑客可以窃取 key 。)

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

现在,您可以将此 key 与您的密码结合使用:

$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!
}

You can now use Argon2 with password_hash() in PHP 7.2

新标准:Argon2(通过 Libsodium)

除非您使用的是 PHP 7.2 或更高版本,否则您需要 install libsodium and the PHP extension使用 Argon2。密码散列是 sodium_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

你需要 the scrypt extension可通过 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 的唯一原因是兼容性;此时,选择 Argon2 或 bcrypt。

可以接受但不是很好:PBKDF2

我强烈建议使用 Defuse Security's cross-platform Password Hashing library如果你需要 PBKDF2。 (但是,您应该考虑只使用 password_*!)

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

上述任何选择都是可接受的。 Argon2 可能是最安全的,但它在 PHP 中还没有广泛使用。此列表中缺少的任何内容都应该以健康的怀疑态度看待。

关于php - 2016年存储密码的最佳算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37454203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com