这个可以吗?盐

时间:2009-10-19 12:01:41

标签: php security hash salt

嘿,我想对此进行输入

我使用它在注册时为每个用户生成独特的盐(随机字母和数字)。盐会分裂的可能性有多大?

uniqid(mt_rand());

然后我使用md5将salt,密码和电子邮件(按此顺序)散列为密码,并在登录时重新散列。

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 ;

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

你没有遇到N的可能性是1-1 / 2147483647。

所以你没有遇到第一个,第二个,第三个...... Pth N的机会成为(1-1 / 2147483647)的Pth力量。

所以你遇到P分布式盐之一的机会是1 - (你不会遇到任何P盐)

= 1 - (1-1 / max)** 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%

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:-1)

他们永远不会感冒。

....也许一次在10000000000000000。