Heim >Backend-Entwicklung >PHP-Tutorial >Erweiterte Version der PHP-String-Verschlüsselung

Erweiterte Version der PHP-String-Verschlüsselung

不言
不言Original
2018-04-26 13:38:532696Durchsuche

In diesem Artikel wird die erweiterte Version der PHP-String-Verschlüsselung vorgestellt, die einen bestimmten Referenzwert hat. Jetzt können Freunde in Not darauf verweisen

  • Zur Verbesserung Datensicherheit

  • Vermeiden Sie mehrfache Verschlüsselungen derselben Zeichen, um konsistente Ergebnisse zu erhalten

  • Sie können die Gültigkeitsdauer des Chiffretexts festlegen


Eine benutzerdefinierte Verschlüsselungsmethode ist unten aufgeführt.

Verwendung

Fügen Sie Mcrypt.class.php in die Klassendatei Ihres Projekts ein und führen Sie es dann über require dort ein, wo Sie es verwenden müssen In diesem Fall kann im übergeordneten Controller darauf verwiesen werden:

Verschlüsselungsmethode: Mcrypt::encode($Str, $n);

Entschlüsselungsmethode: Mcrypt::decode( $Str , $n);

  • $Str Erforderliche Zeichenfolge, die verschlüsselt und entschlüsselt werden muss

  • $n Optionale Chiffretextgültigkeit Periode, Einheit s,0 ist dauerhaft gültig.

    require("Mcrypt.class.php") ;
    $code = Mcrypt::encode('sajkfcasjcla','7580');
    echo "code-".$code;
    
    $code_ans = Mcrypt::decode("$code",'7580');
    echo "answer-".$code_ans;

Mcrypt.class.php

/*
* 字符串加解密类;
* 一次一密;且定时解密有效
* 可用于加密&动态key生成
 */
class Mcrypt{
  public $default_key = 'a!takA:dlmcldEv,e';

/**
 * 字符加密,一次一密,可定时解密有效
 * @param string $string 原文
 * @param string $key 密钥
 * @param int $expiry 密文有效期,单位s,0 为永久有效
 * @return string 加密后的内容
*/
public static function encode($string,$key = '', $expiry = 0){
    $ckeyLength = 4;
    $key = md5($key ? $key : $this->default_key); //解密密匙
    $keya = md5(substr($key, 0, 16));         //做数据完整性验证  
    $keyb = md5(substr($key, 16, 16));         //用于变化生成的密文 (初始化向量IV)
    $keyc = substr(md5(microtime()), - $ckeyLength);
    $cryptkey = $keya . md5($keya . $keyc);  
    $keyLength = strlen($cryptkey);
    $string = sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string . $keyb), 0, 16) . $string;
    $stringLength = strlen($string);

     $rndkey = array();    
     for($i = 0; $i <= 255; $i++) {    
        $rndkey[$i] = ord($cryptkey[$i % $keyLength]);
    }

    $box = range(0, 255);    
    // 打乱密匙簿,增加随机性
    for($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
     }    
     // 加解密,从密匙簿得出密匙进行异或,再转成字符
     $result = &#39;&#39;;
     for($a = $j = $i = 0; $i < $stringLength; $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]));
      }
     $result = $keyc . str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));
     $result = str_replace(array(&#39;+&#39;, &#39;/&#39;, &#39;=&#39;),array(&#39;-&#39;, &#39;_&#39;, &#39;.&#39;), $result);
     return $result;
 }

 /**
 * 字符解密,一次一密,可定时解密有效 
 * @param string $string 密文
 * @param string $key 解密密钥
 * @return string 解密后的内容
 */
 public static function decode($string,$key = &#39;&#39;) {
       $string = str_replace(array(&#39;-&#39;, &#39;_&#39;, &#39;.&#39;),array(&#39;+&#39;, &#39;/&#39;, &#39;=&#39;), $string);
       $ckeyLength = 4;
       $key = md5($key ? $key : $this->default_key); //解密密匙
       $keya = md5(substr($key, 0, 16));         //做数据完整性验证  
       $keyb = md5(substr($key, 16, 16));         //用于变化生成的密文 (初始化向量IV)
       $keyc = substr($string, 0, $ckeyLength);
       $cryptkey = $keya . md5($keya . $keyc);  
       $keyLength = strlen($cryptkey);
       $string = base64_decode(substr($string, $ckeyLength));
       $stringLength = strlen($string);

       $rndkey = array();    
       for($i = 0; $i <= 255; $i++) {    
              $rndkey[$i] = ord($cryptkey[$i % $keyLength]);
        }

        $box = range(0, 255);
        // 打乱密匙簿,增加随机性
        for($j = $i = 0; $i < 256; $i++) {
              $j = ($j + $box[$i] + $rndkey[$i]) % 256;
              $tmp = $box[$i];
              $box[$i] = $box[$j];
              $box[$j] = $tmp;
        }
       // 加解密,从密匙簿得出密匙进行异或,再转成字符
       $result = &#39;&#39;;
       for($a = $j = $i = 0; $i < $stringLength; $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 ((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;;
      } 
   }
}

So konvertieren Sie einen PHP-String in ein Array

Benutzerdefinierte PHP-Verschlüsselungsmethode

Das obige ist der detaillierte Inhalt vonErweiterte Version der PHP-String-Verschlüsselung. 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