密码存储
如果您的应用程序需要用户身份验证,那么它很可能也会涉及密码处理。
处理用户密码是一项极其重要的任务,而以恰当的方式处理它们则更为关键。
很难想象还有什么比应用程序遭到攻击、用户密码在互联网上泄露并被公之于众更糟糕的情况了。光是想到这一点就让人不寒而栗。那么,如何根据最佳实践安全地存储密码呢?让我们来看看几种方法。
加密与哈希
从表面上看,人们可能会认为加密是安全存储密码的理想方案,但完全依赖加密可能会带来一些问题。
加密本质上是一个双向函数,这意味着密码既可以被加密,也可以被解密。这听起来很合乎逻辑,对吧?否则,您如何验证用户的密码是否与数据库中存储的内容匹配呢?
因此,能够解密密码本身就是一个巨大的安全隐患。如果有人入侵了服务器并获取了密码密文,他们很有可能也会获取解密这些密码所需的密钥材料。
相比之下,哈希由于其单向特性,更适合用于密码存储。一旦对数据进行了哈希处理,就无法通过函数直接将密文还原为原始明文。这一特性使得哈希成为保护密码的独特选择。
并非所有哈希都生而平等
一旦决定使用哈希来存储密码,事情并没有简单到只需应用一个哈希函数就万事大吉了。
哈希的种类繁多,考虑到过去十年计算技术的飞速发展,其中大多数并不适合用于存储密码。
如前所述,哈希因其单向函数的特性而无法逆转。虽然从技术上讲确实如此,但哈希也是确定性的,这意味着它们容易受到暴力破解攻击。只要有足够的时间和资源,攻击者就有可能将哈希还原为原始明文。
因此,我们将哈希函数分为两类:
- 加密哈希
- 密码哈希
密码哈希的一个关键特征是它们具有“工作因子”(由单个整数或多个参数表示),该因子定义了计算哈希所需的计算量。
随着多年来 CPU 和 GPU 性能的提升,在消费级硬件上对哈希进行大规模暴力破解变得越来越容易,这意味着哈希的安全性会随着时间的推移而降低。
“工作因子”用于确保哈希的存储方式符合行业趋势。随着硬件性能的提升,您可以增加算法的工作因子,以确保哈希计算需要更多的时间和精力。例如,在当代硬件上将其设定为 100 毫秒。
这意味着在实际应用中,工作因子可能需要每 2-3 年增加一次。
实用安全编码
探索安全编码指南,了解并缓解 OWASP Top 10 等软件漏洞,并通过引导式训练任务在真实的应用程序模拟中进行实践。