密文形式保存密码
绝大部分系统都会有用户注册和登录功能,其中密码是非常重要且敏感的信息。这种信息如果以明文形式存储在数据库中时非常不安全的。因此以密文形式存储是任何系统都应该做的最基本的安全措施。
什么是加密
数据加密 的基本过程,就是对原来为 明文 的文件或数据按 某种算法 进行处理,使其成为 不可读 的一段代码,通常称为 “密文”。通过这样的途径,来达到 保护数据 不被 非法人窃取、阅读的目的。
什么是解密
加密 的 逆过程 为 解密,即将该 编码信息 转化为其 原来数据 的过程。
常见的加密算法
哈希算法
哈希算法(Hash Algorithms)也称为散列算法、杂凑算法或数字指纹,是可以将任意长度的消息压缩为一个固定长度的消息的算法。
哈希算法是区块链技术体系的重要组成部分,也是现代密码学领域的重要分支,在身份认证、数字签名等诸多领域有着广泛的应用。
哈希算法可以在极短的时间内,将任意长度的二进制字符串映射为固定长度的二进制字符串,输出值称为哈希值(Hash Value)或者数字摘要(Digital Digest)。
密码学哈希算法的主要特性就是单向性,即在算法上,只能从输入值计算得到输出值,而从输出值计算得到输入值是不可行的。
常用的哈希算法包括MD系列算法和SHA系列算法,其中MD系列算法有MD2、MD4、MD5、RIPEMD算法等,SHA系列算法有SHA1、SHA224、SHA256、SHA384和SHA512等算法。
在哈希算法中,MD5算法和SHA1算法是应用最广泛的,两者的原理相差不大,但MD5算法加密后的输出值的长度为128比特,SHA1算法加密后的输出值的长度为160比特。但是二者现在已被破解,安全性大大的降低。目前SHA256是比较常见的算法,至少目前仍是较为安全的一种算法。
对称加密算法
对称加密算法 是应用较早的加密算法,又称为 共享密钥加密算法。在 对称加密算法 中,使用的密钥只有一个,发送 和 接收 双方都使用这个密钥对数据进行 加密 和 解密。这就要求加密和解密方事先都必须知道加密的密钥。
- 数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文 进行发送。
- 数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥 及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成 可读明文。
AES、DES、3DES 都是 对称 的 块加密算法,加解密 的过程是 可逆的。常用的有 AES128、AES192、AES256。
非对称加密算法
非对称加密算法,又称为 公开密钥加密算法。它需要两个密钥,一个称为 公开密钥 (public key),即 公钥,另一个称为 私有密钥 (private key),即 私钥。
因为 加密 和 解密 使用的是两个不同的密钥,所以这种算法称为 非对称加密算法。
1.如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密。
2. 如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密。
RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准。
ECC 也是一种 非对称加密算法,主要优势是在某些情况下,它比其他的方法使用 更小的密钥,比如 RSA 加密算法,提供 相当的或更高等级 的安全级别。不过一个缺点是 加密和解密操作 的实现比其他机制 时间长 (相比 RSA 算法,该算法对 CPU 消耗严重)。
在Spring Boot中使用Hash加密算法
引入Apache提供的Hash加密算法工具包:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
使用工具类进行加密:
String password = "lovo";
// MD5加密
DigestUtils.md5Hex(password)
// SHA256加密
DigestUtils.sha256Hex(password)