Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung, wie PHP zeitkritischen Chiffretext generiert

Detaillierte Erklärung, wie PHP zeitkritischen Chiffretext generiert

*文
*文Original
2018-01-03 09:36:452285Durchsuche

Wie generiert PHP zeitkritischen Chiffretext? Kürzlich habe ich in discuz eine sehr gute Ver- und Entschlüsselungsfunktion gefunden. Das Tolle an dieser Funktion ist, dass sie die Zeichenfolge innerhalb der angegebenen Zeit verschlüsseln und wiederherstellen kann und nach einer Zeitüberschreitung nicht wiederhergestellt werden kann. Ich teile es als Referenz für alle und hoffe, dass es für alle hilfreich sein wird.

Auf diese Weise können wir diese Funktion für viele Zwecke nutzen, z. B. für die verschlüsselte Übertragung von Single-Sign-On-Tokens, temporären Passwörtern usw.

/** 
* @param string $string 原文或者密文 
* @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE 
* @param string $key 密钥 
* @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效 
* @return string 处理后的 原文或者 经过 base64_encode 处理后的密文 
* 
* @example 
* 
* $a = authcode('abc', 'ENCODE', 'key'); 
* $b = authcode($a, 'DECODE', 'key'); // $b(abc) 
* 
* $a = authcode('abc', 'ENCODE', 'key', 3600); 
* $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,$b(abc),否则 $b 为空 
*/ 
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 3600) { 
    $ckey_length = 4; 
    // 随机密钥长度 取值 0-32; 
    // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。 
    // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方 
    // 当此值为 0 时,则不产生随机密钥 
    $key = md5($key ? $key : EABAX::getAppInf('KEY')); 
    $keya = md5(substr($key, 0, 16)); 
    $keyb = md5(substr($key, 16, 16)); 
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; 
    $cryptkey = $keya.md5($keya.$keyc); 
    $key_length = strlen($cryptkey); 
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; 
    $string_length = strlen($string); 
    $result = ''; 
    $box = range(0, 255); 
    $rndkey = array(); 
    for($i = 0; $i <= 255; $i++) { 
        $rndkey[$i] = ord($cryptkey[$i % $key_length]); 
    } 
    for($j = $i = 0; $i < 256; $i++) { 
        $j = ($j + $box[$i] + $rndkey[$i]) % 256; 
        $tmp = $box[$i]; 
        $box[$i] = $box[$j]; 
        $box[$j] = $tmp; 
    } 
    for($a = $j = $i = 0; $i < $string_length; $i++) { 
        $a = ($a + 1) % 256; 
        $j = ($j + $box[$a]) % 256; 
        $tmp = $box[$a]; 
        $box[$a] = $box[$j]; 
        $box[$j] = $tmp; 
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 
    } 
    if($operation == &#39;DECODE&#39;) { 
        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { 
            return substr($result, 26); 
        } else { 
            return &#39;&#39;; 
        } 
    } else { 
        return $keyc.str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result)); 
    } 
}

Verwandte Themen Empfehlungen:

PHP generiert lesbare Zufallszeichenfolgen

Wie PHP Webseiten implementiert Schließen Sie das Non-Stop Skript

Wie PHP Passwörter besser verschlüsseln kann

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung, wie PHP zeitkritischen Chiffretext generiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn