6.2.2 模型分析

我们以一般Web系统中的用户注册/登录模型为例,分析MD5算法在其中的作用。当然,SHA算法也完全适用这个模型,并且有着更高的安全性。

架构师在设计Web应用中的用户注册/登录模块时,都会考虑这样几个问题:

1.密码如何传递

(1)以Get方式明文传递,不安全。任何人都可以通过链接分析得到。

(2)以Post方式编码传递,也不安全。编码算法是公开的,任何人都能解码。

2.密码如何存储

(1)明文存储,不安全。拥有数据库查询权限的人就很可能泄露用户密码。

(2)密文存储,安全。如果对密码做摘要处理,任何人都难以破解。

3.密码如何校验

(1)明文校验,不安全。与明文存储有同样的隐患。

(2)密文校验,安全。与密文存储有相同的优势。

很明显,三个问题答案选项中,后者更具优势。那么这样一个系统的用户注册与登录是怎样一个流程呢?我们通过图6-2和图6-3进行分析。

对于上述流程,大部分读者朋友都有所体会,作者在这里就不复述了。

用户注册/登录加入消息摘要机制后,有以下几个特点:

1)用户注册时,需要将其密码做摘要处理,以摘要信息存入数据库。

2)用户登录时,需要将其密码做摘要处理,通过数据做查询。

3)用户登录入口处,密码是明文,而数据库中是密文。

4)明文与密文存在对应关系,但仅限于明文到密文的转换,即便是消息摘要算法泄露也不能反推出密码,增强了系统的安全性。

在这样的用户注册/登录模块中,常能见到MD5和SHA算法。为了提高安全性,往往将一些其他的不可变信息,如用户名、Email地址串入原始密码中,使得密码破译的难度加大。其中,不可变信息称为“盐”,而这种处理方式常称为“加盐处理”,其实就是对原始信息的一堆混淆。在基于密码的加密算法PBE中,我们将再次看到这种处理方式。

figure_0172_0038

图 6-2 用户注册

figure_0172_0039

图 6-3 用户登录

在一些开源架构中,例如Spring Security(http://static.springsource.org/spring-security/site/),使用了与上述流程相近的设计方案,并提供了MD5和SHA算法支持,以及对加盐处理方式的支持。