博客列表 >密码安全的存储

密码安全的存储

无意苦争春的博客
无意苦争春的博客原创
2017年07月29日 19:20:17688浏览

竹子熊 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'])){
  //登陆成功
  //.....
}

    至此,内容管理系统的密码安全存储功能开发完成.

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议