1

我有以下代码:

$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_* 我知道,这只是草稿。

4

4 回答 4

3

PHP 中的字符串连接使用.not +。因此:

hash('sha512',$pass+$salt)

应该

hash('sha512',$pass.$salt) // or
hash('sha512',"${pass}${salt}")
于 2012-08-02T09:43:45.337 回答
2

这是PHP,$pass+$salt应该是$pass . $salt

于 2012-08-02T09:44:13.340 回答
1

我要对您当前的代码发表一些评论:

  1. 在两个字符串上使用+运算符(而不是.)会导致两个值的总和转换为整数(如果字符串不是数字,则转换为int(0));当它被传递给hash()它时,它会再次转换为字符串,因此您的密码通常都是sha512("0"). 我不确定为什么你的盐都具有相同的值,除非列数据类型INT在你的数据库中。

  2. 您可以使用它uniqid(mt_rand(), true)来收集更多的熵,从而获得更好的盐。

  3. 您应该使用专用的密码散列来散列密码,例如crypt()(确保您的列宽足够大)中的 BlowFish 选项;通过这种方式,您可以摆脱盐列,并且可以选择以向后兼容的方式验证哈希所需的工作量。

  4. cookie 列用于我假设的自动登录功能?最好为此创建一个单独的表,其中包含一个随机字符串作为主键和用户表的外键。这样您就可以支持从多个浏览器自动登录。

于 2012-08-02T10:03:39.893 回答
0

这里的错误

$pass+$salt

应该

$pass.$salt

. 用于 php 中的字符串连接

于 2012-08-02T09:45:22.833 回答