GVKun编程网logo

如何将Argon2算法与password_hash一起使用?

3

在本文中,我们将为您详细介绍如何将Argon2算法与password_hash一起使用?的相关知识,此外,我们还会提供一些关于Django中的PASSWORD_HASHERS设置、md5和passwo

在本文中,我们将为您详细介绍如何将Argon2算法与password_hash一起使用?的相关知识,此外,我们还会提供一些关于Django中的PASSWORD_HASHERS设置、md5和password_hash谁跟牛X、password_hash()PASSWORD_DEFAULT PHP 5.5、php password_hash的有用信息。

本文目录一览:

如何将Argon2算法与password_hash一起使用?

如何将Argon2算法与password_hash一起使用?

因此,我听说PHP
7.2引入了新的Argon2算法。但是我对如何在现有代码中使用它感到困惑。例如,我有这个

$password = password_hash(''somepassword'', PASSWORD_DEFAULT, [''cost'' => 12]);

PASSWORD_DEFAULT现在是否使用Argon2?我需要更改什么(如果有的话)password_verify?bcrypt现在被认为是不安全的吗?

答案1

小编典典

什么是Argon2?bcrypt现在不好了吗?

在PHP
7.2之前,唯一使用的哈希算法password_hash是bcrypt。在撰写本文时,bcrypt仍然被认为是一个强大的哈希值,尤其是相对于它的前辈,md5以及sha1(这两者都是不安全的,因为它们是快速)。Argon2
只是暴力破解的一种更昂贵的算法

Argon2i使用与数据无关的内存访问。它之所以速度较慢,是因为它在内存中进行了更多的传递,以防止受到权衡攻击。强烈建议您使用密码哈希和基于密码的密钥派生。

Bcrypt仍然是可接受的密码哈希。如果不想(从7.2.0版本开始),则无需切换。另外,PASSWORD_DEFAULT仅应在下一个完整版本(7.3.0或更高版本)上更改(根据PHP内部策略)。如果要确保仅继续使用bcrypt,则可以PASSWORD_BCRYPT改用。但是,这是不必要的,我们将在下面讨论。

您如何使用Argon2?

首先,我们将password_hashover 的第二个参数切换为其中一个常量

  • PASSWORD_ARGON2I -PHP 7.2.0+
  • PASSWORD_ARGON2ID -PHP 7.3.0+(首选,如果可用,请参见下面的注释)

然后我们需要更改选项。bcrypt使用它cost作为参数来遍历密码多少次(更高的成本=更长的哈希时间)。但是有不同的成本因素

password_hash(''somepassword'', PASSWORD_ARGON2I, [''memory_cost'' => 2048, ''time_cost'' => 4, ''threads'' => 3]);

从手册中我们可以看到这些选项的作用

  • memory_cost -可用于计算Argon2哈希的最大内存(以字节为单位)(默认为1024)
  • time_cost -计算Argon2哈希值可能需要的最长时间(默认值为2)
  • threads -用于计算Argon2哈希值的线程数(默认为2)

在更改这些内容之前,请了解,此处较高的成本 会降低脚本的速度
。您需要在服务器上运行测试以找到最适合您的设置。这通常是通过遍历给定成本的几次迭代来完成的。如果需要,PHP手册提供了一个示例。

还要注意,虽然bcrypt存储60个字符,但Argon2可能需要更多字符。理想情况下,您应该使密码字段存储255个字符。

我们要改变password_verify什么?

答案是……什么都没有。知道这password_verify足够聪明,可以弄清楚使用了哪种算法并适当地处理它。如上所述,这意味着如果您使用PASSWORD_DEFAULT,则默认值可以更改并且不会对您造成负面影响(尽管您可能需要调整成本参数)。password_verify只是需要它支持的算法。如果您从bcrypt切换到Argon2,则两者都会以相同的方式进行验证,因为所有必需的数据(盐,哈希和成本)都将为您存储。

//Works for both bcrypt and Argon2if(password_verify($user_password, $stored_hash)) {    // password validated}

如果要从bcrypt升级哈希,则可以在用户成功登录(从而为您提供未加密的密码)后执行此操作。只需检查您的哈希是否以$2y$(bcrypt标记)开头即可。如果是这样,请password_hash再次将提供的密码与Argon2参数一起传递给,然后将其保存到登录用户的密码字段中。

什么是Argon2ID?

