每个系统或服务器如何获得不同的哈希函数来存储密码

时间:2015-10-04 23:39:50

标签: security encryption hash passwords

据我了解,用户密码必须存储为哈希值而不是加密,因为攻击者无法从其哈希值中推断出密码,而如果他可以访问加密密钥,则可以从加密中推断出密码。 / p>

现在,显然每个系统都必须使用不同的散列函数来散列其键。我的问题是,他们如何创建这些不同的散列函数?他们是否使用标准的散列函数并使用大键来填充它?如果是这样,如果攻击者能够访问此密钥,并且与加密相同,那么攻击者是否能够推断出密码?

2 个答案:

答案 0 :(得分:1)

加密哈希函数总是不可逆的,这是它们的目的。即使气馁的“不安全”功能,如MD5和SHA1也不可逆,它们不需要钥匙。问题是,您可以使用强制执行(10 Giga MD5/sec以上)快速找到可能匹配的密码。

你提到的“大钥匙”可能是盐。您生成一个随机盐并在计算中使用此盐。将这个盐与哈希一起存储是安全的,因为它的目的是防止攻击者构建一个单一的彩虹表并一次查找所有密码的匹配。相反,他必须分别为每一种盐建立一个彩虹表,这使得那些表不可行。

速度问题只能通过哈希函数的迭代来克服。成本因子定义散列计算的次数。推荐的算法是BCrypt,PBKDF2和SCrypt。

答案 1 :(得分:0)

  

现在,显然每个系统都必须使用不同的散列函数来散列其键

不,他们没有。

如果您的密码是s3cr3t,那么它在许多服务器的数据库中将具有相同的哈希值,遗憾的是A4D80EAC9AB26A4A2DA04125BC2C096A

减少这种麻烦的方法是为每个密码生成一个随机代码,称为salt,这样服务器1上的s3cr3t哈希值可能与s3cr3t的哈希值不同在server2上:hashFunction('s3cr3t' + 'perUserSalt')

仅使用bcrypt,scrypt或PBKDF2进行密码存储。