账号密码登陆
账号登陆
因数据库极易遭受网络攻击,所以不能在数据库中直接存储明文存储。
哈希(Hashing):哈希是单向的,即不可能解密Hash值来获取原始值。
加密(Encryption):加密是双向的,即通过密文解密后可以获取原始值。
为了防止使用密码表或词典进行暴力破解,需要在哈希之前添加盐(Salting)或胡椒(Peppering)再进行哈希。
$$
result = hash(pepper + password + salt)
$$
加盐和胡椒的区别:
- 所有密码共享
pepper
,不像盐一样对每个密码都是唯一的。这使得pepper
可预测,并可尝试破解密码。pepper
的静态特性也“减弱了”哈希抗冲突的能力,而salt
则使用独一无二的字符串来扩展长度,提高了哈希抗冲突能力,增加了对哈希函数的输入熵。 pepper
不存储在数据库中,不像salt
一样(但salt
也并非总是如此)。pepper
并不是使密码破解变得过于困难使攻击变得不可行,这是其它许多密码存储保护措施(如salt
)的目标。salt
可防止攻击者制作已知密码的彩虹表,但是pepper
没有这样的作用。
Bcrypt加密
Bcrypt 是一种基于 Blowfish 密码学算法的密码散列函数。
- 盐(Salt): bcrypt 在散列过程中使用盐来确保即使相同的密码也会产生不同的散列值,这增加了密码存储的安全性。
- 工作因子(Work Factor): bcrypt 允许设置一个工作因子,这个因子决定了散列计算的难度。随着计算能力的提升,可以增加工作因子来保持密码散列的安全性。
- 适应性: bcrypt 可以适应硬件性能的提升,通过增加工作因子来延长散列时间,从而抵抗暴力攻击。
JavaScript
1 | npm install bcrypt |
Java
Spring Security中包含了BcryptPasswordEncoder
1 |
|
1 |
|