>  기사  >  백엔드 개발  >  PHP가 시간에 민감한 암호문을 생성하는 방법에 대한 자세한 설명

PHP가 시간에 민감한 암호문을 생성하는 방법에 대한 자세한 설명

*文
*文원래의
2018-01-03 09:36:452285검색

PHP는 시간에 민감한 암호문을 어떻게 생성하나요? 최근에 discuz에서 아주 좋은 암호화 및 복호화 기능을 발견했습니다. 이 기능의 가장 큰 장점은 지정된 시간 내에 문자열을 암호화하여 복원할 수 있으며, 타임아웃 이후에는 복원할 수 없다는 점입니다. 모든 분들의 참고를 위해 공유해 드리며, 모든 분들께 도움이 되었으면 좋겠습니다.

이러한 방식으로 이 기능을 Single Sign-On 토큰 암호화 전송, 임시 비밀번호 등과 같은 다양한 목적으로 사용할 수 있습니다.

/** 
* @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)); 
    } 
}

관련 권장 사항:

PHP 생성은 읽을 수 있습니다. 임의 문자열

PHP는 어떻게 스크립트를 중지하지 않고 웹 페이지를 닫나요?

PHP가 비밀번호를 더 효과적으로 암호화하는 방법

위 내용은 PHP가 시간에 민감한 암호문을 생성하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.