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