Spring Security 登录注册时使用 Bcrypt 加盐进行加密。
对于加密来说,MD5 和 SHA 都比较流行。所谓加盐,无非是生成一个随机的 salt 在数据存储时提高数据的安全性,防止不法分子盗取用户个人信息。虽然 MD5 进行加密是不可逆的,但还是有弊端的。
举个简单的例子来说:如果数据库当中不同用户存储了相同的密码值,那么当知道其中一个用户的密码后就可以窥探出相同密码的用户,这样是很不安全的,因此我们都会选择对数据进行盐值加密存储。
相关概念
- 哈希算法
- 获取一个任何长度的字符串并采用一致的方式创建一个哈希值:一种固定长度的字符串表示。每次传入同一个原始字符串,您都会收到相同的哈希值。这是一个单向过程,您无法从中获得原始字符串。
- 盐值
- 在原始的密码后面添加自定义的尽量随机的长字串,然后进行哈希,这个长字串就是盐值(Salt)。
- 有时候,为了减轻开发压力,程序员会统一使用一个salt值(固定盐值,储存在某个地方),而不是每个用户都生成私有的 salt 值。
- 盐值越复杂、越随机,密码被破解的几率就越小。
Bcrypt加密原理:
- 加密时,对于同一个密码,每次生成的 hash 是不同的,但是 hash 中包含了salt(hash产生过程:先随机生成salt,salt跟password进行hash)。
- 校验时,从 hash 中取出 salt,salt 跟 password 进行 hash,得到的结果跟数据库中提取的的 hash 进行比对返回 Boolean 类型:true/false。
Bcrypt与MD5进行对比:
- 首先 MD5 加密后存储为 32 位,Bcrypt为 60 位。
- 相对来说 BCrypt 比 MD5 更安全,但是加密更慢。(简单 MD5 加密后密码一样,数据库当中不同用户存储了相同的密码值,那么当知道其中一个用户的密码后就可以窥探出相同密码的用户,BCrypt 加密每次生成的密文是不一样的。如:
$10$dH/eH7tuzPCkaFSfm44QXePkTxbfuhguLwC.hPmZ2Sp81bcdWbL1W
即使得到了原文密码,破译其他用户密码的机率是很小的)。 - Bcrypt 加密有利也有弊,优点是安全性较高,弊端就是如果存储量比较大,性能消耗也是非常大的。