基于加盐BCrypt算法的电商安全模块设计及实现①

2019-10-18 06:40王立华
计算机系统应用 2019年10期
关键词:字符串加密算法哈希

扈 玮,王立华

(山东科技大学 电子信息工程学院,青岛 266590)

电子商务的快速发展对系统的安全性提出了更高的要求,但是许多企业应用的安全性还没有得到足够的重视,密码泄露的情况时有发生,造成了严重的经济损失和社会不安.早在2008年,卡内基梅隆大学软件工程研究所就通过美国政府资助的漏洞警报系统向安全专业人员发出公告:MD5应被视为已破解且不适合继续使用的加密方法;网络公司TrustedSec LLC的首席执行官David Kennedy指出:“MD5被认为在2013年之前就已经过时了.从那时起,大多数公司开始使用更安全的哈希算法”[1].在2019年01月,BMG公司正式确认该公司的热门游戏《塞勒姆小镇》有安全漏洞,该漏洞现已得到解决,但该游戏拥有760万用户,其信息受到损害.用户的密码、IP地址和电子邮件信息有被泄露的风险,而泄密的原因是:使用MD5哈希算法存储帐户密码[2].随着此类密码泄露事件的一次次发生,迫切需要更安全的加密算法提高系统的安全性能.

运用MD5加密算法虽然可以实现密码加密的功能,产生32位字符串并且算法不可逆.但是MD5加密算法存在着诸多弊端:同一密码经过MD5算法产生的字符串一模一样;同时随着计算机技术的发展和计算水平的不断提高,可以用彩虹表等方法轻松破解,已不再适合安全要求较高的场合使用[3-6].针对此类情况作出改进,旨在设计并实现一个以springmvc+spring+mybatis框架为基础的电商安全模块[7-11],其中表现层springmvc框架用于客户端的视图显示;业务层spring框架用于系统业务逻辑操作的具体实现;持久化层框架mybatis用于与Mysql数据库进行数据交互,完成增删改查(CRUD)操作.同时用更安全的加盐Bcrypt算法实现密码加密和验证功能,加强了数据安全的维护工作.

1 加盐 BCrypt算法

1.1 BCrypt算法

Bcrypt算法是基于Blowfish加密设计的一个慢哈希算法,是Open BSD或其他Linux发行版的默认加密算法,该算法的设计是为了抵抗对哈希值或者盐的布鲁特攻击,有效地解决了MD5加密算法的弊端[12-17].

算法原形是:DK=bcrypt(cost,salt,input)

参数cost是计算强度,即循环次数;

参数salt是密码学中的盐;

参数input是输入的密码文本;

输出DK是生成的派生密钥.

BCrypt算法计算后的密文中包含了算法版本、循环次数、盐值以及哈希字符串.下面是“123456”以10为循环次数经加盐BCrypt算法加密后随机生成的60位字符串“$2a$10$jI49TG.oPta0fuhlxqtLzeUZuw N1rzZU9G/1R1CIYIT.lirNPimwu”.其中$是分割符,无意义;2a表示BCrypt算法加密版本号;10是cost值,表示密码加密的计算强度,强度越高,则密码越复杂,计算时间也越长;而后的前22位是盐值,具有随机性;其余的哈希字符串就是密码的密文了.

1.2 加盐处理

如果只是单纯的哈希字符串存储,如果两个或更多人设置的密码相同,则加密后将得到相同的结果,进入到数据库破解一个就可以破解一大片的密码.例如名为A的用户可以查看数据库,可以发现存储的哈希字符串结果有些是相同的,那么不同的用户对应的就是同一个设置密码,这样就可以利用别人的身份登录系统.由于盐是随机产生的,存储不同用户数据时加入的盐都是随机的,所以就可以保证不同的用户即使有相同的密码,存储在数据库中的密码也是千差万别的.上述加密策略,可以形象地称为“加盐哈希加密”[18],可以在对密码进行哈希算法之后,将盐随机并混入加密后的哈希字符串,进行二次加密,验证时也无需单独提供之前的盐,从而无需单独处理盐的问题,更加安全方便.

BCrypt是单向的,而且经过salt和cost的处理,与MD5加密算法相比,安全性得到了极大地提高.为使攻击者难以构造出所有可能值的查询表,其盐值和计算强度的值必须足够长,彩虹表攻击破解密文的概率则越低,破解的难度也就越大.

2 加盐BCrypt算法的模型分析

在电商安全模块中,用户密码的加密和验证流程如图1所示.流程包括用户注册和用户登录两大部分[19].有信息系统存在的地方,就需要进行用户信息认证,还可以根据用户赋予不同的访问权限.安全模块的注册和登录的流程大致如下:

图1 密码加密存储与验证流程图

(1)用户注册:用户输入登录名、密码及其他有关信息后,将相关数据传输到后端服务器,直至保存到Mysql数据库中.因为登录名也是主键,具有唯一性,若输入的登录名已经存储在数据库中,则无法成功注册,仍就停留在注册页面并且弹出注册失败的提示;

(2)后端服务器接受到用户数据,将其中的密码进行加盐BCrypt算法加密处理.若主键不重复,则表单数据和对应的创建日期存储到数据库中,页面跳转到登录页面;

(3)用户登录:用户输入的登录名及密码传输到服务器,服务器通过登录名从mysql数据库中查询该用户是否存在,若用户不存在,则仍就停留在登录页面;

