【JavaEE进阶】-- 加密算法
在数据库中通常存放一些用户的隐私信息,这些隐私信息通常不可以将其明文存放:
1. 代码角度:代码bug漏洞可能会导致数据泄漏。
2. 管理角度:管理员有权限查看数据表的数据,有可能会直接泄漏表数据。
以登陆的场景来进行说明下面三种加密算法:
1. 对称加密
常见的对称加密方式:AES、3DES。
对称加密重要的是要有一个密钥。
加密: 明文 + 密钥 得到一个加密结果。
登录时解密:
- 从数据库中获取到加密结果。
- 加密结果通过密钥解密得到明文。
- 对比用户输入的明文和解密出来的明文。
安全性:
密钥一般是写在代码中、配置项中、启动参数中,都有可能会造成密钥的泄漏。如果我们对称加密的密钥泄漏了被一些别有用心的人拿到,他可能会采用暴力的方式,使用包含所有字符串的表,通过我们的密钥进行加密得到一个结果表,通过结果表和数据库中的数据进行对比,就很容易得到这些隐私数据的明文。

2. HASH加密
常见的HASH加密有:MD5、SHA256。
HASH加密是不可逆的。意思就是通过HASH加密的结果不能解密出来明文。
**加密:**拿到明文通过HASH加密的方式得到一个加密结果,将这个结果存放到数据库中。
登录:
- 根据用户登陆时输入的明文进行HASH处理,生成一个加密结果1。
- 从库中获取加密结果2。
- 对比加密结果1和2。
安全性:
哈希算法是固定的,一个相同的字符串哈希出来的结果都是相同的。
那么使用hash算法生成一张结果表, 和数据库中的密文进行对比也很容易将其破解。

3. 加盐HASH
盐是什么: 对于后端来说,盐就是一个生成的固定长度的随机数。
加密:
- 根据明文进行HASH处理,得到加密结果。
- 生成盐。
- 加密结果和盐进行拼接。
- 将拼接后的加密结果和盐都存放到数据库中。
登录:
- 对用户输入的明文进行HASH,得到加密结果。
- 从库中获取盐。
- 加密结果和盐进行拼接,生成最终加密结果。
- 将最终加密结果和库中的加密结果进行对比。
安全性:
此时使用暴力破解的方式的成本就会变的非常高。
经过HASH得到彩虹表之后,还会有一张盐表,在进行暴力破解的时候,需要用彩虹表中的每一项和盐表中的所有项进行组合。

更加安全的方式:
可以在HASH加盐的基础上,对盐再进行一次哈希,或者将最终的HASH结果再进行一次HASH。
