前言:
前几年,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 '密码正确';
}
完毕。