首先找到文件:uc_client/model/user.php
里面有一個函數(shù):
[代碼]php代碼:
function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') { $regip = empty($regip) ? $this->base->onlineip : $regip; $salt = substr(uniqid(rand()), -6); $password = md5(md5($password).$salt); $sqladd = $uid ? "uid='".intval($uid)."'," : ''; $sqladd .= $questionid > 0 ? "secques='".$this->quescrypt($questionid, $answer)."'," : "secques='',"; $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'"); $uid = $this->db->insert_id(); $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'"); return $uid; }
這個是添加用戶到ucenter中的方法,注意里面這句話:
$password = md5(md5($password).$salt);
這里可以看到存儲到數(shù)據庫中的用戶密碼的加密方式:
表中的密碼等于:用戶輸入的密碼經過md5加密,后面跟上一段字符串$salt之后,再md5加密一次。
$salt這段字符串哪來的呢?
看緊挨著上面的一段代碼:$salt = substr(uniqid(rand()), -6);
解開了說,rand(),是一段隨機數(shù),位數(shù)也不確定。
uniqid(),是 基于以微秒計的當前時間,生成一個唯一的 ID。
可以再php里面運行這句話:echo uniqid(rand());
能夠得到一段數(shù)字與字母的組合的數(shù)字。
substr是一段php截取字符串的方法。
substr(uniqid(rand()), -6);可以分析為從后面往前截取6個字符。
那么discuz存儲密碼的方式就得到了:用戶輸入密碼md5加密后,在連接上6個隨機字符然后md5加密一次。