从我还是个青少年(那是 20 年前)到现在,你会看到专业人士窃取超级计算机并使用它使用暴力破解密码或家庭安全系统的电影(我假设)。然而,他们总是通过向他们展示尝试破解由许多数字/字符组成的密码或密码来进行演示,并且超级计算机会一一破解这些字段
左边的绿色数字已经破解,右边的数字尚未出现。超级计算机试图找出第一个数字,然后是第二个数字,依此类推,你会看到数字一直在波动,直到它锁定在正确的数字上。
这样的攻击是否存在?
从我还是个青少年(那是 20 年前)到现在,你会看到专业人士窃取超级计算机并使用它使用暴力破解密码或家庭安全系统的电影(我假设)。然而,他们总是通过向他们展示尝试破解由许多数字/字符组成的密码或密码来进行演示,并且超级计算机会一一破解这些字段
左边的绿色数字已经破解,右边的数字尚未出现。超级计算机试图找出第一个数字,然后是第二个数字,依此类推,你会看到数字一直在波动,直到它锁定在正确的数字上。
这样的攻击是否存在?
你在电影中看到的是一种加剧紧张局势的情节装置,每次确定一个角色时都会给观众一脚。现实有点不同。
蛮力攻击确实存在,但要么全有,要么全无——你要么得到整个密码是对的,要么是错的。没有办法知道你是否猜对了一个正确的字符。密码通常是散列的,更改单个数字将返回完全不同的加密结果。除了一个字符之外,您可以得到所有正确的字符,并且没有任何迹象表明您接近了。
所以从电影的角度来看,真正的密码破解可能有点无聊,你需要展示进度以保持观众的兴趣。他们可以做的是显示一个进度条,用于计算哈希的所有可能排列,但它没有可预测的结束时间——你可能很幸运并立即击中它,或者在你的蛮力结束时得到它力范围。不一定适合一部电影,但一个好的导演可以把它拍下来。
SQL 盲注就是这样一个例子。假设您有可能进行 SQL 注入,但您可以注入的内容受到限制。内容如下:
SELECT id FROM users WHERE username = <foo>;
您可以注入,foo
但除了返回 404 的页面(如果没有这样的用户)或其他内容(如果有结果)之外,您无法获得其他输出。除了页面状态(“有效/无效”)之外,您无法从此查询中获得任何输出。
在这种情况下,您可以尝试通过以下方式猜测有关用户的一些数据(例如他的哈希密码或他的信用卡号):
SELECT id FROM users WHERE username = "kos" AND secret = "mellon";
SELECT id FROM users WHERE username = "kos" AND secret = "rosebud";
一旦你得到一个加载的页面,你就知道你猜对了密码。
现在是有趣的部分:要在合理的时间内猜测,您可以切换到二进制字典搜索:
SELECT id FROM users WHERE username = "kos" AND secret >= "a" AND secret <= "z" -- 1
SELECT id FROM users WHERE username = "kos" AND secret >= "a" AND secret <= "n" -- 0
SELECT id FROM users WHERE username = "kos" AND secret >= "o" AND secret <= "u" -- 0
SELECT id FROM users WHERE username = "kos" AND secret >= "v" AND secret <= "x" -- 1
SELECT id FROM users WHERE username = "kos" AND secret >= "w" AND secret <= "x" -- 1
SELECT id FROM users WHERE username = "kos" AND secret >= "x" AND secret <= "x" -- 1
你有第一个字母!继续:
SELECT id FROM users WHERE username = "kos" AND secret >= "xa" AND secret <= "xz" -- 1
SELECT id FROM users WHERE username = "kos" AND secret >= "xa" AND secret <= "xn" -- 1
SELECT id FROM users WHERE username = "kos" AND secret >= "xa" AND secret <= "xg" -- 0
SELECT id FROM users WHERE username = "kos" AND secret >= "xh" AND secret <= "xk" -- 1
SELECT id FROM users WHERE username = "kos" AND secret >= "xj" AND secret <= "xk" -- 1
SELECT id FROM users WHERE username = "kos" AND secret >= "xk" AND secret <= "xk" -- 1
...等等,直到你知道所有的字母。
Windows LM 哈希具有这种机制,其中密码被分成 7 个字符串并分别进行哈希处理。在这种情况下,密码显示为两半。但是 LM 哈希以 Windows XP 结束。
扩展相同的机制,只是为了理论上,如果密码的每个字符都被单独散列并且最终散列是各个散列的串联,那么可能会有类似于你在电影中看到的密码被揭示字符的场景特点。但这离实用性太远了。
是的,如果您使用例如时间攻击是可能的。如果密码没有经过哈希处理并与易受攻击的字符串比较,您可以衡量您是否一一输入了正确的字符。在大多数语言中,字符串比较会在发现差异或字符串长度不同时停止。这通常是一件好事,因为它会带来更好的速度。如果你想在没有时间攻击的可能性的情况下这样做,你通常会比较直到字符串的末尾,并且只有在遇到差异时才设置一个布尔值,然后在最后返回。此外,您必须小心优化程序,以免更改为快捷方式版本。
还有一个padding oracle attack,您可以通过比较服务器的不同响应来猜测密钥的每个字节,例如“无效密钥”和“无效消息”。