我想在数据库中的密码旁边存储一个(随机)盐。现在,问题是:
我应该以散列还是纯文本的形式存储它?有什么区别吗(更安全,更快?)?A我应该花多大的精力来创建一个随机字符串?
示例代码:
//Creating random salt
$saltchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&()*+,-./:;<=>?@[]^_`{|}~";
$salt = uniqid(rand(), true).str_shuffle($saltchars);
// Or should the salt be hashed (md5 or sha512 for more security)
// $salt = hash('sha512', uniqid(rand(), true).$staticsalt.str_shuffle($saltchars));
//Create user (with salt & pepper)
$sqlquery = "INSERT INTO users (user, password, salt) VALUES('$id','".hash('sha512', $staticsalt.$accesskey.$salt)."','".$salt."');";
$sqlresult = mysql_query($sqlquery); 对于记录: login-script
$sqlquery = "SELECT salt FROM users WHERE user='$id';";
$sqlresult = mysql_query($sqlquery);
if (mysql_num_rows($sqlresult) == 1) {
$salt = (mysql_fetch_array($sqlresult));
//Check if the password is correct
$sqlquery = "SELECT * FROM users WHERE user='$id' AND password='".hash('sha512', $staticsalt.$accesskey.$salt[0])."'";
$sqlresult = mysql_query($sqlquery);
unset($accesskey, $salt);
//Check whether the query was successful or not
if($sqlresult) {
if(mysql_num_rows($sqlresult) == 1)
{echo 'Login successfull';}
else {die('Error: wrong user ID/password');}
}
}我知道有很多,可能太多的网站讨论盐的利弊。但是没有人回答盐是否应该加密-也没有人展示如何用随机(!)salts (像我一样保存在数据库中)。
所以作为一个php初学者,我不知道这段代码是否安全?或者如果有什么技巧可以让它变得更快或更流线型...谢谢!
发布于 2011-07-03 03:24:39
由于您需要在登录脚本中使用salt来计算密码散列,因此您不能只存储salt的散列,因为这将是一个不可逆的操作,即原始salt将丢失。
因此,我假设您是在问,对从随机字符串中选取的原始盐进行散列处理是否会产生更好的盐。在这种情况下,散列函数的使用与“散列”无关,它只是生成更长、看起来更随机的序列的一种方式。然而,这完全没有意义,因为散列的盐仍然需要存储在数据库中-如果您愿意的话,以明文存储!
发布于 2011-07-03 03:23:38
无所谓。您可以假设salt是公共信息,因为如果攻击者知道salt,那么salt帮助防止的攻击--彩虹表辅助字典攻击--不会变得更容易。你应该问问你自己,为什么你认为首先加密盐是个好主意。
此外,您还应该阅读以下内容:
发布于 2011-07-03 03:24:12
没有人谈论盐被散列,因为盐不能散列。如果原因不明显-如果你真的“不知道这段代码是否安全”-请使用别人的认证系统,而不是创建你自己的认证系统,因为如果你不知道自己在做什么,很容易留下巨大的安全漏洞。
编辑:
散列是单向的。你把数据放进去。你不能把数据拿出来。这就是它的作用。如果你把盐放进去,你就拿不出来了。如果你不能获取它,你就不能将它添加到用户提供的密码中。如果你不能做到这一点,你就不能把它当做盐来使用。
https://stackoverflow.com/questions/6559068
复制相似问题