更多>>PHP程序设计 Blog
来源:一度好 时间:2020-01-08 阅读:3987
本文通过代码实例的方式介绍了一款比 md5 加密函数还要安全的加密方法,即密码散列算法函数 password_hash。
引用 PHP 官方手册的一段话,如下:
为何诸如 md5() 和 sha1() 这样的常见散列函数不适合用在密码保护场景?
MD5,SHA1 以及 SHA256 这样的散列算法是面向快速、高效进行散列处理而设计的。随着技术进步和计算机硬件的提升,破解者可以使用"暴力"方式来寻找散列码所对应的原始数据。
因为现代化计算机可以快速的"反转"上述散列算法的散列值,所以很多安全专家都强烈建议不要在密码散列中使用这些散列算法。
PHP 官方在给出了不再建议用 md5 对密码进行加密的同时,也给出了一个更安全的对密码加密的方法,那就是,密码散列算法函数 password_hash。
下面以简单的注册和登录的小实例来解说 password_hash 的用法。
首先,创建一个用户表,代码如下:
CREATE TABLE `my_user` ( `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `user_name` varchar(30) DEFAULT '' COMMENT '用户名', `user_pwd` varchar(60) DEFAULT '' COMMENT '密码', PRIMARY KEY (`user_id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表';
其次,注册用户,以实现对用户密码的加密
HTML 表单文件名 add.html,代码如下:
<form name="form1" method="post" action="{:url('add')}"> name <input name="user_name" type="text" /> <br> pwd <input name="user_pwd" type="password" /> <hr> <input name="submit" type="submit" value="GOOOOOOOOOOO" /> </form>
保存代码如下:
// 注册 添加用户 public function add() { if(Request()->isPost()) { $data['user_name'] = input('param.user_name'); // 用户名 $pwd = input('param.user_pwd'); // 密码 $data['user_pwd'] = password_hash($pwd, PASSWORD_BCRYPT); // 加密密码 $res = Db::name('user')->insertGetId($data); if($res) { $this->success('添加成功'); } else { $this->error('添加失败'); } } else { return $this->fetch(); } }
数据库用户表中保存的数据如下:
最后,用户登录,以实现对用户密码进行验证
HTML 表单文件名 login.html,代码如下:
<form name="form1" method="post" action="{:url('login')}"> name <input name="user_name" type="text" /> <br> pwd <input name="user_pwd" type="password" /> <hr> <input name="submit" type="submit" value="GOOOOOOOOOOO" /> </form>
保存代码如下:
// 登录 用户判断 public function login() { if(Request()->isPost()) { $user_name = input('param.user_name'); // 用户名 $pwd = input('param.user_pwd'); // 密码 $enpwd = password_hash($pwd, PASSWORD_BCRYPT); // 加密密码 $user = Db::name('user')->field('user_id, user_name, user_pwd')->where(" user_name = '".$user_name."' ")->find(); if($user['user_id'] > 0) { // $pwd 输入的密码, $user['user_pwd'] 数据库中正确密码 if(password_verify($pwd, $user['user_pwd'])) { echo '登录成功'; } else { echo '密码错误,登录失败'; } } else { echo '用户名错误,登录失败'; } } else { return $this->fetch(); } }
评论列表 |
暂时没有相关记录
|
发表评论