【发布时间】: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 ;
【问题讨论】:
-
不使用 MD5 作为散列算法可能会有所改进。你选择那个有什么原因吗?
-
“更安全”在什么方面?见stackoverflow.com/questions/420843/421147#421147
-
SHA256 或更高版本会是更好的选择
-
bcrypt 甚至比 SHA-anything 还要好。 MD5 和 SHA 都被设计为尽可能快; bcrypt 的设计目的是在执行单个哈希时足够(即几乎任何合法用途),但不会更快,因此执行大量哈希(即,尝试暴力破解密码) ) 尽可能地昂贵和耗时。