(4)若用户存在,则服务器将客户端传过来的密码经过BCrypt算法加密处理得到哈希字符串;同时服务器根据登录名取得数据库中对应的密文,并提取出盐值得到哈希字符串;并对两个哈希字符串进行验证,如果完全相同,则表示用户登录成功,页面跳转到用户主页;如果不同,则表明用户登录失败,仍就停留在登录页面,并且不会给出任何信息提示.

3 加盐Bcrypt算法的实现

用户注册和登录功能涉及到用户表tb_user,如表1所示;涉及到的类,如表2表示.

3.1 用户注册的密码加密功能

用户注册的时序图如图2所示,时序图中涉及到的主要方法介绍:

Add (@RequestBody TbUser user):后端控制层增加用户信息的方法;

图2 密码加密功能时序图

encode (rawPassword):加密方法,参数rawPass- -word为用户输入的密码;

add (TbUser user):后端服务层增加用户信息的方法;

insert (user):后端数据访问层向数据库增加用户信息的方法.

表1 用户表(tb_user)

表2 类的简介

当用户在注册页面上填写表单,点击注册按钮后,将依次调用控制类UserController的add (@Requ--estBody TbUser user)方法;BCryptPasswordEncoder的encode (rawPassword)方法,并将加密后的字符串存入user中;服务接口类UserService的add (TbUser user)方法;服务实现类UserServiceImpl的add (TbUer user)方法,并设置申请日期存入user中;数据访问类TbUser Mapper的insert (user)方法,向数据库插入表单数据.

在控制类UserController中,如果增加数据成功,Result传递的参数为{success:true,message:“注册成功”},页面自动跳转到登录页面;如果增加数据失败,Result传递的参数为{success:false,message:“注册失败”},页面仍就停留在注册页面.

用户注册功能的实现效果图,如图3所示.

图3 注册功能实现图

3.2 用户登录的密码验证功能

用户登录的时序图如图4所示,时序图中涉及到的主要方法介绍:

loadUserByUsername (String username):认证类的验证方法,参数为用户输入的登录名;

findOne (String id):后端服务层根据id查询用户数据的方法;

selectByPrimaryKey (id):后端控制层根据id从数据库查询用户数据的方法;

matches (rawPassword,encodedPassword):密码验证方法,参数encodedPassword表示从数据库读取的密文.

图4 密码验证功能时序图

用户在登录页面输入登录名和密码,点击登录按钮之后,依次调用UserDetailsServiceImpl的load- -UserByUsername(String username)方法;UserService- -Impl的 findOne(String id)方法;TbUserMapper的selectByPrimaryKey(id)方法,运用mybatis框架的xml配置文件可以方便地从数据库中得到主键对应的TbUser用户对象,TbUserMapper.xml文件里对应的查询语句如下:

<select id= "selectByPrimaryKey" resultMap="BaseResultMap" parameterType= "java.lang.String">

select <include refid= "Base_Column_List"/> from tb_user

where user_id = #{ userId,jdbcType= VARCHAR}

</select>

其中parameterType表示输入参数是字符串类型,user_id表示用户输入的登录名,Base_Column_List表示主键对应的包括诸多字段信息的TbUser用户对象,resultType表示把查询结果封装到pojo类型中.

在UserDetailsServiceImpl认证类中,判断user对象非空,若不满足条件则仍是登录页面,若满足条件则在spring-security.xml(安全框架配置页)的认证管理器模块引入密码工具接口的实现类BCryptPasswordE- -ncoder,调用matches(rawPassword,encodedPassword)方法进行密码验证,判断用户输入的密码和从数据库读取的密码是否一致,若不满足条件则仍是登录页面,若满足条件则跳转到用户系统主页.用户登录功能实现效果图,如图5所示.

4 加密算法的实现效果

如图6所示,数据库存储的密码均为123456,xiaoA用户的密xiaoB用户和xiaoC用户的密码都采用MD5加密算法,产生了相同的32位字符串,存储到数据库中.管理员虽然不能直观看到账号的密码,但是同样的明文经过MD5算法加密产生相同的密文,而且可以用彩虹表等方法轻松破解.采用加盐BCrypt算法成功解决了以上问题,正如图中的xiaoD用户和xiaoE用户的密码都采用加盐BCrypt算法,产生了随机的60位字符串,存储到数据库中,大大提高了数据的安全性.

图5 登录功能实现图

图6 实现效果图

5 总结

现今信息安全形势不容乐观,很多企业应用安全性未得到足够重视,涉及购物的电商企业更应加强信息安全,避免造成不可估量的损失.本文结合高内聚低耦合法则、SSM框架三层架构的思想,详细阐述了用户注册和登录功能设计与实现过程,采用加盐BCrypt加密算法实现密码存储加密和验证功能,解决MD5加密算法的弊端,为电商安全提供了一份有效解决方案.

猜你喜欢
字符串加密算法哈希
加密文档排序中保序加密算法的最优化选取
哈希值处理 功能全面更易用
Windows哈希值处理不犯难
文件哈希值处理一条龙
基于整数矩阵乘法的图像加密算法
一种基于PowerBuilder环境字符串相似度算法
教育云平台的敏感信息保护技术研究
SQL server 2008中的常见的字符串处理函数
倍增法之后缀数组解决重复子串的问题
巧用哈希数值传递文件