首頁 >後端開發 >php教程 >Discuz經典函數註解之authcode,愛好者必看

Discuz經典函數註解之authcode,愛好者必看

WBOY
WBOY原創
2016-07-25 09:13:461563瀏覽
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
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn