首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Salts:散列文本还是纯文本?

Salts:散列文本还是纯文本?
EN

Stack Overflow用户
提问于 2011-07-03 03:17:24
回答 4查看 1.7K关注 0票数 2

我想在数据库中的密码旁边存储一个(随机)盐。现在,问题是:

我应该以散列还是纯文本的形式存储它?有什么区别吗(更安全,更快?)?A我应该花多大的精力来创建一个随机字符串?

示例代码:

代码语言:javascript
复制
    //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

代码语言:javascript
复制
    $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初学者,我不知道这段代码是否安全?或者如果有什么技巧可以让它变得更快或更流线型...谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-03 03:24:39

由于您需要在登录脚本中使用salt来计算密码散列,因此您不能只存储salt的散列,因为这将是一个不可逆的操作,即原始salt将丢失。

因此,我假设您是在问,对从随机字符串中选取的原始盐进行散列处理是否会产生更好的盐。在这种情况下,散列函数的使用与“散列”无关,它只是生成更长、看起来更随机的序列的一种方式。然而,这完全没有意义,因为散列的盐仍然需要存储在数据库中-如果您愿意的话,以明文存储!

票数 4
EN

Stack Overflow用户

发布于 2011-07-03 03:23:38

无所谓。您可以假设salt是公共信息,因为如果攻击者知道salt,那么salt帮助防止的攻击--彩虹表辅助字典攻击--不会变得更容易。你应该问问你自己,为什么你认为首先加密盐是个好主意。

此外,您还应该阅读以下内容:

  • http://codahale.com/how-to-safely-store-a-password/
票数 5
EN

Stack Overflow用户

发布于 2011-07-03 03:24:12

没有人谈论盐被散列,因为盐不能散列。如果原因不明显-如果你真的“不知道这段代码是否安全”-请使用别人的认证系统,而不是创建你自己的认证系统,因为如果你不知道自己在做什么,很容易留下巨大的安全漏洞。

编辑:

散列是单向的。你把数据放进去。你不能把数据拿出来。这就是它的作用。如果你把盐放进去,你就拿不出来了。如果你不能获取它,你就不能将它添加到用户提供的密码中。如果你不能做到这一点,你就不能把它当做盐来使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6559068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档