假设我希望在我的代码中存储密码。 SHA256是否足以存储它们?
这是代码的样子:
#!/usr/bin/python3
#The password is 'helloWorld'
import hashlib
hashedString = "11d4ddc357e0822968dbfd226b6e1c2aac018d076a54da4f65e1dc8180684ac3"
for i in range(3):
x = input('Password: ') # For now, ignore the fact that it's exposed.
if hashlib.sha256(x.encode()).hexdigest() == hashedString:
print('Access granted!')
exit()
else:
print('Wrong password.')
print('3 attempts!')
现在,存在这方面的问题,例如可能存在具有相同SHA256哈希的其他字符串 那么有另一种方法来存储它们(没有提供密码长度等明确信息)吗?
答案 0 :(得分:1)
如果可用,我会推荐PBKDF2。检查此link,看看它是否能满足您的需求。
不同之处在于:
并不慢
- 设计的PBKDF2很慢 - SHA256是一个很好的哈希函数;设计密码哈希算法(如PBKDF2,bcrypt和scrypt)用于密码,故意慢。加密哈希算法很快。在大多数情况下,快速是好的,但不是在这里。减慢算法(通常通过迭代)使攻击者的工作更加困难。密码哈希还为每个哈希添加一个salt值,使其唯一,这样攻击者就无法同时攻击多个哈希值。
有关选择PBKDF2的原因的详细信息,请参阅此post。
编辑:PBKDF2还提供填充,因此您不会提供有关密码长度的任何信息。
答案 1 :(得分:1)
实际上,您的问题中包含两个不同的问题。
1)用SHA-256存储密码是否足够安全?
不,通常情况下这不够安全,可以非常快速地计算SHA- *哈希值,因此您可以使用14 Giga SHA-256 per second进行暴力破解。如果您的密码非常强,那么SAH-256的单次迭代就足够安全了。一旦其他人可以确定密码,或者人类应该能够记住它,你绝对应该切换到BCrypt,PBKDF2或SCrypt。
2)碰撞是否有问题?
不,您发现另一个产生相同哈希的密码的可能性极小,实际上可以忽略。关于这种碰撞的可能性还有另一个好的answer。