Php 这样行吗?腌制

Php 这样行吗?腌制,php,security,hash,salt,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 NU

嘿,我想听听你的意见

当我的每个用户注册(随机字母和数字)时,我使用它为他们生成唯一的盐。盐结块的可能性有多大

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 ;

他们永远不会屈服


…也许是百万分之一

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

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

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

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

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

所以你没有遇到第一,第二,第三。。。Pth N成为(1-1/2147483647)的Pth功率

所以你遇到一种磷分布盐的几率是1-(你没有遇到任何磷盐的几率)

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

这意味着曲线从大约四分之一吉格急剧下降。 (excel中的表格):


<>你也可以考虑使用Sa256,我们看到MD5的使用越来越多。由于散列结果的长度,SHA256将需要额外的存储空间,但我认为这是值得的

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


注意:这确实需要PHP5.1.2或更高版本。

这个问题看起来很像:不使用MD5作为散列算法可能会有所改进。你选择那个有什么原因吗?“更安全”在什么方面?请看SHA256或更高版本,这将是一个更好的选择。CRYPT甚至比SHA任何产品都好。MD5和SHA都设计得尽可能快;bcrypt的设计目的是在执行单个哈希(即,几乎任何合法的使用)时足够快,但不能更快,因此执行大量哈希(即,试图强行输入密码)是尽可能昂贵和耗时的。这在数学上似乎不正确。我能看看支持这个数字的统计数据吗?也许吧?对于0-2^32范围内的500000000个盐,冲突的几率超过30%。盐冲突是一个非常小的问题,因为它们允许您并行工作,以强制使用共享相同盐的密码。但就我个人而言,我同意这不是你真正需要担心的事情。它所造成的风险增加(至少有两个字符的字母数字salt)是如此之小,以至于你最好把时间花在增加安全体系结构的其他部分上。我也不会,但其他答案已经提到了这个问题,所以我提出了另一个问题。
                        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%