嘿,我想对此进行输入
我使用它在注册时为每个用户生成独特的盐(随机字母和数字)。盐会分裂的可能性有多大?
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 ;
答案 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。