我听说使用“输入”对于密码使用是不安全的,因为它将输入解释为代码,因此有人可以绕过安全性。
你会怎么做呢?例如,你会怎么做这样的事情?
password = 1234
pass_true = input("What is the password?")
if password == pass_true:
print("Access granted.")
else:
print ("Access denied.")
答案 0 :(得分:4)
这很简单:要通过检查,只需在提示符下输入password
:-)试一试!
What is the password?password
Access granted.
说明:input
读取您键入的内容,将其评估为作为python代码,并将结果分配给pass_true
。所以在上面,我只是告诉它将变量password
(保存真实密码)的值赋给pass_true
。
但是这个代码即使是经常使用也会被破坏:如果你键入任何看起来不像有效python表达式的东西,它就会触发错误。您的示例使用数字作为“密码”,但您无法对任意文本密码使用相同的方法:即使使用正确的密码,它也根本不起作用。
另一种问题是在提示符下键入类似os.remove(".profile")
(或更糟糕,更精细的内容)的内容。它不会登录,但你可以看到它可以造成的伤害。评估用户输入是错误的,除非您正在编写交互式python解释器。
Python 2有raw_input()
只读取输入。 (在python 3中,raw_input()
已重命名为input()
,旧的input()
已消失。
答案 1 :(得分:1)
我们的想法是不要保留密码。您必须从输入中创建哈希并检查它是否等于密码的哈希值。但如果你只是一个初学者,你可以做你做的事。
答案 2 :(得分:0)
所以我是just reading this,如果你使用的是Python 3.x,你会没事的。
否则,如果您使用input(),那么您只需键入password
即可完成。
同样,如果您使用的是Python 3.x,请不要担心。
答案 3 :(得分:0)
提到的侧通道攻击sboutzen是真正的威胁,可以使用linux命令行中的time()加以利用
本文将对其进行详细说明 https://blog.sqreen.com/developer-security-best-practices-protecting-against-timing-attacks/
通过逐字节标识使用的哈希可以破坏哈希。您将拥有真实密码的哈希值,而不是密码本身,但这就是字典攻击有用的原因。
答案 4 :(得分:-1)
这种方法的另一个问题是,当你比较两个这样的字符串时,你会泄漏信息并为自己设置旁道攻击。
字符串比较将一次比较两个字符串,如果其中一个字节不匹配,则返回。但是,这意味着攻击者确切地知道他正在测试的密码的哪个部分是正确的,哪个部分不正确。因此,他可以将给定密码的熵减少到2到允许的字符长度的幂。
比较密码时,你应该按字节顺序比较两个字符串,如下所示:
result = 0;
for (int i = 0; i < storedUserPass.length; i++) {
result |= storedUserPass[i] ^ incomingPasswordBytes[i];
}
完成后,如果result等于0,则所有字节都匹配,如果不匹配,则不匹配。这是一个恒定时间计算,不会泄漏任何信息