其他

密码的加密加盐处理

1、首先介绍一下常规的登录认证(非安全性)


l 数据库表如下所示:

<form action="index.jsp" method="post">
    账 号:<input type="text" name="username"/><br/>
    密 码:<input type="password" name="password"><br/><br/>
    <input type="submit" value="提交"><br/>
</form>

l 用户通过表单提交用户名,密码两个字段查询数据库匹配,实现登录认证功能,但存在的安全隐患问题太多:

(1)数据库密码以明文的形式进行存储。
(2)数据传输的过程中未对数据进行加密处理。

2、针对以上两个问题进行分析和解决


l 安全加密:首先对数据库表的password字段进行摘要md5处理,sql语句如下:

l md5加密后的数据

l 数据库密码加密后,校验的逻辑就发生了些变化,需要对提交的密码进行加密之后再做对比,但是这样子还是不安全。

(1)通过以上步骤,我们只对数据库的password明文字段进行了简单的MD5加密,进入http://www.cmd5.com/ 输入加密后的密文进行解密后可以得到明文密码

(2)容易根据密文位数推测算法,从而使用工具破解。

(3)真实密码相同,加密过的密码也相同。

3、接下来我们介绍一下对其进行加盐处理


什么是加盐?

在密码学中,通过在密码任意固定位置插入特定字符串,让散列后的结果和使用原始密码的散列结果不相符,这样一个过程我们称之为“加盐”。

“盐值”是一组随机的字符串,被称为Salt,由系统随机生成。Salt可以插在最前面、最后面,也可以插在中间,可分开插入也可倒序。

为什么要加盐?

在实际应用中,出于安全和数据保密的考虑,常常需要使用到加密算法,一些网站的数据库管理着用户的ID及密码。密码常以MD5等加密后的形式存在,但也并非万无一失。于是就出现了加盐加密的方式,这种加入盐值的方式可以有效防止黑客暴力破解用户ID和密码。

  • 第一代密码:数据库明文存储,一旦数据库泄露,用户数据全部泄漏。
  • 第二代密码:数据库加密存储,典型加密算法有 MD5 和 SHA1 ,数据库存储的密码为加密后的密文。理论上来说不能被解密,即使数据库丢失,但由于存储为密文,所以无法判断用户原始密码。
  • 第三代密码:数据库存储MD5加密后的密码+Salt,进行加盐处理。当密码设置过于简单,第二代密码加密方式就不那么有效了,于是为数据库加入一个Salt盐值字段(Salt可以是任意字母、数字、或字母数字的组合,必须是随机产生的),每个用户Salt值均不相同。

加盐流程

用户注册时:

  • 用户在网站注册时提供ID与密码;
  • 系统为用户分配盐值;
  • 盐值插入密码后进行HASH;
  • 将ID,HASH值与盐值一起存入数据库。

身份验证时:

  • 用户提供ID与密码;
  • 系统在数据库中通过用户提供的ID查找HASH值与盐值;
  • 将盐值插入用户提供的密码后进行HASH;
  • 将HASH值与数据库中的HASH值比较,相等则验证成功,反之则验证失败。

l 在表中添加一列salt字段(盐),内容随意输入23sd2,然后和原来的明文密码123456结合,再进行md5加密

说明:所谓的salt字段就是一个随机的字段,具体随机算法就不讨论了,每当用户注册账户时,后台就给它随机生成一个不同的字段,然后根据password和salt字段结合进行摘要处理,存在数据库表中的password字段,这样一来,原来明文都是123456生成的密文就不一样了。

以上的步骤我们只是对数据库进行了加密,为了防止用户输入密码在传输的过程中被抓包工具获取,我们还要在密码传输的过程中进行加密,这样可以使得获取到的也是密文。

4、最后介绍下BCrypt加盐加密


l 经过BCryptPasswordEncoder加密后的内容,不需要专门的salt字段存储盐,而是在密文中。

l BCrypt密码图解

l Bcrypt有四个变量:

  • saltRounds: 正数,代表hash杂凑次数,数值越高越安全,默认10次。
  • myPassword: 明文密码字符串。
  • salt: 盐,一个128bits随机字符串,22字符
  • myHash: 经过明文密码password和盐salt进行hash

l 如何校验正确性

在校验时,从密文中取出盐salt,salt跟password进行hash,得到的结果跟保存在DB中的hash进行比对。

总结


l 对于用户的密码保护,数据库对敏感的字符内容一定要进行加密之后存储。

l 如果只是单纯的对密码进行加密,密码字符一样会导致加密后的内容也一样,会出现破解一个就可以破解一片的情况。

l 通过对密码加盐(混入随机字符拼接在密码明文中)之后加密,可以增加系统复杂度,得到更强更安全的密文摘要值。