如何安全地存储没有哈希的密码?

时间:2017-03-06 15:02:29

标签: authentication hash cryptography passwords

我希望有一种方法来验证用户(引入他的密码),而不会将该密码存储在纯文本中,甚至是哈希密码。

我该怎么做?

拥有一个用户密钥可以加密的控制字符串并将其与我存储的加密字符串进行比较是否安全?

2 个答案:

答案 0 :(得分:1)

Per NIST(国家标准与技术研究院):

使用哈希函数,使用随机盐迭代HMAC大约100毫秒的持续时间并使用哈希值保存salt。使用PBKDF2password_hashBcrypt等功能以及类似功能。重点是让攻击者花费大量时间通过暴力破解密码。

请参阅:How to store your users’ passwords safely

摘自Jim Fenton的演讲“迈向更好的密码要求” 基于NIST SP 800-63-3的信息草案文档“数字认证指南”

  

做:

Require an 8 character min, >64 max with no truncation or 6 random digits  
Use a dictionary to disallow common passwords against a dictionary list of 10M compromised passwords  
Allow all printing characters (Unicode optional) + spaces but MAY canonicalize spaces out  
Best to accept Unicode, including emojis (1 “character”/code point)   
Limit failed authentication attempts to 100 in 30-day period per account  
Offer option to display the secret while typing rather than dots or asterisks  

Storing passwords:  
    Hash with 32-bit random salt using  key derivation function such as  
    PBKDF2 with SHA-1, SHA-2 family, SHA-3 family  
    with at least 10,000 iterations  
  

不要:

Require composition rules  
Allow hints  
Require routine password expiration  
Save plain or hashed versions with or without seeding  

见Jim Fenton的Toward Better Password Requirements

答案 1 :(得分:1)

请参阅Zaph的答案,了解您需要做什么。我会添加更多背景,以防它有用。

事实证明,以加密形式存储密码的安全性低于存储正确完成的密码哈希的安全性。这是因为加密密码被设计为使用正确的密钥未加密,并且加密算法不一定依赖于缓慢作为其抵御暴力攻击的防御之一。

但是设计了一个正确完成的密码哈希算法,以便您无法从哈希中获取密码,并且密码哈希算法设计使用哈希速度(即使其缓慢)作为部分防御试图查找密码通过暴力破解每个可能的密码。