0

嘿,我想听听你的意见

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

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 ;
4

5 回答 5

13

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

于 2009-10-19T12:07:57.147 回答
4

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

$hashed = md5( $per_user_salt . $password . $app_salt );
于 2009-10-19T12:10:24.380 回答
3

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

您没有遇到 N 的机会是 1-1/2147483647。

所以你没有遇到第一个,第二个,第三个,... Pth N 的机会变成了 (1-1/2147483647) 的 Pth 次方。

所以你遇到一种 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%
于 2009-10-19T12:45:29.190 回答
0

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

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

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

于 2009-10-19T19:41:04.167 回答
-1

他们永远不会相撞。

....也许在 10000000000000000 中出现一次。

于 2009-10-19T12:05:11.790 回答