【问题标题】:is this ok? salting这个可以吗?盐
【发布时间】:2009-10-20 03:41:04
【问题描述】:

嘿,我想听听你的意见

我使用它为我的每个用户在注册时生成唯一的盐(随机字母和数字)。盐类碰撞的可能性有多大?

uniqid(mt_rand());

然后我使用 md5 将盐、密码和电子邮件(按此顺序)一起作为密码进行哈希处理,并在他们登录时重新哈希处理。

md5($salt . $password . $email);

这比 md5 安全多少?有什么可以改进的吗?

CREATE TABLE IF NOT EXISTS `users` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(24) CHARACTER SET utf8 NOT NULL,
`password` varchar(32) CHARACTER SET utf8 NOT NULL,
`email` varchar(255) CHARACTER SET utf8 NOT NULL,
`salt` varchar(255) CHARACTER SET utf8 NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `username` (`username`),
 UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

【问题讨论】:

标签: php security hash salt


【解决方案1】:

它们是否碰撞并不重要。 salt 的目的是,如果你对相同的值进行两次哈希但使用不同的 salt,结果会有所不同。如果攻击者获取你的哈希数据库,salt 将使用预先计算的已知密码的哈希数据库进行无效攻击。盐本身不是秘密,盐的碰撞也不是问题。

【讨论】:

  • Salt 冲突是一个非常小的问题,因为它们允许您并行工作以暴力破解共享相同 salt 的密码。不过,就个人而言,我确实同意这不是您真正需要担心的事情。它所增加的曝光率(至少有两个字符的字母数字盐)是如此之小,因此您最好将时间花在增加安全架构的其他部分上。
【解决方案2】:

我不会在密码哈希中使用电子邮件地址。如果一个人更改了他们的电子邮件地址,它将使散列密码无效,因此您必须让用户在每次更改他们的电子邮件地址时更改他们的密码。我通常为每个用户使用一个盐,每个应用程序一个盐(对所有用户都是固定的)。这样,攻击者需要访问您的应用程序和您的用户数据库才能获得访问权限。

$hashed = md5( $per_user_salt . $password . $app_salt );

【讨论】:

  • 我也不会,但其他答案已经提到了这个问题,所以我解决了另一个问题。
【解决方案3】:

getrandmax 似乎返回一个相当大的数字 (2147483647),具体取决于您的平台。因此,您遇到任何给定 N 的机会是 1/2147483647。

你没有遇到 N 的几率是 1-1/2147483647。

所以你没有遇到第一个,第二个,第三个的机会...

所以您确实遇到一种 P 分布式盐的机会是 1 -(您没有遇到任何 P 盐的机会)

= 1 - (1-1/最大值)**P

这意味着曲线从大约四分之一的盐开始急剧下降。 (来自excel的表格):

                        max
                          2,147,483,647
            P = number/salts        ( 1 - 1/max ) ^ P       collission chance
               16777216                    0                   1%
               33554432                    0                   2%
               67108864                    0                   3%
              134217728                    0                   6%
              268435456                    0                  12%
              536870912                    0                  22%
             1073741824                    0                  39%
             2147483648                    0                  63%
             4294967296                    0                  86%
             8589934592                    0                  98%
            17179869184                    0                 100%

【讨论】:

    【解决方案4】:

    您也可以考虑使用 SHA256,我们看到越来越多的 MD5 漏洞利用。由于哈希结果的长度,SHA256 会需要额外的存储空间,但我认为这是值得的。

    $hashed = hash('sha256', $per_user_salt . $password . $app_salt );

    注意:这需要 PHP 5.1.2 或更高版本。

    【讨论】:

      【解决方案5】:

      它们永远不会碰撞。

      ....可能在 10000000000000000 次。

      【讨论】:

      • 这在数学上似乎不正确。我可以看到一些支持该数字的统计数据吗?
      • 也许吧?对于从 0-2^32 范围内取出的 500000000 个盐,碰撞的几率超过 30%。
      猜你喜欢
      • 2011-09-05
      • 2013-10-18
      • 2015-03-09
      • 2012-07-05
      • 1970-01-01
      • 2013-03-24
      • 2012-12-30
      • 2020-10-27
      • 1970-01-01
      相关资源
      最近更新 更多