利用数据库查表瓶颈,对抗密码破解

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

hashcat怎么提高效率hashcat怎么提高效率

key = hash(user, password)

引言:当网站遭受拖库攻击后,一些使用弱口令的哈希值很容易被破解还原。本文将介绍一种新的存储方式,使攻击者更难进行哈希破解攻击。

传统存储方式:大多数系统通常将用户名和密码存储为一对一的关系。这种方式方便实现,同时通过哈希算法对密码进行加密也相对安全。然而,尽管密码不是明文存储,但用户名和密码之间的对应关系是明确的。攻击者可以针对某个有价值的用户,单独对其哈希值进行暴力破解攻击。那么是否有一种方案既能实现用户名和密码的认证,又不透露它们之间的对应关系呢?

合并存储方式:为了不透露对应关系,我们需要一个单独的表来存储用户名和密码的哈希值。这个表只需要一个字段,即存储二元组的哈希值。这样,每个哈希值对应唯一的密钥,而通过密钥既无法得知用户名,也无法得知密码。其他与密码无关的信息则存储在资料表中。

认证步骤:用户注册时,后端首先通过资料表查询用户名是否已注册,以确保用户名的唯一性。然后将用户名和密码的哈希值(即密钥)添加到密钥集合表中,其他信息则写入资料表。登录时,服务器根据提交的用户名和密码,使用相同的算法计算密钥,并检索是否存在于密钥集合表中。如果存在,则认证成功;否则,认证失败。认证成功后,可以根据用户名访问资料表中相应的记录,进行具体的业务操作。修改密码和注销用户也很简单,只需删除旧密钥,添加新密钥即可。这样,在与认证相关的数据中,不会出现任何有意义的信息,甚至连用户名都没有。

常见问题解答:

Q:将所有账号的认证信息混在一起,会相互干扰吗?比如用户A和用户C使用相同的密码,会不会有影响?
A:不会有影响。因为密钥不仅代表密码,还包含了用户名。只有当用户名和密码同时匹配时,才能找到对应的密钥。只要有一项不匹配,就无法找到对应的密钥。

Q:密钥之间会存在冲突吗?
A:尽管用户名是唯一的,但密钥结合了密码因素,因此无法保证所有密钥绝对唯一,理论上仍有冲突的可能。不过,只要密钥足够长,冲突的几率就可以忽略不计。例如选择32字节的密钥,即使网站有10亿用户,冲突的几率仍然非常小。

Q:账号A和账号B的密钥会不会一样?
A:当然不会。二元组的哈希值显然不能先合并再计算,而必须先单独计算,然后再合并。实际上,我们可以使用HMAC函数来同时哈希两个参数,这样更方便且更可靠。

Q:虽然密钥集合表的数据是无意义的,但其他表仍会泄露用户名等信息,这样还有意义吗?
A:我们的目的并不是防止用户名等信息的泄露,而是抹掉用户名和密码之间的关联,增加破解的难度。即使攻击者知道某个用户名,也无法找到对应的密钥,因为计算密钥需要用户名和密码。

Q:如果有人忘记了密码,那么这个用户的密钥是不是永远不知道了?
A:确实如此。没有密码就无法计算出密钥。不过,仍然可以实现重置密码的功能,只需通过其他手段证明帐号的拥有权,然后设置新密码即可。

优势:使用该方案后,即使密钥集合表泄露,用户名和密码也不会暴露。攻击者必须设法获取其他表的数据或从网站上爬取数据,才能获得实际的用户名。即使知道某个用户名,也无法找到对应的密钥,因为计算密钥需要用户名和密码。这种方案将敏感信息独立存储,并且不再显式透露用户名和密码的关系。

提升成本:作为防守方,可以人为增加查表的门槛。可以向密钥集合表中填充大量无用数据,故意将表撑大。攻击者无法区分哪些是真实的数据,哪些是无用的数据,只能对它们进行索引等处理,从而增加破解所需的资源。如果攻击者直接使用现成的数据库进行查表,效率显然会很低,密码破解速度将受限于数据库查询速度。对于跑字典攻击来说,数据库查询速度通常是不够快的。这种方案可以有效提高破解的成本。

记录填充:对于无用的填充数据,我们不是完全随机生成,而是通过一定的规律生成。例如,可以基于一个口令进行推导。这样,管理员只需提供一个值,就可以生成大量无用记录。由于攻击者无法区分规律,因此无法进行区分。

加盐:前面为了简单描述,我们省略了和盐相关的内容,现在将其补充进来。由于盐需要与用户名关联,无法存储在密钥集合表中,只能存放在其他表中,例如资料表。用户注册时,生成一个随机串作为盐,并保存。然后使用三元组的哈希值作为密钥。登录时,先根据用户名查询相应的盐,然后使用相同的方式计算密钥。这样,盐就融入到密钥中。加盐是必要的,因为用户名和密码通常具有一定的规律,如果不加盐,密钥无法抵御彩虹表攻击。

忘记密码:该方案唯一的缺陷在于密码重置。由于用户名和密码不再有关联,一旦用户忘记密码,想要重置密码就变得非常困难,因为不知道密码就无法知道对应的密钥。然而,解决方案仍然存在。首先,可以通过其他手段证明帐号的拥有权,例如短信、邮箱等。通过认证后,用户可以设置新密码,系统会生成新的密钥并添加到密钥集合表中,旧密钥仍然保留。然而,如果旧密码以后想起来了,仍然可以登录。为了解决这个问题,只需在重置密码时同时重置盐,这样用新盐计算的新密钥和旧密钥完全不相关。同时,旧盐一旦被覆盖,就永远消失了,没有任何人知道。因此,残留的旧密钥不会泄露曾经使用过的密码。

总结:与传统存储方案相比,该方案将敏感信息独立存储,并且不再显式透露用户名和密码的关系。尽管从算法上看,该方案并没有提升暴力破解的难度,但从工程化角度来看,增加了暴力破解的复杂度。只要攻击者对超大数据的查询算法实现不够好,跑字典的速度就难以提升,从而成为密码破解的瓶颈。如果您喜欢这篇文章,请转发给更多有需要的人,我们可以一起探讨其中的技术问题。

赞(0)