>백엔드 개발 >PHP 튜토리얼 >PHP 암호화 및 복호화에 대한 자세한 설명

PHP 암호화 및 복호화에 대한 자세한 설명

小云云
小云云원래의
2018-05-11 15:26:426602검색

당신이 PHP 암호화 및 복호화에 대해 얼마나 알고 있는지 모르겠습니다. 이 기사에서는 주로 PHP 암호화 및 복호화에 대한 지식을 공유하여 도움이 되기를 바랍니다.

대칭 암호화

1. 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欢迎您

참고: 이 방법은 php7.1부터 폐기되었으며, openssl_encrypt 및 openssl_decrypt는 암호화 및 암호화에 openssl 계열을 사용하는 것입니다. decryption

2.OpenSSL 확장

/** 
* @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;]); //解密 我爱北京天安门 /我爱祖国

의 대칭 암호화 참고: 1. iv를 생성해야 하는 이유, iv

의 역할은 무엇입니까

openssl_get_cipher_methods()에서 반환된 암호화 알고리즘 목록을 검토하세요. 중간에 "CBC"라는 단어가 있는 이름을 사용하는 암호화 알고리즘은 동일한 암호화 모드인 Cipher Block Chaining을 사용합니다.

CBC 모드 암호화 알고리즘에서는 일반 텍스트가 여러 그룹으로 나뉘어 그룹으로 암호화됩니다. 각 그룹의 암호화 프로세스는 이전 그룹의 데이터에 따라 다릅니다. 이 그룹의 암호문을 생성하려면 이전 그룹의 데이터와 XOR되어야 합니다. 그렇다면 첫 번째 그룹은 누구에게 의존합니까? 이는 IV에 따라 다르므로 IV를 초기화 벡터라고 합니다. IV는 초기화 벡터의 약자입니다

IV는 무작위로 생성되어야 하므로 코드에서는 openssl_random_pseudo_bytes()를 사용하여 IV를 생성합니다. 이 함수는 생성해야 하는 IV의 길이를 나타내는 int를 받습니다.
IV 길이는 암호화 알고리즘에 따라 다릅니다. 대부분의 사람들은 수많은 알고리즘에 필요한 IV 길이를 기억하지 못합니다. 따라서 openssl_cipher_iv_length() 함수를 직접 사용하세요. 이 함수는 암호화 알고리즘에 필요한 IV 길이를 나타내는 int를 반환합니다.

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

예를 들어 AES-256-CBC에는 16비트 IV가 필요하고 BC-CBC에는 8이 필요합니다. -bit IV 및 AES- 128-ECB에는 IV가 필요하지 않으므로 0이 반환됩니다.

2. 사용 시 주의해야 할 사항

암호화 및 복호화 수행 시 두 함수 중 첫 번째 매개변수를 제외하고 나머지 매개변수는 동일해야 원활한 복호화가 가능합니다. 마지막으로 IV가 필요한 암호화 알고리즘을 사용하는 경우 다음 사항에 주의해야 합니다.
$iv 매개변수를 전달해야 합니다. 그렇지 않으면 PHP에서 경고가 발생합니다.
IV는 무작위로 생성되어야 합니다(예: openssl_random_pseudo_bytes() ) 및 수동으로 설정할 수 없습니다.
IV는 암호화할 때마다 다시 생성해야 합니다. 게으르지 말고 여러 암호화에 동일한 IV를 사용하세요.
IV는 암호문과 함께 저장되어야 합니다(그렇지 않으면 해독되지 않습니다).

이해가 안되면 대칭암호를 참고하시면 됩니다

제2비대칭암호

일반적으로 사용되는 비대칭암호는 RSA알고리즘과 복호화는 다른 키를 사용하는데, 그 중 하나는 공개 키로 외부에 공개되며 다른 하나는 개인 소유자만 소유하며 개인 키 역할을 합니다.

개인키로 암호화된 정보는 공개키로만 복호화할 수 있고, 반대로 공개키로 암호화한 정보는 개인키로만 복호화할 수 있습니다.

RSA 암호화 및 암호 해독 전에 공개 키와 개인 키 쌍을 생성해야 합니다. Linux와 함께 제공되는 RSA 키 생성 도구 openssl을 사용하여 공개 키와 개인 키 쌍을 얻을 수도 있습니다. 공개 키와 개인 키 쌍을 생성하는 확장 함수입니다.

참조: RSA 비대칭 암호화

참고: 비대칭 암호화의 단점은 기밀 유지 및 복호화에 시간이 오래 걸리고 느리며 소량의 데이터를 암호화하는 데만 적합하다는 것입니다.

빠른 암호화 속도를 원하지만 대칭 암호화보다 데이터의 보안도 강화하고 싶다면 하이브리드 암호화를 사용할 수 있습니다. (즉, 데이터에는 대칭 암호화를, 키에는 비대칭 암호화를 수행합니다.)

복호화할 때는 먼저 비대칭 암호화를 사용하여 키를 얻은 다음, 그 키를 사용하여 암호문을 복호화하여 평문을 얻습니다.

관련 권장 사항:

PHP가 사용자 정의 키를 사용하여 데이터 암호화 및 암호 해독 방법을 구현하는 방법

암호화 및 암호 해독에 대한 mysql 기능

PHP 문자열 암호화 및 암호 해독 구현 프로세스 공유

위 내용은 PHP 암호화 및 복호화에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.