Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erklärung der PHP-Verschlüsselung und -Entschlüsselung

Detaillierte Erklärung der PHP-Verschlüsselung und -Entschlüsselung

小云云
小云云Original
2018-05-11 15:26:426601Durchsuche

Ich weiß nicht, wie viel Sie über PHP-Verschlüsselung und -Entschlüsselung wissen. Dieser Artikel vermittelt Ihnen hauptsächlich Wissen über PHP-Verschlüsselung und -Entschlüsselung, in der Hoffnung, Ihnen zu helfen.

Eine symmetrische Verschlüsselung

1. Symmetrische Verschlüsselung von mycyrpt:

/** 
* @param $key  //数据加密密钥 由自己定义,长度有限制 string 
* @param $string  //需要进行加解密的字符串 string 
* @param $decrypt //加密还是解密 (最简单的,0代表加密,1代表解密) 
* @return string */
function encryptDecrypt($key, $string, $decrypt)
{   
 if(!$decrypt){        
 //加密        
 $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));        
 return $encrypted;    
 }else{       
 //解密        
 $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");        
 return $decrypted;    
 }

}//使用方法:echo encryptDecrypt('passwordgg', 'Hello欢迎您',0);  
//加密  
ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=echo encryptDecrypt('passwordgg', 'ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=',1);  
//解密  
Hello欢迎您

Hinweis: Diese Methode wurde seit php7.1 aufgegeben, und openssl_encrypt und openssl_decrypt , die offizielle Empfehlung lautet, die OpenSSL-Familie für die Verschlüsselung und Entschlüsselung zu verwenden

2. Symmetrische Verschlüsselung in der OpenSSL-Erweiterung

