为什么 SHA-256 单独保存密码不合适
文件校验和服务器侧密码存储解决了不同的问题,密码存储还必须让每个离线猜测都变得昂贵.
Hashing不是加密:没有相应的解密操作。 尽管如此,在数据库泄露后,攻击者可以在不通过应用程序的登录率限制的情况下进行散列猜测并将其与被盗记录进行比较。
SHA的速度成了一个缺点
SHA-256 用于完整性检查和许多加密应用程序。其速度对密码存储不可取。添加盐到 SHA256(salt + password) 盐价和计算成本服务于不同的目的。
不要发明证书格式或普通散列的循环。 请使用保存的密码搜索库 。
选择一个专用的密码搜索功能
OWASP 喜欢 Argon2id 用于新系统,在无法使用时,以scrypt作为替代品。 PBKDF2 Bcrypt仍然与遗留系统相关,但有局限性,包括输入长度。
使用库函数来创建和验证、 盐生成和参数存储。 从目标服务器当前指导和测量中选择成本参数 。 考虑同时登录和资源限制: 成本高昂的散列不能使拒绝服务变得微不足道 。 在线费率限制仍然是必要的 。
懂盐和胡椒
一个盐是随机的,对每个记录都是独一无二的;它不需要秘密的。 算法标识符和校验参数也保存起来,经常保存在库内编码的记录中。
胡椒是密码数据库以外的可选密钥。 它能帮助一些违反规定的情况, 但会使旋转和密钥管理复杂化。 它既不取代盐, 也不取代合适的散列功能 。
成功核实后更新记录
在成功登录时, 请先验证旧记录, 如果参数已经过期, 则重新刷新已提交的密码。 您无法从已有的散列中恢复原始密码来迁移整个数据库。 不活跃的账户需要单独的重置或迁移策略 。 Rehashing 并不能消除先前的漏洞 。
在部署前, 测试错误的密码、 遗留的迁移、 长度限制和负载。 永远不要登录测试密码或发送到分析中 。