hasher.verify(stored_hash, provided_password) return True except (argon2.exceptions.VerifyMismatchError, argon2.exceptions.InvalidHashError): return False ``` 场景三:密码重置与更新 *密码重置:不应通过邮件发送原密码或新密码明文。应生成一个有时效性、高熵的随机令牌(另一随机字符串),将令牌的哈希值存入数据库并发送带令牌的链接给用户。用户点击链接后,进入一个允许设置新密码的页面,流程同场景一。 *密码更新:需要用户提供旧密码,验证通过后(场景二),再对新密码执行存储流程(场景一)。 场景四:遗留系统迁移 对于已使用弱哈希(如MD5)或明文存储的旧系统,迁移策略应是渐进而非一刀切。 1. 在用户登录时,先用旧方法验证密码。 2. 验证通过后,立即用新的强KDF(如Argon2)对本次输入的密码计算新哈希,替换掉数据库中旧的弱哈希值。 3. 此后,该用户的验证即切换到新方法。最终所有活跃用户的密码存储都会逐步升级。 五、 超越存储:全链路密码安全考量完善的密码安全远不止于数据库存储。 1. 传输层加密(HTTPS) 必须全程使用HTTPS(TLS/SSL)。否则,前端到后端的密码传输过程就是明文,中间人攻击可轻易截获。确保服务器配置强加密套件,禁用老旧协议(如SSLv3)。 2. 前端处理与交互 *避免前端哈希:有些方案提议在前端用JavaScript哈希密码后再传输。这通常不是好主意,因为它使得前端哈希输出成为事实上的“密码”,如果传输层不安全,攻击者截获此哈希值可直接用于身份验证(称为“通行证攻击”)。应在安全传输通道下传输原始密码(或经过客户端加密的密码),由后端进行完整的KDF哈希。 *密码强度策略:注册和修改时,强制要求密码最小长度(如12位)、包含字符种类,并接入密码泄露检查API(如Have I Been Pwned),拒绝使用已知泄露的密码。 3. 密钥管理 如果系统中存在必须使用的对称加密密钥(如用于加密其他敏感数据),必须与密码哈希分开,进行严格的密钥管理: *使用硬件安全模块(HSM)或云服务商提供的密钥管理服务(KMS)。 *绝对禁止将密钥硬编码在源代码或配置文件中。 *遵循最小权限原则,动态地从安全存储中获取密钥。 4. 日志与监控 确保应用程序和系统日志绝不记录明文密码或密码哈希。监控数据库的异常访问模式、大量的登录失败尝试,这些可能是撞库攻击或暴力破解的前兆。 六、 总结对软件密码进行加密,绝非简单地调用一个加密函数,而是一个贯穿设计、开发、部署与运维全生命周期的系统性工程。其核心路径是:使用当前公认最强的密钥派生函数(如Argon2),为每个密码添加随机盐值,并合理配置计算与内存成本参数。同时,必须将密码安全置于全链路中审视,保障传输安全、规范前端交互、严格管理其他密钥,并辅以有效的监控。 在数据即资产的时代,投资于稳健的密码安全实践,就是投资于用户信任与企业生存的基石。攻击技术日新月异,今天的最佳实践可能明天就需要调整。因此,保持对密码学进展和安全威胁动态的关注,定期审查和更新系统的密码处理机制,是每个技术团队永续的责任。 |
| ·上一条:软件安装路径压碎与加密:构筑数据防泄漏的底层防线 | ·下一条:软件应用加密锁:筑牢数据防线的核心物理密钥 |