Heim > Backend-Entwicklung > PHP-Tutorial > Detaillierte Erläuterung der symmetrischen PHP-Verschlüsselungsfunktion zur Implementierung der Datenverschlüsselung und -entschlüsselung

Detaillierte Erläuterung der symmetrischen PHP-Verschlüsselungsfunktion zur Implementierung der Datenverschlüsselung und -entschlüsselung

墨辰丷
Freigeben: 2023-03-28 15:36:02
Original
2490 Leute haben es durchsucht

In diesem Artikel wird eine einfache symmetrische Verschlüsselungsfunktion in PHP zur Implementierung der Datenverschlüsselung und -entschlüsselung ausführlich vorgestellt. Bei Bedarf können Sie auch mehr über die symmetrische Verschlüsselung und die asymmetrische Verschlüsselung erfahren.

Es gibt eine Stelle im Projekt, an der die Notwendigkeit genutzt wird, die Benutzer-ID zu verschlüsseln und zur Entschlüsselung an den nächsten Kontaktpunkt zu übertragen. (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 in Concise Magic gesucht und eine einfache Methode gefunden, also habe ich 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 zu senden, und der Empfänger verwendet den Schlüssel und den Algorithmus, um den zu verarbeiten Chiffretext in Im Klartext verwenden sowohl der Sender als auch der Empfänger denselben Schlüssel zum Verschlüsseln und Entschlüsseln der Daten.

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

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 hoch 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

Sie verwendet ein Schlüsselpaar, einen öffentlichen Schlüssel und einen privaten Schlüssel, die jeweils zur Verschlüsselung verwendet werden . 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 dürften Bankensysteme und Zahlungsplattformen sein. 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 über eine 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, hier werden jedoch 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));
 }
}
Nach dem Login kopieren

/*********************************************************************
函数名称: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));
 }
}
Nach dem Login kopieren

Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass es so sein wird hilfreich für das Studium aller.


Verwandte Empfehlungen:

Redis Multi-Library-Auswahlfunktion Singleton-Klasse in PHP implementiert (ausführliche Erklärung)

PHP-Strategiemusterdefinition und -verwendung (detaillierte Erklärung)

Detaillierte Erklärung der Methode der benutzerdefinierten PHP-Funktion, um zu bestimmen, ob sie von Get/ übermittelt wird Post/Ajax

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der symmetrischen PHP-Verschlüsselungsfunktion zur Implementierung der Datenverschlüsselung und -entschlüsselung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage