Discuz函數中最經典的函數是authcode函數,因為supesite,UCenterHome,UCenter,Discuz X都使用了這個函數進行加密啊傳輸字串與cookie
今天要為大家帶來authcode的詳解,如果寫的不好,請大家拍磚。喜歡的可以學習參考了!
- /*
- *
- * 函數作用:透過固定的金鑰,對字串進行加密解密,加密後的字串是隨機的
- * 參數解析:$string是被加密的字串,$operation是操作類型('ENCODE'是加密,'DECODE'是解密運算),$key是加密時用的金鑰,$expiry是過期時間
- * 使用舉例:authcode('123', 'ENCODE', 'jordan', 0); 即用'jordan'這個字串加密'123'這個字串
- *
- * */
-
- function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
-
- /keyc的長度,解密的時候需要用它來與密鑰產生密碼本
- $ckey_length = 4;
-
- //對我們的密鑰 'discuz_auth_key']);
-
- //keya是對上面的md5(密鑰前16位元)的再次md5
- $keya = md5(substrkeya = 🎜>
- //keyb是另一個對上面的md5(密鑰後16位元)的md5,驗證字串
- $keyb = md5(substr($key, 16, 16); //取keyc的長度
- //是解密,將keyc從密碼串上取下來註:keyc是傳遞過來的,不變
- 下它的keyc長度個 註:keyc是隨機
- $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md)5(microtime($string, 0, $ckey_length): substr(md)5(microtime( $ckey_length)) : '';
-
- //用keya拼接上md5後的keya與keyc的拼接, 用來加密或解密 註:加密時隨機,解密時固定 $🎜> . keya.md5($keya.$keyc);
-
- //$cryptkey對長度為16+32=48
- //判斷操作分成加密,解密,取得處理串
- //如果是解密,截取下keyc的長度的串,因為加密的時候拼接在最前面了,並base64反解
- //如果是加密,將時間戳拼接上過期秒數,格式化成十位的字串,拼接上驗證串的16位,再拼接原串
- $string = $operation == 'DECODE' ? base64_decode(substr($string, $operation == 'DECODE' ? base64_decode(substr($string, $operation == 'DECODE' ? base64_decode(substr($string, $operation == 'DECODE' ?base ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$ 🎜>
- /取得處理串長
- $string_length = strlen($string);
-
- // //填入box array(0, 1, 2, 3, ...省略... , 255);
- $box = range(0, 255);
-
- 註解相同的串
- $rndkey = array();
- for($i = 0; $i }
-
- //持續處理產生密碼本
- $ j = ($j + $box[$i] + $rndkey[$i]) % 256;
- $tmp = $box[$i] j];
- $box[$j] = $tmp;
- }
-
- //再打亂產生密碼本,保證機密隨機
- for($a = $j = $i = 0; $ ($a + 1) % 256;
- $j = ($j + $box[$a]) % 256;
- $ $box[$a ] = $box[$j];
- $box[$j] = $tmp;
-
- $result .= chr(ord ($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
- }
-
- }
-
- }
-
- } //若是解密
- ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) ) {
- //驗證中與原串
- > } else {
- return '';
- }
- } else {
- //若是加密拼接keyc與base64(加亂 return $keyc.str_replace('=', '', base64_encode($ result));
- }
-
- }
-
-
-
-
cookie |