Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.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 MD5,密码哈希和salt位置_Php_Hash_Md5_Salt - Fatal编程技术网

Php MD5,密码哈希和salt位置

Php MD5,密码哈希和salt位置,php,hash,md5,salt,Php,Hash,Md5,Salt,在开始之前,我知道MD5已经被破坏(冲突攻击和散列速度),不应该被使用 要散列密码,但只是为了它,请容忍我 我的问题是: 使用md5散列时盐的位置如何影响“质量” 还是散列的“强度” 假设我有下面一段代码,它散列了一个用户 使用其部分电子邮件地址作为salt的密码: <?php $email = 'user@emailservice.ex'; $password = 'RandomPassWithChars'; $segments = explode('@', $

在开始之前,我知道MD5已经被破坏(冲突攻击和散列速度),不应该被使用 要散列密码,但只是为了它,请容忍我

我的问题是: 使用md5散列时盐的位置如何影响“质量” 还是散列的“强度”

假设我有下面一段代码,它散列了一个用户 使用其部分电子邮件地址作为salt的密码:

<?php
    $email = 'user@emailservice.ex';
    $password = 'RandomPassWithChars';

    $segments = explode('@', $email);
    list($saltPart1, $saltPart2, $saltPart3) = $segments;

    $hash = md5($saltPart1.$password.$saltPart3.$saltPart2);
?>

这段代码会减慢暴力/字典/彩虹表的速度吗 攻击,而不是说:

<?php
    $password = 'RandomPass';
    $salt     = 'RandomSaltStoredInTheDatabase';
    $hash = md5($password, $salt);
?>

是否值得尝试像在第一个代码中那样添加密码或使用它 与第二个代码的结果相同?这有什么好处吗? 第一个代码是否会延迟破解以这种方式散列的密码列表 第二种方法是什么

这就引出了第二个问题: 在数据库中存储盐比获取盐安全吗 从一个用户id(说电子邮件地址)? 在我看来,一旦攻击者获得了数据库的副本 这也抑制了盐分,这使得他的生活更容易尝试破解散列。但是如果盐没有存储,攻击者还需要创建盐的算法。如果我错了,请纠正我


我希望我能把自己说清楚。感谢您提前给出答案。

当您处理密码安全问题时,请始终假定如果攻击者可以访问您的数据库,那么他就可以访问您的代码

因此,当涉及到salt时,只需生成一个随机值的散列(例如,
mcirotime()
),并在散列之前使用它来对密码进行salt,并将其存储在数据库中密码旁边的一列中

当把哈希添加到密码中时,我个人的看法是,如果你把它放在第一个或最后一个或者中间,这并不重要。


你要保安吗?然后使用慢速散列算法,我强烈推荐,因为它使用
bcrypt
(基于河豚)作为默认散列算法。

这取决于攻击者是否试图绕过您的安全设置或是否试图查找密码

如果由于散列算法的加密弱点,攻击者依赖于查找与数据库给定散列的冲突,salt将不会产生任何影响:我有一堆位,我希望找到XXX散列算法的一些输入,该算法在输出中为我提供相同的一堆位

如果他试图通过尝试每种可能的组合来强制执行密码,那么他可以收集到的关于原始密码的任何信息都将有助于:

  • 长度
  • 组合(字母数字字符、特殊符号等)
通过创建您自己的salt算法,实际上您正试图通过模糊处理来实现安全性,这确实会限制不知道您的算法的任何人对密码的粗暴使用,但这并不会加强哈希算法。

第一个问题:

盐的位置对特定哈希的安全性没有影响。一个好的散列函数具有完美的熵,即对于每一个发生变化的输入位,每一个输出位都有50%的变化机会

某个顺序可能带来的任何安全好处都将完全来自用于将salt与预期密码连接起来的算法的相对缓慢(例如,如果
“password”。“salt”
“salt”;“password”
,请使用前者)。然而,大多数编程语言都没有这种性能“问题”

第二个问题:

如果salt显式存储在数据库中,攻击者将知道salt,并能够发起蛮力哈希攻击。如果salt未知,仍然可以使用蛮力密码攻击(尽管在尝试之间插入延迟很容易导致无效)。此外,攻击者还可以对程序进行反向工程并检索哈希字段

至于散列的安全性,如果用户在两个不同的地方拥有相同的电子邮件和密码,这就否定了随机salt的好处之一,因为相同的散列在两个地方都是可见的

就我个人而言,我认为哈希的最佳方法是使用:

"password" . "salt" . "internalconstantvalue"

这样做的好处是简单,而且安全性不低于大多数其他安全方法。

通过模糊实现安全性很少是一个好主意。@Wooble这是真的,但这两种Salting方法之间有什么区别吗MD5在密码哈希方面不受损害,MD5上没有前置映像。然而,由于碰撞攻击,它在加密方面受到了威胁。考虑到这一点,我仍然认为我不会使用它。我的缺点是,当我说“妥协”时,我在考虑hasing的速度和碰撞可能的重复。你能解释一下碰撞攻击如何与本案相关吗?为什么攻击者会尝试查找具有相同哈希的两个密码?
“password”的+1。“盐”。“internalconstantvalue”
,奇怪的是,它从未出现在salt教程中