在当今数字化时代,密码的安全性至关重要。不正确的密码存储方法可能导致用户数据泄露、账户被盗或系统遭受恶意攻击。因此,采用最佳实践和安全的技术方案来存储密码是至关重要的。
01 存储方式
明文存储
毫无疑问这是最糟糕的密码存储方式,无论你是普通用户,还是密码的管理者,如果是明文存储,是不可取的。尤其是对于密码的管理者,如果还在存储明文密码,那么最好立刻改掉这种做法,否则后果可能极其严重。
首要的就是存在严重安全风险,一旦存储密码的数据库密码泄漏,攻击者就可以直接获取账号密码。这样可能会给企业、个人带来严重的损失嗯3,包括经济、信誉等。
其次合规性风险,许多国家和地区的法律法规,明文存储密码可能违反数据保护和隐私法规;很多场景中也有明确的安全合规性要求,明文存储可能引发法律风险。
简单md5/hash存储
md5或者hash方法是不可逆的,即不能直接直接有加密值解密出原始密码。这种方法的验证逻辑是将用户输入的密码计算出md5值或者hash值,然后与系统存储的加密值是否匹配,匹配则认为密码争取。
这种方法比较简单,而且计算速度很快;但是安全性较低,攻击者一般通过彩虹表等预先计算出来的哈希值进行对比,找出密码。
所谓彩虹表是一种预先计算出的哈希值和对应明文密码的对应表。攻击者可以使用彩虹表来查找与特定哈希值匹配的明文密码,从而绕过直接破解哈希值的过程。
解决这个问题的方法一般是采用加盐(salt)和使用更强大的哈希算法来提高破解难度。
加盐(salt)哈希
加盐是配合其他方法一起使用的,加盐(salt)是指在密码哈希过程中引入一个随机的额外值。这个额外值与密码合并后再进行哈希计算,生成最终的哈希值。
加盐一般有两种,一种是设置一个全局的较长的随机字符串,一般16位以上,另一种是针对每个对象(用户、服务器等)生成不一样的随机字符串作为盐。
第一种方案相对来讲简单一点,不过安全性上远不如第二种。固定的盐值一般都会存在于代码或者配置中,也是比较容易暴露的,因此一般也不推荐。
第二种加盐方式则会大大提高密码的安全性。通过为每个对象生成不同的盐值,即使两个对象使用相同的密码,最终生成的哈希值也会不同。这样可以防止攻击者使用彩虹表等预先计算的哈希值来破解密码。
存储用户密码和盐值的时候最安全的做法是通过将盐值和密码分开存储到不同的数据库,这样即使攻击者获得了存储密码的数据库,仍然无法直接获取用户的密码。
brypt/scrypt
bcrypt和scrypt都是密码哈希函数,用于存储密码时增加安全性。它们通过引入盐值和多次迭代的计算来增加破解密码的难度,提高密码的安全性。
bcrypt是一种基于Blowfish密码算法的哈希函数。它的主要特点是慢速且可调节的哈希计算速度,以及内部集成的盐值和密钥扩展机制。
scrypt是一种基于PBKDF(Password-Based Key Derivation Function)的哈希函数。使得攻击者需要更多的计算资源和时间来破解密码。
02 解密
一般存储密码时通常是通过哈希函数进行加密存储的,而哈希函数是不可逆的,无法直接解密,如第一节中提到的各种哈希加密方法。但是在很多场景下我们还是需要对存储密码进行解密,在这种情况下,密码的双向解密可以通过使用正确的密钥来还原明文密码。
密码存储一般使用对称加密,它使用相同的密钥进行加密和解密。在密码存储中,用户的密码会使用密钥进行加密,并在需要验证用户身份时使用相同的密钥进行解密。这种方法简单且高效,适用于密码存储的场景。
非对称加密也可以用于密码存储,但相对较少使用。非对称加密使用一对密钥,包括公钥和私钥,在密码存储中,用户的密码可以使用公钥进行加密,但解密需要使用私钥。这种方法相对复杂,适用于特定的安全需求,例如在分布式系统中进行密码存储。
需要注意的是,密钥管理非常重要,密钥的安全性直接影响到密码的保密性,因此,密钥的生成、存储和传输都需要采取适当的安全措施。
算法
DES(Data Encryption Standard):DES是一种较早的对称加密算法,使用56位密钥。由于DES的密钥长度较短,已经不再被广泛使用,而被AES所取代。
3DES(Triple Data Encryption Standard):3DES是对DES算法的改进,通过多次应用DES算法来增加安全性。它使用两个或三个56位密钥进行加密。
AES(Advanced Encryption Standard):AES是一种广泛使用的对称加密算法,被认为是目前最安全的对称加密算法之一。它支持不同的密钥长度,包括128位、192位和256位。
RSA:一种非对称加密算法,其中加密密钥是公开的,而解密密钥是保密的。在RSA算法中,通过使用公钥加密的数据只能使用相应的私钥进行解密,而无法通过已知的公钥推导出私钥。这种特性使得RSA算法在保护数据安全和实现数字签名等领域具有广泛应用
03 主流做法
如果正在考虑如何去设计密码的管理,让我们来看看一般密码管理工具都是如何去进行密码存储管理的。如1Password、 keeppass、vault等等,综合这几种密码管理方法,其密码存储原理大致相似。基本都是后端存储加密的密码数据、客户端通过密钥解密,这分离的做法有力提升了密码的安全性。
核心原理基本为:
主密码: 用户设置的主密码是整个系统的核心,这个主密码用于加密和解密用户的密码和敏感数据。
加密密钥: 使用动态密钥生成机制来生成用于加密和解密数据的临时密钥。每次需要加密或解密数据时,生成一个新的临时密钥,或者使用该主密钥生成一个确定的加密密钥,并使用该密钥对数据进行加密或解密操作。
加密存储:用户的密码和敏感数据在存储之前,会使用加密密钥进行加密。这样,即使数据被盗或泄露,未经授权的人也无法直接访问和解密其中的数据。
04 总结
如果本文主要结束讲述密码后端存储的一般方法和比较,并概括了主流密码管理工具的一般做法,希望对你有所帮助。
写在最后,运维是一个长期坚持的过程,有讨论、有互动、有互相学习才能进步,建了一个运维群,想要跟志同道合的人一起加油,加我拉你进来。