分享一種用戶密碼加密方式解析


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加密后,再連接的,是從數據庫中查到的對應的字符。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM