mcrypt 已弃用,有什么替代方案?

新手上路,请多包涵

根据 此处 发布的评论, 不推荐使用 mcrypt-extension 将在 PHP 7.2 中删除。所以我正在寻找另一种加密密码的方法。

现在我正在使用类似的东西

mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv)

我需要您对加密密码的最佳/最强方式的意见,加密密码当然应该受 PHP 7.xx 支持,并且也应该是可解密的,因为我的客户确实希望可以选择“恢复”他们的密码而不生成新的密码一。

原文由 Piet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 553
2 个回答

最佳做法是对密码进行哈希处理,使其不可解密。对于可能已经获得您的数据库或文件访问权限的攻击者来说,这会使事情变得更加困难。

如果您必须加密您的数据并使其可解密,请访问 https://paragonie.com/white-paper/2015-secure-php-data-encryption 获取安全加密/解密指南。总结该链接:

  • 使用 Libsodium - PHP 扩展
  • 如果您不能使用 Libsodium,请使用 defuse/php-encryption - 直接 PHP 代码
  • 如果你不能使用 Libsodium 或 defuse/php-encryption,请使用 OpenSSL—— 很多服务器已经安装了这个。如果没有,可以用 –with-openssl[=DIR] 编译

原文由 Phil 发布,翻译遵循 CC BY-SA 3.0 许可协议

我在 PHP 7.2.x 上使用它,它对我来说工作正常:

 public function make_hash($userStr){
        try{
            /**
             * Used and tested on PHP 7.2x, Salt has been removed manually, it is now added by PHP
             */
             return password_hash($userStr, PASSWORD_BCRYPT);
            }catch(Exception $exc){
                $this->tempVar = $exc->getMessage();
                return false;
            }
        }

然后使用以下函数验证哈希:

 public function varify_user($userStr,$hash){
        try{
            if (password_verify($userStr, $hash)) {
                 return true;
                }
            else {
                return false;
                }
            }catch(Exception $exc){
                $this->tempVar = $exc->getMessage();
                return false;
            }
        }

例子:

   //create hash from user string

 $user_password = $obj->make_hash2($user_key);

并使用以下代码验证此哈希:

 if($obj->varify_user($key, $user_key)){
      //this is correct, you can proceed with
    }

就这样。

原文由 Abdul Rahman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题