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

时间:2016-10-23 09:04:50

标签: php security hash cryptography passwords

有人告诉我,不推荐使用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选项已被弃用。现在最好只使用默认生成的盐。

2.a)password_hash是我用过的替代品吗?

2.b)所以我不需要自己加盐?

2.c)我使用的河豚algorythm和我添加的所有其他步骤怎么样?它们不再是必要的了吗?

2.d)当我使用password_hash?

时,如何验证登录密码?

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

正如Artjom B所描述的那样。我不需要mcrypt(?)

1 个答案:

答案 0 :(得分:6)

根据PHP 7.0的PHP文档,新的标准方法是使用password_hash哈希原始密码,然后在登录时使用password_verify,以验证提供的密码的正确性。< / p>

这些函数是基础知识的包装器,如crypt(),因为它们会处理你和我永远不会想到的事情,比如选择正确的随机源来生成盐(你不能使用)用于加密的标准rand函数。)

来到2b,其余的,你不需要自己添加盐,因为它是由PHP生成并包含在密码中,所有必要的步骤都是为你完成的。

您只需要在数据库中保存使用password_hash创建的散列密码,然后在登录时使用它,使用password_verify将其与用户提供的密码进行比较。

此外,是的mcrypt已被弃用,因为它不再更新。