/** 
* @param string $data 需要加解密的数据字符串 string
* @param int $yes 加密还是解密(1表示加密,0表示解密) 
* @param string $key 数据加密密钥 
* @param string $iv 初始化向量 //注:这里为了显示效果,暂时将iv存储到session中, 
* @param string $iv 实际应用中,应该将iv和加密后的字符串都存储在数据库 
* @param string $encryptMethod  
数据加密方式 100余种,可通过openssl_get_cipher_methods()函数获取, 
* @param string $encryptMethod  选择其中一种(如果选择cbc结尾的加密算法,
需要初始化向量iv,如本例) 
* @return string 
*/
function openssl_crypt($data='',$yes=1,$key='secret',$iv='',$encryptMethod='aes-256-cbc'){    
if($yes)
{        
$ivLength = openssl_cipher_iv_length($encryptMethod); //获取该加密算法iv应该具有的长度        
$iv = openssl_random_pseudo_bytes($ivLength, $isStrong); //生成iv(初始化向量)       
 if (false === $iv && false === $isStrong) 
 {            
 die('IV generate failed');        
 }        
//加密        
$encrypted = openssl_encrypt($data, $encryptMethod, $key, 0, $iv);        
$_SESSION['iv']=$iv; //将iv存到session中        
return $encrypted;    
}else{       
 //解密        
 $decrypted = openssl_decrypt($data, $encryptMethod, $key, 0, $iv);        
 return $decrypted;    
 }
}//使用方法
echo $a=openssl_crypt('我爱北京天安门 /我爱祖国',1,'passG506'); //加密 
LMcwSGlTFijXRdcPaccYoc08xgr7NydtZ+Wrhdv/145gF3/ayKQCJvRLmvhs5ec8echo "<br>";
echo openssl_crypt($a,0,&#39;passG506&#39;,$_SESSION[&#39;iv&#39;]); //解密 我爱北京天安门 /我爱祖国

Hinweis: 1. Warum wird iv generiert und welche Rolle spielt iv

[

Wenn man auf die von openssl_get_cipher_methods() zurückgegebene Liste der Verschlüsselungsalgorithmen zurückblickt, gibt es viele Namen mit dem Wort „CBC“ in der Mitte. Diese Verschlüsselungsalgorithmen verwenden denselben Verschlüsselungsmodus ist der Chiffrierblockverkettungsmodus (Cipher Block Chaining).

Im Verschlüsselungsalgorithmus im CBC-Modus wird der Klartext in mehrere Gruppen unterteilt und gruppenweise verschlüsselt. Der Verschlüsselungsprozess jeder Gruppe hängt von den Daten der vorherigen Gruppe ab: Er muss mit den Daten der vorherigen Gruppe XOR-verknüpft werden, um den Chiffretext dieser Gruppe zu generieren. Auf wen verlässt sich die erste Gruppe? Es hängt von der IV ab, daher wird die IV als Initialisierungsvektor bezeichnet. IV ist die Abkürzung für Initialisierungsvektor

IV sollte zufällig generiert werden, daher verwendet der Code openssl_random_pseudo_bytes(), um IV zu generieren. Diese Funktion empfängt einen int, der die Länge des IV darstellt, der generiert werden muss.
IV-Länge variiert je nach Verschlüsselungsalgorithmus. Die meisten Menschen können sich nicht an die IV-Längen erinnern, die für so viele Algorithmen erforderlich sind. Verwenden Sie also direkt die Funktion openssl_cipher_iv_length(). Diese Funktion gibt einen int zurück, der die vom Verschlüsselungsalgorithmus benötigte IV-Länge angibt:

echo openssl_cipher_iv_length(&#39;AES-256-CBC&#39;); // 16
echo openssl_cipher_iv_length(&#39;BC-CBC&#39;); // 8
echo openssl_cipher_iv_length(&#39;AES-128-ECB&#39;); // 0

Zum Beispiel erfordert AES-256-CBC ein 16-Bit IV, BC-CBC erfordert 8-Bit-IV, aber AES-128-ECB erfordert keine IV, daher wird 0 zurückgegeben.

2. Probleme, auf die bei der Verwendung geachtet werden muss

Bei der Durchführung der Verschlüsselung und Entschlüsselung gelten mit Ausnahme des ersten Parameters die anderen Parameter der beiden Funktionen Nur wenn sie gleich sind, kann die Entschlüsselung erfolgreich sein. Wenn Sie schließlich einen Verschlüsselungsalgorithmus verwenden, der einen IV erfordert, müssen Sie Folgendes beachten:
Der Parameter $iv muss übergeben werden, sonst gibt PHP eine Warnung aus.
IV sollte zufällig generiert werden (z. B. mit openssl_random_pseudo_bytes() ), Es kann nicht künstlich festgelegt werden
Der IV sollte für jede Verschlüsselung neu generiert werden. Seien Sie nicht faul und verwenden Sie den gleichen IV für mehrere Verschlüsselungen
Der IV muss mit dem Chiffretext gespeichert werden (andernfalls ist dies nicht möglich). Es kann direkt an den Chiffretext angehängt werden. Sie können es auch separat speichern.

Wenn Sie es nicht verstehen, können Sie sich auf die symmetrische Verschlüsselung beziehen

zwei asymmetrische Verschlüsselung

Die häufig verwendete asymmetrische Verschlüsselung ist der RSA-Algorithmus. Bei der asymmetrischen Verschlüsselung und Entschlüsselung werden unterschiedliche Schlüssel verwendet, von denen einer als öffentlicher Schlüssel öffentlich ist und der andere nur dem privaten Eigentümer gehört privater Schlüssel.

Mit einem privaten Schlüssel verschlüsselte Informationen können nur mit dem öffentlichen Schlüssel entschlüsselt werden, oder umgekehrt können mit einem öffentlichen Schlüssel verschlüsselte Informationen nur mit dem privaten Schlüssel entschlüsselt werden.

Vor der RSA-Verschlüsselung und -Entschlüsselung müssen Sie ein Paar öffentlicher und privater Schlüssel generieren. Sie können auch das mit Linux gelieferte RSA-Schlüsselgenerierungstool openssl verwenden Verwenden Sie die PHP-OpenSSL-Erweiterungsfunktion, um ein Paar öffentlicher und privater Schlüssel zu generieren.

Siehe: Asymmetrische RSA-Verschlüsselung

Hinweis: Der Nachteil der asymmetrischen Verschlüsselung besteht darin, dass Vertraulichkeit und Entschlüsselung lange dauern und langsam sind und sich nur für die Verschlüsselung kleiner Datenmengen eignen .

Wenn Sie eine schnelle Verschlüsselungsgeschwindigkeit wünschen, aber auch sicherstellen möchten, dass die Daten sicherer als die symmetrische Verschlüsselung sind, können Sie die Hybridverschlüsselung verwenden. (Das heißt, führen Sie eine symmetrische Verschlüsselung der Daten und eine asymmetrische Verschlüsselung des Schlüssels durch.)

Verwenden Sie beim Entschlüsseln zuerst die asymmetrische Verschlüsselung, um den Schlüssel zu erhalten, und verwenden Sie dann den Schlüssel, um den Chiffretext zu entschlüsseln, um den Klartext zu erhalten.

Verwandte Empfehlungen:

Wie PHP benutzerdefinierte Schlüssel zum Ver- und Entschlüsseln von Daten verwendet

MySQL-Funktionen zur Ver- und Entschlüsselung

Teilen des Implementierungsprozesses der PHP-String-Verschlüsselung und -Entschlüsselung

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der PHP-Verschlüsselung und -Entschlü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