现在的位置: 首页 > 综合 > 正文

用户登陆,密码加密的问题

2014年01月01日 ⁄ 综合 ⁄ 共 1750字 ⁄ 字号 评论关闭

前言:

前几年,csdn 脑残将明文密码直接存入数据库的笑柄已经被数落多年了。到底怎样的密码才安全。今天学习一下这个。

1. 脑残式的明文密码

直接把明文密码存在表中。这种最容易被人攻破。
//1. 明文插入密码
	$userName = strip_tags($_REQUEST['name']);
	$passport = strip_tags($_REQUEST['passport']);

	$sqlInsert = "INSERT INTO user(user_name,passport) values('{$userName}','{$passport}')";
	mysql_query($sqlInsert);

	//读取
	$sqlRead = "SELECT * FROM user WHERE user_name = '{$userName}' AND passport = '{$passport}'";
	$result = mysql_query($sqlRead);
	$isUserExist = mysql_num_rows($result);
	if($isUserExist){
		echo '密码正确';
	}

2. md5加密

将密码用md5加密,插表和读取都加密一下。md5虽说加密保存,但是其实也是很容易破解的。现在的彩虹表(几百万甚至更多MD5密文的集合)轻松就可以将一个加密的md5破解。比如‘123456’的md5值是e10adc3949ba59abbe56e057f20f883e,那么我获取到这个字符串,很明显知道是md5加密的,因为md5加密后的密文都是等长的,再用彩虹表匹配,就知道密码是123456了。
//2. md5加密
	$userName = strip_tags($_REQUEST['name']);
	$passport = md5(strip_tags($_REQUEST['passport']));

3.md5 加盐(MD5+ Salt)

slat译为盐的意思,或者调料,就是在密码中加一点调料,这样破解就复杂了。因为你还需要破解这个salt
$passport = strip_tags($_REQUEST['passport']);
halt='sdfkl23490flkwsx2dr9023'; //一个自定义的随机字符串
$password = md5($password.$halt);

4. 每个用户不一样的salt

这样做的好处是即时用户的密码一样,那么加密的密文也会不一样。这样破解难度更大。麻烦的是:表字段需要加一个salt 字段以来存储这个salt值,可能表迁移和验证密码正确性会麻烦点。
//4. 每个用户不一样的salt
	$userName = strip_tags($_REQUEST['name']);
	$passport = strip_tags($_REQUEST['passport']);
	$salt = md5(time());
	$password = md5($password.$salt);
	//存表,多一个salt字段
	$sqlInsert = "INSERT INTO user(user_name,passport,salt) values('{$userName}','{$passport}','salt')";
	mysql_query($sqlInsert);

	//验证,读取salt值
	$sqlReadSalt = "SELECT salt FROM user WHERE name = '{$userName}'";
	$result = mysql_query($sqlReadSalt);
	$saltResult = mysql_fetch_assoc($result);
	if($saltResult){
		echo '用户不存在';
	}
//读取salt值
	$saltDb = $saltResult['salt'];

	//加密去验证密码是否正确
	$password = md5($password.$saltDb);
	$sqlVerify = "SELECT * FROM user WHERE name = '{$userName}' AND passport = '{$passport}'";
	$result = mysql_query($sqlVerify);
	if(mysql_num_rows($result)){
		echo '密码正确';
	}

完毕。

抱歉!评论已关闭.