Heim  >  Artikel  >  Backend-Entwicklung  >  Die symmetrische PHP-Verschlüsselungsfunktion implementiert die Datenverschlüsselung und -entschlüsselung

Die symmetrische PHP-Verschlüsselungsfunktion implementiert die Datenverschlüsselung und -entschlüsselung

高洛峰
高洛峰Original
2017-01-07 16:32:432343Durchsuche

Es gibt eine Stelle im Projekt, an der die Benutzer-ID verschlüsselt und zur Entschlüsselung an den nächsten Kontakt übermittelt wird. (Verzeihen Sie, dass ich nicht zu viel verrate -_-!) Das erste, was mir in den Sinn kam, war eine Funktion in Kangsheng Ucenter. Später habe ich eine einfache Methode in Concise Magic gesucht und sie integriert, um eine Funktion zu bilden, die Sie verwenden.

1. Symmetrische Verschlüsselung

Der Absender verwendet den Schlüssel und den Algorithmus, um den Klartext in Chiffretext zu verarbeiten, und der Empfänger verwendet den Schlüssel und den Algorithmus, um den Chiffretext in Klartext zu verarbeiten mit demselben Schlüssel verschlüsselt und entschlüsselt.

Da für die Ver- und Entschlüsselung derselbe Schlüssel verwendet wird, hängt die Sicherheit nicht nur vom Algorithmus ab, sondern auch von der Sicherheit des Schlüssels.

Natürlich gilt nicht: Je komplexer der Schlüssel, desto besser. Im Gegenteil, der Schlüssel ist normalerweise kleiner, denn je größer der Schlüssel, desto stärker ist die Verschlüsselung, aber desto langsamer ist die Verschlüsselung Beim Entschlüsselungsprozess muss daher sowohl die Größe des Schlüssels als auch die Sicherheit berücksichtigt werden.

Die Merkmale des symmetrischen Verschlüsselungsalgorithmus sind schließlich, dass der Algorithmus öffentlich ist, der Rechenaufwand gering ist, die Verschlüsselungsgeschwindigkeit schnell ist und die Verschlüsselungseffizienz hoch ist. Es ist besser, die asymmetrische Verschlüsselung direkt zu verwenden.

Darüber hinaus muss jedes Benutzerpaar, das einen symmetrischen Verschlüsselungsalgorithmus verwendet, einen eindeutigen Schlüssel verwenden, der der anderen Person unbekannt ist. Dadurch verringert sich die Anzahl der Schlüssel, die sowohl dem Sender als auch dem Empfänger gehören Die Verwaltung wird für die Benutzer zur Belastung.

Symmetrische Verschlüsselungsalgorithmen sind in verteilten Netzwerksystemen schwierig zu verwenden, hauptsächlich weil die Schlüsselverwaltung schwierig ist und die Nutzungskosten hoch sind.

2. Asymmetrische Verschlüsselung

Asymmetrische Verschlüsselung ist relativ sicher. Sie verwendet ein Schlüsselpaar, einen öffentlichen Schlüssel und einen privaten Schlüssel. Der private Schlüssel kann nur von einer Partei sicher aufbewahrt werden und kann nicht preisgegeben werden, während der öffentliche Schlüssel an jeden gesendet werden kann, der ihn anfordert.

Die am weitesten verbreitete asymmetrische Verschlüsselung ist wahrscheinlich das Bankensystem und die Zahlungsplattform. Wenn wir beispielsweise eine Alipay- oder UnionPay-Zahlungsschnittstelle beantragen, erhalten wir einen öffentlichen Schlüssel. Bei einer Zahlung im Einkaufszentrum verwenden wir den öffentlichen Schlüssel, um die Informationen zu verschlüsseln und an die Plattform zu übermitteln um Ihre Daten zu entschlüsseln und Zahlungsvorgänge durchzuführen.

Obwohl die asymmetrische Verschlüsselung sehr sicher ist, ist sie im Vergleich zur symmetrischen Verschlüsselung sehr langsam. Daher verwenden die meisten von uns im Allgemeinen die symmetrische Verschlüsselung zum Übertragen von Nachrichten, aber der Schlüssel, der bei der symmetrischen Verschlüsselung verwendet wird, sind wir Es kann durch asymmetrische Verschlüsselung gesendet werden. Denken Sie an die Zahlungsschnittstelle, die Sie beantragt haben. ^.^

3. Die Verwendung in Kombination mit

Symmetrische Verschlüsselung ist schnell und besser beim Senden großer Datenmengen. Die Verschlüsselung und Entschlüsselung mit asymmetrischer Verschlüsselung dauert lange, ist langsam und eignet sich nur für die Verschlüsselung kleiner Datenmengen. Die Sicherheit der asymmetrischen Verschlüsselung ist jedoch extrem hoch.

Nutzen Sie Ihre Stärken und vermeiden Sie Schwächen: Verschlüsseln Sie den symmetrischen Verschlüsselungsschlüssel mit dem asymmetrischen öffentlichen Verschlüsselungsschlüssel und senden Sie ihn dann aus. Der Empfänger verwendet den privaten Schlüssel zum Entschlüsseln, um den symmetrischen Verschlüsselungsschlüssel zu erhalten Dann können beide Parteien über eine symmetrische Verschlüsselung kommunizieren.

Es ist nicht angebracht, die im Projekt verwendeten Methoden offenzulegen, sondern es werden hier nur zwei weitere Beispiele aufgeführt. Der erste stammt von ucenter und der zweite ist in Concise Magic zu sehen.

Da es sich um einen Base64-Algorithmus handelt, kann es sein, dass die verschlüsselte Zeichenfolge in der URL unfreundlich ist. Sie können sie mit externen oder modifizierten Methoden entfernen .

/**
 * 字符串加密以及解密函数
 * @param string $string 原文或者密文
 * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE
 * @param string $key 密钥
 * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效
 * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
 */
function _authcode ($string, $operation = 'DECODE', $key = 'Ruesin', $expiry = 0)
{
 $ckey_length = 4;
  
 $key = md5($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));
 }
}
/*********************************************************************
函数名称:encrypt
函数作用:加密解密字符串
使用方法:
加密  :encrypt(&#39;str&#39;,&#39;E&#39;,&#39;nowamagic&#39;);
解密  :encrypt(&#39;被加密过的字符串&#39;,&#39;D&#39;,&#39;nowamagic&#39;);
参数说明:
$string :需要加密解密的字符串
$operation:判断是加密还是解密:E:加密 D:解密
$key  :加密的钥匙(密匙);
*********************************************************************/
function encrypt($string,$operation,$key=&#39;&#39;)
{
 $key=md5($key);
 $key_length=strlen($key);
 $string=$operation==&#39;D&#39;?base64_decode($string):substr(md5($string.$key),0,8).$string;
 $string_length=strlen($string);
 $rndkey=$box=array();
 $result=&#39;&#39;;
 for($i=0;$i<=255;$i++)
 {
  $rndkey[$i]=ord($key[$i%$key_length]);
  $box[$i]=$i;
 }
 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;D&#39;)
 {
  if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8))
  {
   return substr($result,8);
  }
  else
  {
   return&#39;&#39;;
  }
 }
 else
 {
  return str_replace(&#39;=&#39;,&#39;&#39;,base64_encode($result));
 }
}

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Weitere Artikel zu symmetrischen PHP-Verschlüsselungsfunktionen zur Implementierung der Datenverschlüsselung und -entschlüsselung finden Sie auf der chinesischen PHP-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