我有以下代码:
$salt=uniqid(mt_rand(), false);
#Add data to tables
mysql_query("INSERT INTO accounts VALUES('$user', '".hash('sha512',$pass+$salt)."', '$salt', '$cookie_value')");
mysql_query("INSERT INTO passwordreset VALUES('$user', NULL, NULL)");
#cookie creation
#.....
#cookie update
mysql_query("UPDATE accounts SET cookie='$cookie_value' WHERE user='$user'");
我使用这些函数清理表单中的数据:
$var = htmlentities($var, ENT_QUOTES, "UTF-8");
return mysql_real_escape_string($var);
今天我登录phpMyAdmin,我看到所有用户的密码和盐是相同的。 不要提醒我关于弃用的mysql_ *我知道,这只是快速草稿。
答案 0 :(得分:3)
PHP中的字符串连接使用.
而非+
。因此:
hash('sha512',$pass+$salt)
应该是
hash('sha512',$pass.$salt) // or
hash('sha512',"${pass}${salt}")
答案 1 :(得分:2)
这是PHP,$pass+$salt
应为$pass . $salt
答案 2 :(得分:1)
我会对您当前的代码发表评论:
在两个字符串上使用+
运算符(而不是.
)会导致两个值的总和转换为整数(如果字符串不是数字,则会转换为{{1 }});当它传递给int(0)
时,它会再次被转换为字符串,因此您的密码通常都是hash()
。我不确定为什么你的盐都具有相同的值,除非你的数据库中的列数据类型是sha512("0")
。
您可以使用INT
收集更多熵,从而获得更好的盐。
您应该使用专用密码哈希来哈希密码,例如crypt()
中的BlowFish选项(确保您的列宽足够大);通过这种方式,您可以摆脱salt列,并且可以选择以向后兼容的方式验证哈希所需的工作量。
Cookie列是否为我假设的自动登录功能?最好为此创建一个单独的表,其中包含随机字符串作为主键和users表的外键。这样您就可以支持从多个浏览器进行自动登录。
答案 3 :(得分:0)
错误
$pass+$salt
应该是
$pass.$salt
。用于php中的字符串连接