APP下载

一种基于PDO和密码盐的用户验证模块设计与实现

2020-04-23马杰蔡妹

电子技术与软件工程 2020年8期
关键词:字符串用户名服务器端

马杰 蔡妹

(海南软件职业技术学院 海南省琼海市 571400)

1 引言

用户验证是信息管理系统中的一个重要模块,是保障信息安全的第一道屏障。当前,基于用户名和密码的用户验证依然是各类应用系统主要的用户身份验证方式之一,特别是在中小型信息管理和Web 系统中。由于网络数据传输的开放性、用户使用弱密码、软件开发者缺乏信息安全意识等原因,静态的用户名和密码存在比较大的安全风险,容易受到攻击,网络上用户信息泄露的事件也层出不穷。对应用开发者来说,提升用户验证的安全性是一项迫切的任务。

作为一个轻量级的数据库访问接口,PDO 的运行效率、可移植性、安全性都有了大幅度提升。基于PDO 接口,结合面向对象和MVC 开发模式,融入通过密码盐和散列函数实现的加密算法,封装一个具有良好安全性、复用性、可扩展性的用户验证模块,不仅可以有效提升信息安全,还可以简化开发难度、提高开发效率。

2 基于MVC模式的类设计与实现

如图1 所示,User 类作为实体类与数据表user 进行对应,在User 类中实现对userName、userPassword 等各个成员变量的set/get访问器方法。UserDAO 类基于User 类实现的数据存取操作。其中,getuserID()方法用来返回一个用户的ID,getUser()用来返回一个User 类型的对象,getAllUsers()用户返回所有用户的对象链表。从安全性角度出发,所有SQL 处理的语句按照prepare()和execute()的方式进行实现。

Captcha 类为在服务器端生成验证码的工具类,该类中定义一个createImg()方法,通过随机函数在数组中选择4 个数字或者字母作为验证码,并通过PHP 图形图像绘制的方式返回一张图片。这种设计让验证码在服务器端生成,可以有效防止客户生成端验证带来的安全隐患。

DataCheck 作为一个工具类用来在服务器端对各种用户输入提交的数据进行合法性验证,例如用户名、密码、表单信息等,通过在服务器端对用户提交数据的合法性验证、防SQL 注入检查,可以避免Web 前端验证被绕过的风险,提升系统安全性。

PDOManager 类作为PDO 接口的具体实现,用来封装数据库连接的相关操作,考虑到数据库访问的频繁度,本文采用单例模式进行实现,确保数据库连接实例具有唯一性,减少系统资源消耗,提升运行效率。基于单例模式的PDO 管理类PDOManager 的实现如下:

3 用户验证模块时序图设计

如图2 所示,用户输入用户名、密码、验证码进行登录,验证码图片对象由服务器端生成并发送到到客户端,用户表单提交的验证码首先与Session 中的验证码原始值进行对比验证,不通过则清除掉Session 中的验证码原始值,然后重新调用Captcha 类新生成新的验证码和图片对象。验证码验证通过后,再调用DataCheck 工具类对用户名、密码进行合法性验证,然后消除字符串中可能存在的SQL 安全隐患。在完成这两步验证之后,由UserDAO 对象通过单例模式的PDOManager 对象进行数据库访问操作,通过prepare()和execute()的方式执行SQL 查询,判断用户名和密码是否正确。在判断时,密码由用户密码和密码盐经过散列函数运算后生成。这样,既保证了即使在服务器端用户密码也不可见,也可以增强密码安全性,减低。

4 密码盐的构建与实现

密码盐是指在密码的某个任意位置加入特定字符串,让散列运算后的结果与原始密码直接散列运算出的结果不同。其关键在于特定字符串的选择,构建一个随机度高且具有唯一性的字符串作为密码盐,可以有效降低被针对固定散列值的彩虹表攻击的命中率。

为了确保密码盐的随机性和唯一性,设计如下算法:

(1)首先自定义一个可选择字符串集合,然后通过str_shuffle()函数随机打乱集合中的字符串顺序。

(2)从打乱顺序的字符串集合中选取一个随机的起始位置,截取一段字符串出来作为密码盐前缀。随机位置通过mt_rand()函数实现,截取子串通过substr()函数实现。mt_rand()函数使用Mersenne Twister 算法作为随机数发生器返回随机整数,它产生随机数值的平均速度比作为rand()随机数发生器的libc 快四倍。

(3)将一个固定常量字符串和时间戳进行字符串连接,并对这个字符串通过uniqid()函数生成唯一ID。

图1:模块类图

图2:模块时序图

(4)将密码盐前缀和ID 进行字符串拼接,并通过散列加密函数进行加密,此时生成的加密字符串就是密码盐。

(5)将密码盐作为单独的字段存入用户账号数据表中,用户密码则由密码盐和用户名真实密码按一定规则组合,然后通过散列加密函数进行加密后再存储。

(6)密码验证时,按照同样的规则对用户提交的密码先进行组合、散列,再与数据表中的用户密码进行比对。

密码盐的程序实现如下:

5 结束语

为提升用户验证模块的安全性能,本文基于PDO 接口,使用MVC 模式和面向对象方法设计了一个用户验证模块,实现了单例模式的数据库管理类,在业务流程中,验证码由服务器端生成及验证。同时,基于密码盐的方式来进行密码存储和验证,并提供了一种生成密码盐的生成算法,通过提升随机度和唯一性来增强密码安全。

猜你喜欢

字符串用户名服务器端
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
Linux环境下基于Socket的数据传输软件设计
《护士进修杂志》投稿程序
浅析异步通信层的架构在ASP.NET 程序中的应用
基于Qt的安全即时通讯软件服务器端设计
一种新的基于对称性的字符串相似性处理算法
依据字符串匹配的中文分词模型研究
网页防篡改中分布式文件同步复制系统
一种针对Java中字符串的内存管理方案