首页 > 解决方案 > 我将如何摆脱或显着减少密码检查器中的时间差异?

问题描述

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

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

s1 = input("Enter Passcode:")
if s1 == "1941abcd":
    print("welcome")
else:
    print("denied")

标签: pythonstring-comparison

解决方案


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

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


推荐阅读