如在此Crypto.SE问题中所述,PHP
7.3中引入了Argon2ID,它对Argon2I进行了一些改进。

1-pass Argon2id的最佳折衷攻击是组合的低存储攻击(针对内存的前半部分)和排名攻击(针对后半部分),其综合系数约为2.1。

Argon2ID使用与Argon2I相同的参数。

Django中的PASSWORD_HASHERS设置

Django中的PASSWORD_HASHERS设置

每当我尝试通过任何用户错误登录时都会出错

未知的密码哈希算法“ sahar”。您是否在PASSWORD_HASHERS设置中指定了它?

观点

def Login(request):
    state = "Please log in below..."
    username = password = ''
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username,password=password)
        if user is not None:
                if user.is_active:
                    login(request,user)
                    return HttpResponseRedirect('/profile/')
                else:
                    return render_to_response('auth.html',RequestContext(request))

        else:
                return render_to_response('auth.html',RequestContext(request))
    else:
            return render_to_response('auth.html',RequestContext(request)

md5和password_hash谁跟牛X

md5和password_hash谁跟牛X

md5自不必说,想必所有phper都用过,但另一个加密函数不知道你见过没有

他就是password_hash();

加密方式更全面.使用起来也比md5+salt这种方式要简洁很多,最主要的是难破解,因为它每时每刻都在变动

它的使用方式大致是这样

1. 用户注册时提交过来密码,我们对用户密码进行加密,这里选择password_hash进行加密

2. 加密之后,将加密好的密码存储到数据表中

3.用户再次登录时,我们从表中取出密码,并使用password_verify函数进行校验,查看两种密码是否相同

简单的使用:

    $paaa = password_hash("rasmuslerdorf",PASSWORD_DEFAULT);            //设置密码加密
    $hash = ''$2y$10$2GAiKeqFxxbMUh4iBqRyPOhlhKL7T7kquYQl7u5gGAscKISD9piAm''; //这个是上面加密后得到的值
    if (password_verify(''rasmuslerdorf1'',$hash)) {
          //验证密码是否和散列值匹配
             echo ''对'';
       } else {
     echo ''错'';
       }

如果两次输入的密码不一样,就会输出密码错误

但却存在以下问题

 

1. 版本要求  php版本必须5.5+ (如果做接口对接,要求双方php版本都在5.5以上,会不会有一些不太现实)

2. 通过password_hash加密的密码基本只能通过php的函数password_verify来校验(这样和其他语言交互时会不会很麻烦呢)

所以呢,如果php自家用,我感觉password_hash真的是一个不错的选择,但如果和其他语言或者外界交互的话,可能就会出现一些小麻烦

 

具体参数详解: password_hash();、

https://www.php.net/manual/zh/function.password-hash.php

password_verify()

https://www.php.net/manual/zh/function.password-verify.php

password_hash()PASSWORD_DEFAULT PHP 5.5

password_hash()PASSWORD_DEFAULT PHP 5.5

来自password_hash()函数:

PASSWORD_DEFAULT – Use the bcrypt algorithm (default as of PHP 5.5.0).
Note that this constant is designed to change over time as new and
stronger algorithms are added to PHP. For that reason, the length of
the result from using this identifier can change over time. Therefore,
it is recommended to store the result in a database column that can
expand beyond 60 characters (255 characters would be a good choice).

这是否意味着每当PASSWORD_DEFAULT更改时我将无法使用新的PHP版本,否则password_verify()将无法正确检查旧用户密码?

解决方法:

不,password_verify()将识别所使用的算法,因为它嵌入在您要验证的哈希中:这就是哈希的第一部分(例如$2y $)表示的

php password_hash

php password_hash

2018-1-6 17:22:13 星期六

php 自带的密码生成方法, 如果生成密码最好使用这个, 这个是"单程"的, 没有解密函数

1 $a = ''123456'';
2 
3 $b = password_hash($a, PASSWORD_BCRYPT);
4 
5 echo $b; // 加密结果, 同样的数据, 每次都不一样
6 
7 $c = password_verify(123456, $b); // true或false

 结果将会是 60 个字符的字符串, 或者在失败时返回 FALSE

关于如何将Argon2算法与password_hash一起使用?的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Django中的PASSWORD_HASHERS设置、md5和password_hash谁跟牛X、password_hash()PASSWORD_DEFAULT PHP 5.5、php password_hash的相关信息,请在本站寻找。

本文标签: