2015-11-26 39 views
2

我听说使用“输入”对于密码的使用是不安全的,因为它将输入解释为代码,因此有人可能绕过安全。Python如何破解输入

你会怎么做呢?例如,你会如何做到这一点?

password = 1234 

pass_true = input("What is the password?") 

if password == pass_true: 
    print("Access granted.") 
else: 
    print ("Access denied.") 
+0

您是否知道SQL注入攻击如何工作? – Carcigenicate

+0

在代码中未加密的密码与其他任何内容都不安全。你想要做什么? –

+1

Python 2有'raw_input()',它就像'input()',只是它返回一个字符串并且不会对它进行评估。 – alexis

回答

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()已不存在)。

+0

甚至“1234”? :D – julienc

+0

要输入'1234',你必须知道密码。要输入'password',你必须看到代码,而不是当前的密码。 – alexis

+0

当然,但你知道... http://blogs.wsj.com/digits/2015/01/20/123456-again-the-most-popular-passwords-arent-changing/我的评论更多的是一个俏皮话而不是真正的答案。 – julienc

1

这个想法并不是保持密码。您必须从输入中创建哈希,并检查它是否与您的密码哈希值相等。但是,如果你只是一个初学者,可以做你所做的事情。

+0

就使用明文密码而言,这是正确的,但它不会扩展到使用input()。 – alexis

0

所以我是just reading this,如果你使用Python 3.x,你会没事的。否则,如果你使用input(),那么你只需键入password并完成。

同样,如果您使用的是Python 3.x,请不要担心。

-1

你会用这种方法会遇到的另一个问题是,当你比较这样的两个字符串时,你泄漏了信息并为自己设置了一个旁道攻击。

字符串比较将一次比较两个字符串一个字节,如果其中一个字节不匹配,则返回。但是,这意味着攻击者确切知道他正在测试的密码的哪一部分是正确的,哪一部分不正确。因此,他可以将给定密码的熵减至2,以达到允许的字符集长度的权力。

当比较密码,你应该比较两个字符串按字节就像这样:

result = 0; 
for (int i = 0; i < storedUserPass.length; i++) { 
    result |= storedUserPass[i]^incomingPasswordBytes[i]; 
} 

当它完成,如果结果等于0,所有字节匹配,如果没有,他们不。这是一个恒定的时间计算,它不会泄漏任何信息

+0

是什么让你认为“攻击者知道密码的哪个部分是正确的”?运行OP的代码不会泄露任何此类信息,除非您在调试器中运行它 - 在这种情况下,您也可以完全绕过验证。 – alexis

+0

下面是一个例子:http://verboselogging.com/2012/08/20/a-timing-attack-in-action – sboutzen

+0

好吧,这很有趣,你应该把它添加到答案。但“完全”夸大其词。如果密码被散列,问题也会消失。 – alexis