Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有2048位和salt的哈希算法_Php_Security_Hash_Salt - Fatal编程技术网

Php 具有2048位和salt的哈希算法

Php 具有2048位和salt的哈希算法,php,security,hash,salt,Php,Security,Hash,Salt,如何实现一种算法来存储和比较2048位密码中的哈希值,并使用PHP对每个密码使用随机盐? 编辑1: 我想我的问题还不够清楚。我的意思是,我不会做我的加密算法。但是如何存储密码和盐呢。是每个密码的随机盐。嗯,将盐和密码一起存储在数据库中是不明智的。 编辑2: 这是个好办法吗 1) 用户输入密码, 2) 系统生成密码的哈希值, 3) 系统生成此盐的密码(我使用time()?) 作为随机盐,如何以及在何处将盐存储到密码?拜托,我不想把盐和密码一起储存,因为我想这不是很确定 因此,在用户登录时存储的

如何实现一种算法来存储和比较2048位密码中的哈希值,并使用PHP对每个密码使用随机盐?

编辑1:


我想我的问题还不够清楚。我的意思是,我不会做我的加密算法。但是如何存储密码和盐呢。是每个密码的随机盐。嗯,将盐和密码一起存储在数据库中是不明智的。

编辑2:

这是个好办法吗

1) 用户输入密码,
2) 系统生成密码的哈希值,
3) 系统生成此盐的密码(我使用time()?)

作为随机盐,如何以及在何处将盐存储到密码?拜托,我不想把盐和密码一起储存,因为我想这不是很确定

因此,在用户登录时存储的密码和salt相同之后,我得到了与salt一起存储的密码散列,并将其与保存的salt提供的密码散列进行比较

在哪里保存盐? 这是一个很好的方法吗

“嗯,将盐和密码一起存储在数据库中是不明智的。”

“因为如果我的数据库遭到破坏,并且有人可以访问这些数据,那么每个密码都会包含salt。这是不正确的。我想我只是不应该使用salt并将其与密码一起交给暴力。因为这是正确的?”

这些核心假设是错误的。salt的要点是为每个密码添加一个唯一的元素,这样两个相同的密码就不会散列到同一个散列值。盐不是秘密。我再说一遍:盐不是秘密。秘密是密码,盐只是增加了唯一性。攻击者必须通过尝试所有可能的字符组合并将结果与哈希值进行比较来强制输入密码。如果他也知道盐,他仍然必须做到这一点

如果攻击者成功无盐强制输入密码“foobar”,则他已强制输入每个密码“foobar”。如果您添加了一个唯一的salt,并且攻击者成功地强制输入密码“foobar”+salt,那么他只强制输入了一个密码。他将不得不分别攻击其他每个密码“foobar”,因为它们都散列为不同的值,这要归功于独特的salt

这就是盐的要点。是的,如果你也能对salt保密,那就更好了,因为那样攻击者就必须对一个值进行多次暴力攻击。但这是不可行的,因为您还需要访问salt来确认密码。如果您需要访问散列和salt,那么有权访问散列的攻击者可能也有权访问salt。如果攻击者能够访问salt,也不会降低安全性

“嗯,将盐和密码一起存储在数据库中是不明智的。”

“因为如果我的数据库遭到破坏,并且有人可以访问这些数据,那么每个密码都会包含salt。这是不正确的。我想我只是不应该使用salt并将其与密码一起交给暴力。因为这是正确的?”

这些核心假设是错误的。salt的要点是为每个密码添加一个唯一的元素,这样两个相同的密码就不会散列到同一个散列值。盐不是秘密。我再说一遍:盐不是秘密。秘密是密码,盐只是增加了唯一性。攻击者必须通过尝试所有可能的字符组合并将结果与哈希值进行比较来强制输入密码。如果他也知道盐,他仍然必须做到这一点

如果攻击者成功无盐强制输入密码“foobar”,则他已强制输入每个密码“foobar”。如果您添加了一个唯一的salt,并且攻击者成功地强制输入密码“foobar”+salt,那么他只强制输入了一个密码。他将不得不分别攻击其他每个密码“foobar”,因为它们都散列为不同的值,这要归功于独特的salt


这就是盐的要点。是的,如果你也能对salt保密,那就更好了,因为那样攻击者就必须对一个值进行多次暴力攻击。但这是不可行的,因为您还需要访问salt来确认密码。如果您需要访问散列和salt,那么有权访问散列的攻击者可能也有权访问salt。如果攻击者能够访问salt,这也不会降低安全性。

我想建议sameI不得不问-你到底为什么要使用2048位作为密码?你用什么算法来做这个?如果你想建立自己的-不要!同行评议的算法是更安全的选择。每一家尝试过自定义加密的公司都会同意这一点——因为他们都是通过“自定义”加密被破解的。我想我的问题还不够清楚。我的意思是,我不会做我的加密算法。但是如何存储密码和盐呢。是每个密码的随机盐。嗯,将盐和密码一起存储在数据库中是不明智的。事实上,有同行评审的解决方案,从理论角度来看,这并不会使问题变得不那么有趣。除了不使用现成的解决方案外,另一个常见的陷阱是使用现成的解决方案而不了解其背后的理论。请看一下使用
CRYPT\u河豚
。我发布的链接有很好的例子。Bcrypt已经成为一个事实上的标准,所以试一试。只需避开
$2x$
$2y$