当我发现一些名为'crypt'的东西时,我正在查看python模块。我不明白。我试过阅读这个,这个“盐”是什么,这个crypt模块的用途是什么,是否有某种方法可以将'crypt'应用于这段python代码?:
import crypt
max_attempts = 3
attempt = 0
try:
while attempt < max_attempts:
uname = input('Username: ')
password = input('pass: ')
if uname == 'admin' and password == 'Khs9':
print('Welcome Admin')
break
else:
attempt += 1
if attempt == max_attempts:
raise RuntimeError("\nYou've reached the maximum number of attempts allowed.")
else:
print('Wrong credentials.\n Try again or press <ctrl+c> to exit.\n')
continue
except KeyboardInterrupt:
print('Terminated by the user.\nGood-bye.')
except RuntimeError as e:
print("Goodbye")
答案 0 :(得分:3)
现在我已经看到你的代码,我知道密码是'Khs9',我可以登录你的盒子。
您可以私下运行以下内容。
>>> crypt.crypt('Khs9', 'aa')
'aa0GPiClW35DQ
现在您更新代码:
import crypt
max_attempts = 3
attempt = 0
stored_pw_hash = 'aa0GPiClW35DQ'
try:
while attempt < max_attempts:
uname = input('Username: ')
entered_pw_hash = crypt.crypt(input('pass: '), stored_pw_hash)
if uname == 'admin' and entered_pw_hash == stored_pw_hash:
print('Welcome Admin')
break
else:
attempt += 1
if attempt == max_attempts:
raise RuntimeError("\nYou've reached the maximum number of attempts allowed.")
else:
print('Wrong credentials.\n Try again or press <ctrl+c> to exit.\n')
continue
except KeyboardInterrupt:
print('Terminated by the user.\nGood-bye.')
except RuntimeError as e:
print("Goodbye")
现在,如果您的代码泄露,他们就无法立即访问。您应该有足够的时间意识到自己被黑了,然后更改密码。
这是背景信息......
crypt.crypt(密码)将返回密码的哈希值。您存储哈希而不是明文密码。这样,您就不会丢失密码给黑客,因为您没有密码。丢失哈希不是一个大问题,因为它不保证访问(如果你遵循最佳实践,包括使用盐)。
下次有人提供密码时,你会计算它的哈希值,将它与你之前存储的哈希值进行比较,如果匹配,你就知道他们给了你正确的密码。
为什么需要使用盐? 因为有人花了很长时间来生成一个包含常用密码和哈希值的表。完成后,可以快速检查哈希值。通过使用salt,您可以确保应用不同的查找表,其中一个可能不可用,而普通黑客没有时间生成它。
crypt.crypt()需要两个字符作为salt使用。您可以将它传递给两个字符串或使用该函数的上一个输出。 (crypt.crypt()返回一个字符串,前两个字符为salt,其余为哈希值)
答案 1 :(得分:0)
首先,请阅读Thomas Pornin's canonical answer to How to securely hash passwords。这将回答您关于“盐”的问题。是
其次,地穴是一种古老而古老的算法 - 不要使用它。即使是基于Python SHA-512的crypt也可能无法使用,因为您无法控制迭代次数(BCrypt可能称之为工作因素),因此您无法通过增加迭代来使其更安全计数。
第三,Python as of 3.4 has fast PBKDF2 based on OpenSSL built in。
Python 2.7.8也是如此。
这两个都支持hashlib内置的合理哈希类型!请改用它们!如何使用这些的一个例子是:
systemIp 192.168.1.1
status done
systemIp 192.153.1.1
status done
其中
args.iterations低至数十万至数万
args.outputBytes不超过64,假设使用SHA-512(其他算法较少),且不低于20.
以明文形式存储存储中的迭代次数(无论是硬编码,文件还是数据库),以便以后轻松将其设置得更大。
要获取salt,您应该生成至少12个,最好是至少16个加密随机字节。为每个用户名添加不同的盐,并将其以明文形式存储在存储中(无论是硬编码,文件还是数据库)。
使用PBKDF2-HMAC-SHA-512使用64位操作,这可以降低基于GPU的攻击者对您的优势。
如果您担心时间攻击,可以使用各种常数时间比较中的一种。与高迭代次数PBKDF2-HMAC-SHA-512相比,没有任何成本的是:
import hashlib
BinaryOutput = hashlib.pbkdf2_hmac('sha512',password, salt, args.iterations, args.outputBytes)