首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MYSQL表中使用Hash和Salt

在MYSQL表中使用Hash和Salt
EN

Stack Overflow用户
提问于 2013-06-10 04:23:52
回答 4查看 2.2K关注 0票数 2

我有一个MySQL 'users‘表,其中包含以下列: uname、hash、salt和pwd。我正在测试一个PHP登录页面,它使用这个表来获得用户访问权限。我目前还没有系统设置来注册用户,所以测试通过手动添加数据到表中,具有以下.....

代码语言:javascript
复制
uname: 'testuser',
pwd: 'password'

用来检查密码的php函数如下:

代码语言:javascript
复制
function checkPwd($uname, $pwd){
    // Get the hash and salt for this user:
    $q = "SELECT hash, salt FROM users WHERE uname = '".mysql_real_escape_string($uname)."';";
    $res = mysql_query($q) or die("Could not retrieve user login data " . mysql_error());
    $tmp = mysql_fetch_assoc($res);
    $hash = $tmp['hash'];
    $salt = $tmp['salt'];
    // Hash and salt $pwd so we can make a comparison:
    $hashedInput = sha1($salt . $pwd);
    if($hash == $hashedInput) return true; // Return true if the hashed and salted $pwd matches DB entry
    return false;
}

这显然不起作用,问题是我不是真的理解哈希和盐做事情的方式。我如何测试我的登录页面,使上面的功能保持安全。我必须在salt和hash字段中输入任何内容吗?

EN

回答 4

Stack Overflow用户

发布于 2013-06-10 05:56:54

使用加密散列函数的目的是values created by those functions are not reversible。因此,如果有人拥有密码的哈希,除了暴力破解之外,没有其他可行的方法来确定密码。

然而,有一些技术可以通过使用预计算查找表进行时间/空间权衡来颠覆暴力强制。这些可以是已知的散列、→和密码对的简单查找表。或这种查找表的扩展类型,即所谓的Rainbow table

这就是盐的用武之地。它用于对用户的密码进行add additionally entropy,这样散列函数的每个输入都是唯一的,因此也创建了一个唯一的散列:password肯定已经在查询表中了,但是xi2B9LMweH/jM8Khxedls+password肯定不会。由于彩虹表的构造方式,攻击者需要为每个唯一的盐构造一个彩虹表。

请注意,salt的目的只是为了击败这种查找表攻击。如果盐是已知的,人们仍然可以进行字典攻击,或者无论如何都可以进行暴力攻击。如果密码是错误的,它仍然可以被猜测或暴力强制。

至于实现部分,最好不要重复发明轮子。因此,我们来看看和。

票数 3
EN

Stack Overflow用户

发布于 2013-06-10 06:14:40

我目前还没有注册用户的系统设置,所以在following...Its不起作用的情况下,通过手动向表中添加数据进行测试。

如果它不工作呢?为了让您的函数正常工作,您需要向hash中插入一个与您的加盐方法( sha1行)相匹配的值。

问题是,我并不是真的理解哈希和盐的方式。

salt的目的是使得到的哈希值“不可预测”。散列是一种方法,但黑客使用散列字典通过暴力破解(Rainbow table)来识别密码。

盐可以与散列一起存储在您的数据库中-它不需要保密。然而,对于攻击者来说,重新生成知道盐的字典将是相当微不足道的。这就是为什么使用像Scrypt这样的方法更好。Scrypt需要大量的CPU时间和内存来计算单个散列。

可以将Scrypt散列配置为每个散列花费100ms。这意味着您每秒可以生成10个哈希值。常规的散列方法,如SHA1,都是为了提高速度而构建的。例如:使用比特币挖掘(使用散列),您可以使用hardware以低至300美元的价格生成每秒5000兆哈希值。GPU也擅长计算哈希。像Scrypt这样的方法是保护密码的理想方法,因为它们很难暴力破解。

我如何测试我的登录页面,使上面的功能保持安全。我必须在salt和hash字段中输入任何内容吗?

是的,您需要在哈希列中输入值。看起来你需要做更多的工作才能测试任何登录。

由于您不熟悉这些主题,我强烈建议您使用一个通用的PHP框架来为您处理这些事情。至少要检查一下这些框架是如何实现身份验证的。Security stack exchange也是一个很好的资源。

票数 0
EN

Stack Overflow用户

发布于 2013-06-10 04:52:24

您只需要" Salt“和" password ",Salt的角色是创建一个随机字符串值,以便像使用公钥一样使用它来加密密码。

例如:$salt = base_convert(sha1(uniqid(mt_rand(),true)),16,36);

现在你可以用这个Salt加密你的密码:$pwd = sha1($salt .$POST‘’pwd‘);,然后将$pwd和$salt保存在数据库中。

现在,如果您想要检查登录:您对数据库中的唯一值(电子邮件、用户名)执行SELECT查询,然后通过solt和test加密输入的密码。

编辑:

对于Salt行:我们为uniqid (php.net/手动/fr/function.uniqid.php)创建一个随机值,介于任意两个数字之间我选择16和36,然后选择sha1以使其更强,最后我们使用php.net/manual/fr/function.base-convert.php清理我们的Salt

希望能有所帮助。

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

https://stackoverflow.com/questions/17013826

复制
相关文章

相似问题

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