我希望有一种方法来验证用户(引入他的密码),而不会将该密码存储在纯文本中,甚至是哈希密码。
我该怎么做?
拥有一个用户密钥可以加密的控制字符串并将其与我存储的加密字符串进行比较是否安全?
答案 0 :(得分:1)
Per NIST(国家标准与技术研究院):
使用哈希函数,使用随机盐迭代HMAC大约100毫秒的持续时间并使用哈希值保存salt。使用PBKDF2
,password_hash
,Bcrypt
等功能以及类似功能。重点是让攻击者花费大量时间通过暴力破解密码。
请参阅: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的答案,了解您需要做什么。我会添加更多背景,以防它有用。
事实证明,以加密形式存储密码的安全性低于存储正确完成的密码哈希的安全性。这是因为加密密码被设计为使用正确的密钥未加密,并且加密算法不一定依赖于缓慢作为其抵御暴力攻击的防御之一。
但是设计了一个正确完成的密码哈希算法,以便您无法从哈希中获取密码,并且密码哈希算法设计使用哈希速度(即使其缓慢)作为部分防御试图查找密码通过暴力破解每个可能的密码。