如何摆脱或显着减少密码检查器的时间差异?

问题描述 投票:-2回答:1

我的老师给了我们一段代码,他希望我们改变它,以便代码(密码检查器)的执行时间是a)消除(固定)或b)显着减少。

编辑:我们刚学会计算字符串中的字符数。所以我认为他想要的是如果有人输入“1941abab”,程序检查它是否正确需要更长时间,因为前5个字符与正确答案相同。他希望延迟检查更慢。

s1 = input("Enter Passcode:")
if s1 == "1941abcd":
    print("welcome")
else:
    print("denied")
python string-comparison
1个回答
1
投票

比较字符串的基本方法是一次比较一对字符:比较第一个字符串的第一个字符和第二个字符串的第一个字符,然后是第二个字符,然后是第三个字符,依此类推。一旦找到一对不匹配的对,你知道不检查字符串的其余部分,字符串不相等。如果所有对都相等,则字符串相等。作为一个额外的优化,你可以通过比较字符串的长度开始 - 如果它们的长度不同,它们就不相等,你甚至不需要比较字符。

这可能是==所做的,安全问题是速度优化,一旦发现一对不匹配就停止比较。攻击者可以尝试密码axxxbxxxcxxx等,一旦他们尝试1xxx,他们会注意到比较需要更多时间,因为==现在也会检查第二个字符对,因为第一个字符对匹配。现在他们知道密码的第一个字符是1。解决方案:即使在确定字符串不相等(并且不比较字符串的长度;总是进行与提供的密码中的字符一样多的字符比较)之后,总是比较所有字符对 - 简而言之,尽量不要泄露任何有关实际密码的信息。

© www.soinside.com 2019 - 2024. All rights reserved.