更多>>PHP程序设计 Blog

PHP 密码安全之比 md5,sha1 更安全的密码散列函数 password_hash 代码使用实例

本文通过代码实例的方式介绍了一款比 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();
	}
}

数据库用户表中保存的数据如下:

2020-01-08_165228.jpg


最后,用户登录,以实现对用户密码进行验证


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();
	}
}


评论列表

暂时没有相关记录

发表评论

用来接收审核回复提醒,请认真填写

  换一张?
captcha
看不清?点击图片换一张