我的老师给了我们一段代码,他希望我们改变它,以便代码(密码检查器)的执行时间是a)消除(固定)或b)显着减少。
编辑:我们刚学会计算字符串中的字符数。所以我认为他想要的是如果有人输入“1941abab”,程序检查它是否正确需要更长时间,因为前5个字符与正确答案相同。他希望延迟检查更慢。
s1 = input("Enter Passcode:")
if s1 == "1941abcd":
print("welcome")
else:
print("denied")
比较字符串的基本方法是一次比较一对字符:比较第一个字符串的第一个字符和第二个字符串的第一个字符,然后是第二个字符,然后是第三个字符,依此类推。一旦找到一对不匹配的对,你知道不检查字符串的其余部分,字符串不相等。如果所有对都相等,则字符串相等。作为一个额外的优化,你可以通过比较字符串的长度开始 - 如果它们的长度不同,它们就不相等,你甚至不需要比较字符。
这可能是==
所做的,安全问题是速度优化,一旦发现一对不匹配就停止比较。攻击者可以尝试密码axxx
,bxxx
,cxxx
等,一旦他们尝试1xxx
,他们会注意到比较需要更多时间,因为==
现在也会检查第二个字符对,因为第一个字符对匹配。现在他们知道密码的第一个字符是1
。解决方案:即使在确定字符串不相等(并且不比较字符串的长度;总是进行与提供的密码中的字符一样多的字符比较)之后,总是比较所有字符对 - 简而言之,尽量不要泄露任何有关实际密码的信息。