我的加密进化史

加密是一个争论无止境的话题,服务器端数据保存加密数据传输加密,等等。在这篇文章我就简单说说我这么多年来在服务器端保存密码的方法进化史。

阶段1: 明文密码

在本科大一向大二过度的时候,第一次开始接触服务器端编程(当时还是用asp.net 2.0),第一次接触数据库,也第一次意识到原来那些新闻网站不需要每个新闻都建一个html页面。因为这段时间更看重的是能work(没有任何的实际的项目), 任何数据都是通过前段的textbox直接传到后台,然后不加任何的处理直接存到数据库的.

阶段2: MD5

阶段1没持续多久,并伴随着好多知名网站被脱裤,我开始知道md5这个加密方法(类似的方法还有SHA系列的)。至此,我“自诩”自己在安全方面跨出了一大步。一直到研一,我都觉得简单的MD5加密是有效的。

Note: 后来据说md5也被中国一个教授破解了,自己也把自己常用的md5字符串去解密网站试试,发现有些很容易就破解了,所以有时候为了安全会加两遍md5。

阶段3: MD5 + Salt

人也是不断成长的,后来无法忍受这种纯md5带来的安全假象,结合自己在网站的所闻,了解到了这个概念(md5(password + salt))。关于,也分两个阶段:

  1. 全局共享盐(所有人都共享一个盐值,图省事)
  2. 私有盐(每个人有自己独立的盐)

阶段4: bCrypt

这个是最近才逐渐了解的密码认证方式。以后再做任何验证相关的,都准备用这种方式了

Note: bCrypt 的结果长度为59或60,所以数据库设计成char(60)是安全的

Code Sample

1
2
3
4
5
6
7
8
9
10
11
String password = "password";
// From spring-security-crypto Package
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encoded = passwordEncoder.encode(password);
System.out.println(encoded);

if( passwordEncoder.matches(password, encoded)){
System.out.println("Match");
} else {
System.out.println("Not match");
}

Result

1
2
$2a$10$KE/QEQgT5c3RfUqiCu2Ql.DtTuznW1y2i2f/LOruROD0YO7vj2492  // this will be different for you
Match

SO: bcrypt工作原理

"bCrypt"