Maison  >  Article  >  développement back-end  >  Version améliorée du chiffrement de chaîne PHP

Version améliorée du chiffrement de chaîne PHP

不言
不言original
2018-04-26 13:38:532612parcourir

Cet article présente la version améliorée du cryptage de chaîne PHP, qui a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

  • Afin d'augmenter. Sécurité des données

  • Évitez plusieurs cryptages des mêmes caractères pour obtenir des résultats cohérents

  • Vous pouvez définir la période de validité du texte chiffré


Une méthode de cryptage personnalisée est répertoriée ci-dessous.

Utilisation

Mettez Mcrypt.class.php dans le fichier de classe de votre projet, puis introduisez-le via require là où vous devez l'utiliser. Si vous avez besoin de l'utiliser plusieurs fois, dans. dans ce cas, il peut être référencé dans le contrôleur parent :

Méthode de cryptage : Mcrypt::encode($Str, $n);

Méthode de décryptage : Mcrypt::decode( $Str , $n);

  • $Str Chaîne obligatoire qui doit être chiffrée et déchiffrée

  • $n Validité facultative du texte chiffré période, l'unité s,0 est valide en permanence,

    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;;
      } 
   }
}

        

Recommandations associées :

Comment convertir une chaîne PHP en tableau

Méthode de cryptage personnalisée PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn