mcrypt已经被弃用? - 如何在PHP中正确加密并保存密码?

4

我被告知,php mcrypt已被弃用,我应该使用一种不同的方法来哈希和加盐我的密码。

这是我当前所做的:

public function saveNewUser(array $data) {
  $passwd = $this->mysqli->real_escape_string($datas['passwd']);
  $options = [
      'cost' => 11,
      'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
  ];

  $hashed_passwd = password_hash($passwd, PASSWORD_BCRYPT, $options);
  $this->optin_hash = md5(rand());
  //...
  //save user in DB with hashed passwd

登录:

if (password_verify($_POST['user_password'], $result_row->gmw_usr_passwd)) {//do some login stuff}

1.) 最新和最安全的密码加密和保存方法是什么?能否提供正确保存密码的用法示例或链接以及如何验证登录

2.) 在PHP文档中,我读到了有关password_hash的一些内容:

password_hash()使用强大的单向哈希算法创建一个新的密码哈希。password_hash()与crypt()兼容。因此,由crypt()创建的密码哈希可以与password_hash()一起使用。

(...)

警告 从PHP 7.0.0开始,salt选项已被弃用。现在最好只使用默认生成的salt。

2.a) password_hash是我使用的东西的替代品吗?

2.b) 那么我不需要自己添加盐了吗?

2.c) 那么我使用的blowfish算法和我添加的所有其他步骤都不再必要了吗?

2.d) 当我使用password_hash时,如何验证登录密码?

编辑:抱歉,我看到我已经使用了password_hash(那是一个非常短的编码夜)。

如Artjom B所述,我不需要mcrypt (?)


1
你不需要使用mcrypt来生成随机字节。OpenSSL扩展有一个类似的函数。 - Artjom B.
那我只需要删除这个选项吗?我会使用这个代替:$options = ['cost' => 11]; - user7059778
1
这取决于您对盐的需求。如果您真的需要一个与默认值不同的特定长度的盐,则不能简单地使用默认值,是吗?尽管默认值完全可以使用,我认为没有理由不使用它。 - Artjom B.
1
最好省略盐参数,函数password_hash()将自动生成一个安全的盐。使用mcrypt_create_iv()创建的盐也不适用于BCrypt。 - martinstoeckli
  1. 不要传递盐值。只需要让password_hash()自动生成即可。
  2. 在其他需要随机数的地方,请使用random_bytes()。如果您的代码需要在PHP 5项目上工作,请获取https://github.com/paragonie/random_compat的副本并开始工作。
- Scott Arciszewski
1个回答

6
根据 PHP 7.0 的文档,新的标准方式是使用 password_hash 哈希原始密码,然后在登录时使用 password_verify 来验证提供的密码是否正确。这些函数是对基础功能(如 crypt())的封装,建议使用它们,因为它们会处理你和我从未考虑过的事情,例如选择正确的随机源以生成盐(无法使用标准 rand 函数进行加密)。至于 2b 和其他部分,你不需要自己添加盐,因为它由 PHP 生成并包含在密码中,所有必要的步骤都已为你完成。你只需要将使用 password_hash 创建的哈希密码保存在数据库中,然后在登录时使用 password_verify 将其与用户提供的密码进行比较。另外,是的,mcrypt 已被弃用,因为它不再更新。

谢谢您的解释!正如我之前所问的: 那么我只需要删除这一行代码:'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)就可以了吗? - user7059778
还是我只需要使用:password_hash($passwd) 就可以了吗? - user7059778
3
如果您想继续使用成本(cost),您可以只删除关于盐(salt)的一行,保留有关成本的那一行。此外,我不确定您是否知道 PASSWORD_BCRYPT 实际上是使用 blowfish 算法,因此 PASSWORD_DEFAULT 已经是 bcrypt 而不是像 md5 或 sha 这样的简单哈希函数。所以,您可以使用 password_hash($passwd, PASSWORD_DEFAULT)。 - user284437

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接