竹子熊 2017.7.29
在平常的项目中,对于管理员的密码是以明文进行存储的,这种方式在网站上线时,是极为不安全的.因为很多安全问题都是在极特殊的的情况下遇到的,具有隐蔽性,开发人员很难保证项目在使用过程中不会出现安全漏洞.当网站安全漏洞导致数据被泄漏时,管理人员往往无法在第一时间知道,一旦用户的密码遭到窃取,将造成难以挽回的损失.因此,在软件开发时对于密码存储的安全一定要慎重.
接下来,将介绍我在某内容管理系统开发中加强密码存储的安全性,具体步骤如下.
(1)创建密码函数
在对与密码进行加密时,通常会使用MD5()函数对密码进行摘要运算.MD5算法用于校验两个数据是否相同,通过MD5()函数运算后将得到一个由32位字符组成的字符串.不同的数据产生的MD5字符串不同.理论上,通过MD5生成的字符串无法逆向获得原来的数据.
值得一提的是,由于MD5的广泛性,许多密码破解机构使用彩虹表技术运算并存储了海量字符串的MD5运算结果,导致对密码直接进行MD5运算已经无法应对安全需求,因此出现了许多混淆式的密码算法以提高破解难度.
下面在common\function.php中添加函数,实现密码的加密,具体代码如下.
functrion password($password,$salt){ return md5(md5($password).$salt); }
上述代码中,在对密码进行MD5运算是,会对密码的运算结果再连接$salt进行第2次MD5运算,从而防止一次MD5运算结果被轻易破解.另外,在对网站中的密码进行存储时,通常会为不同的用户生成不同的$salt,从而进一步加强密码的难度.
(2)修改管理员的数据表
重新创建管理员的数据表,添加一个salt字段,并将密码字段修改为固定32位的长度.
CREATE TABLE `cms_admin`( `id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(10) NOT NULL UNIQUE COMMENT'用户名', `passsword` CHAR(32) NOT NULL COMMENT`密码`, `salt` CHAR(6) NOT NULL COMMENT'密钥' )DEFAULT CHARSET=utf8;
在调整表结构后,重新添加管理员数据,对密码进行存储,具体如下.
INSERT INTO `cms_admin`(`id`,`name`,`password`,`salt`)VALUES(1,`admin`,MD5(CONCAT(MD5(`123456`),`itcAst`)),`itcAst`);
上述SQL语句中,密码字段中的concat()用于连接两个字符串.此处的密码加密方式相当于前面编写的password()函数,其中salt可以随意设置,
(3)修改用户登录功能
在完成数据表的修改后,接下来修改后台登录文件admin/login.php,在登陆时取出数据库中保存的密码和salt,然后对用户输入的密码按照调用函数password()函数进行运算,如果运算结果与数据库中保存的结果相同,则表示用户登录成功,具体代码如下.
//根据用户名取出密码 $data=data_fetch(DB_ROW,'SELECT `id`,`name`,`password`,`salt` FROM `cms_admin` WHERE `name`=?','s',$name ); //判断用户名和密码 if($data&&(password($password,$data['salt'])==$data['password'])){ //登陆成功 //..... }
至此,内容管理系统的密码安全存储功能开发完成.