Python如何破解输入

时间:2015-11-26 20:41:04

标签: python python-2.7 security

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

你会怎么做呢?例如,你会怎么做这样的事情?

password = 1234

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

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

5 个答案:

答案 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,则所有字节都匹配,如果不匹配,则不匹配。这是一个恒定时间计算,不会泄漏任何信息