我听说使用“输入”对于密码的使用是不安全的,因为它将输入解释为代码,因此有人可能绕过安全。Python如何破解输入
你会怎么做呢?例如,你会如何做到这一点?
password = 1234
pass_true = input("What is the password?")
if password == pass_true:
print("Access granted.")
else:
print ("Access denied.")
我听说使用“输入”对于密码的使用是不安全的,因为它将输入解释为代码,因此有人可能绕过安全。Python如何破解输入
你会怎么做呢?例如,你会如何做到这一点?
password = 1234
pass_true = input("What is the password?")
if password == pass_true:
print("Access granted.")
else:
print ("Access denied.")
很简单:要通过您的支票,只需在提示符下键入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()
已不存在)。
这个想法并不是保持密码。您必须从输入中创建哈希,并检查它是否与您的密码哈希值相等。但是,如果你只是一个初学者,可以做你所做的事情。
就使用明文密码而言,这是正确的,但它不会扩展到使用input()。 – alexis
所以我是just reading this,如果你使用Python 3.x,你会没事的。否则,如果你使用input(),那么你只需键入password
并完成。
同样,如果您使用的是Python 3.x,请不要担心。
你会用这种方法会遇到的另一个问题是,当你比较这样的两个字符串时,你泄漏了信息并为自己设置了一个旁道攻击。
字符串比较将一次比较两个字符串一个字节,如果其中一个字节不匹配,则返回。但是,这意味着攻击者确切知道他正在测试的密码的哪一部分是正确的,哪一部分不正确。因此,他可以将给定密码的熵减至2,以达到允许的字符集长度的权力。
当比较密码,你应该比较两个字符串按字节就像这样:
result = 0;
for (int i = 0; i < storedUserPass.length; i++) {
result |= storedUserPass[i]^incomingPasswordBytes[i];
}
当它完成,如果结果等于0,所有字节匹配,如果没有,他们不。这是一个恒定的时间计算,它不会泄漏任何信息
您是否知道SQL注入攻击如何工作? – Carcigenicate
在代码中未加密的密码与其他任何内容都不安全。你想要做什么? –
Python 2有'raw_input()',它就像'input()',只是它返回一个字符串并且不会对它进行评估。 – alexis