密码加密技术

密码加密技术


为什么要对密码加密

有一些不负责任的WEB应用,数据库中的密码是使用明文存储的,一旦数据库泄露,就会造成很严重的后果,由于绝大多数用户在多个不同平台的账号密码往往是相同的,黑客就会利用在数据库中获取的账号和明文密码,去访问各大平台,这会造成连带的后果,十分危险。

CSDN 就是这样的典型案例。非常不幸的是,存明文密码的网站不在少数,而且不少是很多所谓的有公信力的大网站。

什么是彩虹表

对于不可逆的加密,最简单的破解就是构造一个巨大的彩虹表(rainbow table)

简单说就是穷举可能的密码组合,比如遍历所有9位数字,从10000,0000到99999,9999
将每个数字的md5 hash散列存入数据库。

然后当用户查询某个加密后的字符串md5 hash时,就去这个数据库里查询挨个比对,如果能查到,就可以反推出原字符串是多少。如果查不出来,也只能说明这个rainbow table不够大,没有包含用户的密码,本质上这就是一种暴力攻击brute force attack

盐Salt

一般来说,最简单的提升加密强度的方法就是“加盐”,也就是所谓的salt。这样的话,能极大提升攻击成本,因为对于每位用户的密码,都加了不同的salt,这样你每破解一个用户的密码,都需要重建一次彩虹表。时间成本及其巨大。

常用的加密算法

MD5

由于彩虹表的存在,MD5加密也变得不再安全

SHA1

同上

Bcrypt

1
2
3
4
5
6
7
8
9
10
11
12
13
@Testvoid contextLoads() {    
//随机加盐
String a=BCrypt.hashpw("123", BCrypt.gensalt());
String b=BCrypt.hashpw("123", BCrypt.gensalt());
//$2a$10$17d/IxKfkPTBJHKlWB8EHOJxBQT7BABQqV505T3g5bLq4atiYIT4i
System.out.println(a);
//$2a$10$F7BL9/w10ktDjrMT9dVTOO.SrO7zjGjQsQ/PQr.qtlU.HXb1147Si
System.out.println(b);
//true
System.out.println(BCrypt.checkpw("123",a));
//true
System.out.println(BCrypt.checkpw("123",b));
}

从上述代码可以看出,每一次加盐都是随机的,而且同一个密码理论上可以对应无数种结果,这使得暴力方法变得不可取。当然,在当前计算机的计算水平是很难完成的,量子计算出现以后,暴力方法会变得很简单。

如何进行相对安全的加密

推荐利用:hash+随机salt+自己算法,这种杂揉的方式。


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×