SHA256是否足以存储密码? (在py3中)

时间:2016-03-23 11:35:04

标签: python-3.x passwords sha256

假设我希望在我的代码中存储密码。 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哈希的其他字符串 那么有另一种方法来存储它们(没有提供密码长度等明确信息)吗?

2 个答案:

答案 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