gpt4 book ai didi

php - 在 MYSQL 表中使用 Hash 和 Salt

转载 作者:行者123 更新时间:2023-11-29 03:38:57 25 4
gpt4 key购买 nike

我有一个 MySQL“用户”表,其中包含以下列:uname、hash、salt 和 pwd。我正在测试使用此表获取用户访问权限的 PHP 登录页面。我目前还没有系统设置来注册用户,因此通过以下方式手动将数据添加到表中进行测试......

uname: 'testuser',
pwd: 'password'

处理密码检查的 php 函数如下:

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 字段中输入任何内容吗?

最佳答案

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

但是,有一些技术可以通过使用预先计算的查找表进行时间/空间权衡来颠覆暴力破解。这些可以是已知哈希密码对的简单查找表。或此类查找表的扩展类型,即所谓的 Rainbow table .

这就是盐的来源。它被用来add additionally entropy到用户的密码,以便散列函数的每个输入都是唯一的,从而也创建一个唯一的散列:password 肯定已经在查找表中,但是,xi2B9LMweH/jM8Khxedls+ password 肯定不会。由于彩虹表的构建方式,攻击者需要为每种独特的盐构建一个彩虹表。

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

现在至于实现部分,最好不要重新发明轮子。所以看看Secure hash and salt for PHP passwordsHow do you use bcrypt for hashing passwords in PHP? .

关于php - 在 MYSQL 表中使用 Hash 和 Salt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17013826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com