我目前正在编写一个程序,其中一部分涉及安全地创建密码哈希以存储在数据库中,我遇到了phpass框架,这似乎是强烈推荐的。在 phpass 中,他们似乎不遗余力地生成尽可能真正随机的盐以用于散列(例如从 /dev/urandom 读取)。
我的问题是,与简单地使用相比,这样做有什么好处uniqid()?关键不是简单地确保用于散列的盐彼此不同而不是随机的吗?使用真正随机的盐实际上不会比使用独特的盐更糟糕,因为它可能会产生碰撞而 uniqid() 不会?
编辑:我的问题不是关于计算机环境中是否存在“真正的”随机性,所以也许我用词不当,但是我的问题更接近于“更多”随机盐是否比更多独特性有任何好处作为盐。
假设我有一个这样的SQL语句来检查用户登录:
SELECT * FROM users
WHERE username='test@example.com', password='abc123', expire_date>=NOW();
Run Code Online (Sandbox Code Playgroud)
SQL中是否有一种方法可以确定哪些WHERE条件失败,而不必将每个条件分成自己的查询并单独测试?
在此特定示例中,它将允许开发人员准确地告诉用户他们尝试登录失败的原因.
出于我的目的,我正在使用PHP/MySQL.
你可以请专家给我一些关于这段代码的信息吗?我错过了一些安全漏洞?你能看到任何潜在的威胁吗?我可以做得更好吗?
我还在学习:)谢谢
<?php
if (isset($_POST['username'])) {
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$password2 = mysql_real_escape_string($_POST['password2']);
$encrypted_password = md5($password);
// remove eventuakl space
foreach($_POST as $key => $val) $_POST[$key] = trim($val);
// check if username is taken
$query = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username'");
if (mysql_result($query, 0) > 0) {
$reg_error[] = 0;
}
// make sure username only cosist of at least 3 letters, numbers or _ -
if (!preg_match('/^[a-zA-Z0-9_-]{3,}$/', $username)) {
$reg_error[] = 4;
}
// …Run Code Online (Sandbox Code Playgroud) 许多网站(我的头顶:GMail和我使用的银行)都有一个安全措施,可以选择您所选择的密码; 例如,选择"mypassword"将被归类为不安全.
但是,在我自己的应用程序中,我正在实现基于随机数和其他用户特定字符串的哈希码的用户特定盐.当然,这会使密码分类(如上所述)成为字典攻击的有效威慑手段,这是多余的吗?
我对吗?为什么谷歌和其他大型网站都在为密码分类烦恼?他们不打扰用户特定的盐吗?
我并不认为自己是安全方面的专家,但在我看来,添加盐并没有真正产生巨大的影响.
例如,如果用户的密码是john1970且salt是123456,这意味着密码是123456john1970,这会使攻击者更难(如果使用字典攻击,例如彩虹表),攻击者很可能猜猜第一部分是盐.我发现使用非标准方法(如使用一些键进行异或或对字符的代码应用一些简单的数学运算)更有效.我知道你们中的大多数人可能不会同意我的观点,但这对我来说似乎更有意义.
你的意见?
重复:
嘿,我想对此有所了解
我用这个来为我的每个用户注册时产生独特的盐(随机字母和数字).盐会崩溃的可能性有多大?
uniqid(mt_rand());
Run Code Online (Sandbox Code Playgroud)
然后,我使用md5将salt,密码和电子邮件(按此顺序)一起作为密码进行哈希,并在登录时重新进行重新哈希.
md5($salt . $password . $email);
Run Code Online (Sandbox Code Playgroud)
这比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 ;
Run Code Online (Sandbox Code Playgroud)