function add_user($username, $password, $email) { $salt = substr(uniqid(rand()), -6); $password = md5(md5($password).$salt); $this->db->query("INSERT INTO table_name VALUES ('$username, $password, $email')"); $uid = $this->db->insert_id(); return $uid; }
$password是用戶輸入的密碼,即$password = $_POST['password'];
$password = md5(md5($password).$salt);
這里可以看到存儲到數據庫中的用戶密碼的加密方式:
表中的密碼等於:用戶輸入的密碼經過md5加密,后面跟上一段字符串$salt之后,再md5加密一次。
$salt這段字符串哪來的呢?
看這一段代碼:$salt = substr(uniqid(rand()), -6);
解開了說,rand(),是一段隨機數,位數也不確定。uniqid(),是 基於以微秒計的當前時間,生成一個唯一的 ID。可以再php里面運行這句話:echo uniqid(rand());能夠得到一段數字與字母的組合的數字。
substr是一段php截取字符串的方法。substr(uniqid(rand()), -6);可以分析為從后面往前截取6個字符。
這種存儲密碼的方式就得到了:用戶輸入密碼md5加密后,在連接上6個隨機字符然后md5加密一次。
再看登錄的代碼:
function check_login($username, $password, &$user) { $user = $this->get_user_by_username($username); if(empty($user['username'])) { return -1; } elseif($user['password'] != md5(md5($password).$user['salt'])) { return -2; } return $user['uid']; }
簡單解析:
$user = $this->get_user_by_username($username);
這句話是根據傳入的username來查詢數據庫(因為用戶名是唯一的)。獲取user的數組。
下面判斷,如果得到的數組$user中的$user['username'])用戶名字段為空的話,就返回-1,如果$user數組里面的$user['password'] 不等於md5(md5($password).$user['salt'])則返回-2
從這里看md5(md5($password).$user['salt']),就是把傳入的密碼md5加密一次,在連接$user數組中的$user['salt']字段,再進行一次md5加密。這個與插入用戶的時候密碼加密方式是相同的,只是這里的用戶輸入的密碼經過md5加密后,再連接的,是從數據庫中查到的對應的字符。
