我正在为用户密码部署经典的哈希保护。登录时提交的密码先进行加盐,散列,然后与数据库中已存储的散列进行比较。
但不是使用PHP函数调用来比较现在散列的用户输入和存储的散列,而是在数据库中进行比较-更精确地,使用WHERE
子句(注意:由于各种原因,盐已经被人们所知此比较开始,但密码不是)。
由于用户名是唯一的,因此以下查询有效地告诉用户名和密码对是否匹配:
SELECT * FROM `users` WHERE `password`='$password_hash' AND `username`='$username';
这种方法容易受到定时攻击吗?
编辑:SQL注入不是一个问题,它已得到照顾。
参考方案
是的,原则上,字符串比较(和/或索引查找)可能会泄漏数据库中存储的密码散列和根据输入的密码份额计算出的相同的前导字节有多少个。
原则上,攻击者可以使用此方法逐字节地迭代学习密码哈希的前缀:首先,他们找到一个哈希,该哈希与数据库中的哈希共享第一个字节,然后再共享前两个字节,因此上。
不,这几乎肯定没有关系。
为什么?好吧,由于多种原因:
定时攻击可以使攻击者了解用户密码哈希的一部分。但是,即使攻击者知道整个密码哈希,经过精心设计的密码哈希方案(使用salt和key stretching)也应保持安全(当然,假设密码本身不容易猜测)。因此,即使定时攻击成功,密码本身也将是安全的。
要进行攻击,攻击者必须提交他们知道其哈希值的密码。哈希值取决于盐。因此,除非攻击者以某种方式已经知道盐分,否则这种攻击是不可能的。
(的确,在大多数密码哈希方案的安全性分析中,盐被假定为公共信息。但是,这仅是因为此类分析假定了上述最坏情况,即攻击者已经获得了副本。整个用户数据库,盐和哈希以及所有其他内容。如果攻击者尚不知道哈希,则没有理由假设他们会知道盐。)
即使攻击者知道了盐,为了进行上述的反复攻击,他们也需要生成散列为具有所需前缀的值的密码。对于任何安全的哈希函数,唯一可行的方法是尝试通过错误进行操作,这意味着这样做所需的时间与前缀的长度成指数比例增长。
实际上,这意味着,为了提取足够多的散列位以能够对其进行离线蛮力攻击(不必全部都是散列攻击;仅是加密中有效量的熵)密码),攻击者需要执行所需的运算量才能破解密码本身。对于设计良好的密码哈希方案和安全选择的密码,这是不可行的。
原则上,迭代式攻击可以为攻击者提供在本地进行大多数暴力计算的能力,同时仅向系统提交数量很少的密码。但是,只有当他们从提交的每个密码中收到详细且可靠的计时信息时,这种情况才成立。实际上,实时定时攻击效率极低,并且需要许多(通常成千上万)查询才能产生任何有用的信息。这很可能会抵消定时攻击可以为攻击者提供的任何潜在性能优势。
使用适当的密钥扩展密码哈希方案可以放大这一点,因为这种方案被故意设计得很慢。因此,与首先对密码进行哈希处理相比,数据库中的字符串比较可能花费的时间可以忽略不计,因此,由此引起的任何时序变化都将在噪声中丢失。
PHP getallheaders替代 - php我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…
PHP:将字符串拆分为字母和数字部分的最佳方法 - php我有几个格式的字符串AA11 AAAAAA1111111 AA1111111 分离字符串的字母和数字部分的最佳方法(最有效)? 参考方案 如果它们都是一系列字母,然后是一系列数字,并且没有非字母数字字符,那么sscanf()可能比regexp更有效$example = 'AAA11111'; list($alpha,$numeric) =…
php-casperjs获取内部文本 - php我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…
PHP:从函数返回值并直接回显它? - php这可能是一个愚蠢的问题,但是……的PHPfunction get_info() { $something = "test"; return $something; } html<div class="test"><?php echo get_info(); ?></div> 有没有办…
php:是否有充分的理由引用所有数组键/索引? - php我正在遍历别人的代码,他们总是避免转义其数组键。例如:$ row_rsCatalogsItems [名称]代替$ row_rsCatalogsItems ['名称']因此,我不断地对自己接触的所有事物进行微小的更改,以应对这些惰性。但是现在我想知道这样做是否有很多好处。我得到它会在默认为字符串之前检查常量(我在处理常量时会讨厌php中的行为,因为即使未定义,…