账号密码登陆

账号登陆

因数据库极易遭受网络攻击,所以不能在数据库中直接存储明文存储。

哈希(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
2
3
4
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
1
2
@Autowired
private PasswordEncoder passwordEncoder;