python - 我将如何摆脱或显着减少密码检查器中的时间差异?
问题描述
我的老师给了我们一段代码,他希望我们修改它,以便 a) 消除(固定)或 b) 显着减少代码(密码检查器)的执行时间。
编辑:我们刚刚学会了计算字符串中的字符数。所以我认为他想要的是如果有人输入“1941abab”,程序检查它是否正确需要更长的时间,因为前5个字符与正确答案相同。他希望检查的延迟更慢。
s1 = input("Enter Passcode:")
if s1 == "1941abcd":
print("welcome")
else:
print("denied")
解决方案
比较字符串的基本方法是一次比较一对字符:比较第一个字符串的第一个字符和第二个字符串的第一个字符,然后是第二个字符,然后是第三个字符,以此类推。一旦找到不匹配的一对,您无需检查字符串的其余部分就知道字符串不相等。如果所有对都相等,则字符串相等。作为一项额外的优化,您可以从比较字符串的长度开始 - 如果它们的长度不同,则它们不相等,您甚至不需要比较字符。
这可能是什么==
,安全问题是速度优化,一旦找到不匹配的对,它就会停止比较。攻击者可以尝试密码axxx
、bxxx
、cxxx
等,一旦他们尝试1xxx
,他们会注意到比较需要更多时间,因为==
现在将检查第二个字符对,因为第一个字符对匹配。现在他们知道密码的第一个字符是1
. 解决方案:总是比较所有字符对,即使您确定字符串不相等(并且不要比较字符串的长度;始终进行与提供的密码中的字符一样多的字符比较 - 简而言之,尽量不要透露有关实际密码的任何信息)。
推荐阅读
- jquery - 在 android chrome mobile 中选择之前,Select2 输入关闭
- metatrader5 - 策略测试器 - 在达到规定值之前触发止损
- javascript - 使用 Vue 过滤表列
- javascript - TypeError:无法在 ReactJS 中读取 null 的属性“addEventListener”
- c# - XUnit 测试错误:无法将 system.collections.generic.list <"filename.class"> 转换为字符串
- vim - ' 之间有什么区别
' 和 'P' 映射时? - python - 在 sklearn 的 DecisionTreeClassifier 中访问非最优拆分
- r - 如何将数据框(或矩阵)中的列与另一个数据框的列一一相乘并对结果求和?
- android - Unity – 让应用程序出现在 iOS 上的“打开方式”下,用于特定文件类型
- next.js - nextjs + react-native-web + styled-components :warnOnce