> 백엔드 개발 > PHP 튜토리얼 > 데이터 암호화 및 복호화를 구현하는 PHP 대칭 암호화 기능에 대한 자세한 설명

데이터 암호화 및 복호화를 구현하는 PHP 대칭 암호화 기능에 대한 자세한 설명

墨辰丷
풀어 주다: 2023-03-28 15:36:02
원래의
2488명이 탐색했습니다.

이 글에서는 데이터 암호화 및 복호화를 구현하기 위한 PHP의 간단한 대칭 암호화 기능을 자세히 소개합니다. 또한 필요한 경우 대칭 암호화 및 비대칭 암호화에 대해서도 자세히 알아볼 수 있습니다.

프로젝트에는 사용자 ID를 암호화하고 해독을 위해 다음 연락처로 전송해야 하는 곳이 있습니다. (너무 많이 공개하지 못한 점 양해해주세요 -_-!) 가장 먼저 떠오른 것이 Kangsheng Ucenter의 함수였는데, 나중에 Concise Magic에서 검색하다가 간단한 방법을 발견해서 여러분이 사용하는 함수 형태로 통합시켰습니다.

1. 대칭 암호화

발신자는 키와 알고리즘을 사용하여 일반 텍스트를 암호문으로 처리하고 수신자는 키와 알고리즘을 사용하여 암호문을 일반 텍스트로 처리합니다. 동일한 키 쌍. 데이터가 암호화되고 해독됩니다.

암호화와 복호화에는 동일한 키를 사용하기 때문에 보안은 알고리즘뿐만 아니라 키의 보안도 매우 중요합니다.

물론 키가 복잡할수록 좋다는 것은 아닙니다. 반대로 키가 클수록 암호화는 강력해지지만 암호화 및 암호 해독 프로세스는 느려지므로 일반적으로 키가 더 작습니다. 키의 크기는 보안을 고려해야 하며 효율성도 고려해야 합니다.

결국 대칭암호 알고리즘의 특징은 알고리즘이 공개되어 있고, 계산량이 적고, 암호화 속도가 빠르고, 암호화 효율성이 높다는 점입니다. 효율성이 높다는 장점이 없으면 더 좋습니다. 비대칭 암호화를 직접 사용합니다.

또한 각 쌍의 사용자가 대칭 암호화 알고리즘을 사용할 때마다 상대방이 알 수 없는 고유 키를 사용해야 합니다. 이로 인해 발신자와 수신자 모두가 소유한 키 수가 기하급수적으로 증가하게 됩니다. 키 관리는 사용자의 책임이 됩니다.

대칭 암호화 알고리즘은 주로 키 관리가 어렵고 사용 비용이 높기 때문에 분산 네트워크 시스템에서 사용하기가 더 어렵습니다.

2. 비대칭 암호화

비대칭 암호화는 암호화 및 복호화에 각각 공개 키와 개인 키 쌍을 사용하여 비교적 안전합니다. 개인키는 한 사람만이 안전하게 보관할 수 있고 유출될 수 없으며, 공개키는 요청하는 사람 누구에게나 전송될 수 있습니다.

가장 일반적인 비대칭 암호화는 은행 시스템과 결제 플랫폼입니다. 예를 들어 Alipay 또는 UnionPay 결제 인터페이스를 신청하면 공개 키를 받게 되며, 쇼핑몰에서 결제할 때 공개 키를 사용하여 정보를 암호화하고 플랫폼에 제출합니다. 귀하의 정보를 해독하고 결제 작업을 수행합니다.

비대칭 암호화는 매우 안전하지만 대칭 암호화에 비해 속도가 매우 느립니다. 따라서 일반적으로 우리가 처리할 때 메시지를 전송할 때 대칭 암호화를 사용하지만 대칭 암호화에 사용되는 키를 사용하는 경우도 있습니다. 암호화된 방식으로 보내세요. 신청한 결제 인터페이스를 다시 생각해 보세요. 키 한 쌍을 받았나요? ^.^

3. 조합하여 사용하세요

대칭 암호화는 속도가 빠르고 대용량 데이터를 전송할 때 더 좋습니다. 비대칭 암호화 암호화 및 복호화는 시간이 오래 걸리고 속도가 느리며, 소량의 데이터를 암호화하는 데에만 적합합니다. 그러나 비대칭 암호화의 보안성은 매우 높습니다.

강점을 활용하고 약점을 피하세요. 비대칭 암호화 공개 키를 사용하여 대칭 암호화 키를 암호화한 후 이를 전송합니다. 수신자는 개인 키를 사용하여 해독하여 대칭 암호화 키를 얻습니다. 그러면 양측 모두 대칭 암호화를 사용할 수 있습니다. 의사소통하기.

프로젝트에 사용된 방법은 공개해서는 안 되지만 여기에는 다른 두 가지 예만 나열되어 있습니다. 첫 번째는 ucenter에서 나온 것이고, 두 번째는 Concise Magic에서 본 것입니다.

base64 알고리즘이므로 암호화된 문자열에 + 가 포함될 수 있으므로, URL에 사용하면 비우호적이므로 외부에서 제거하거나 메소드 변경, 정기 검증 및 재귀를 통해 제거할 수 있습니다.

/**
 * 字符串加密以及解密函数
 * @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));
 }
}
로그인 후 복사

위 내용은 이 글의 전체 내용이므로, 여러분의 공부에 도움이 되길 바랍니다.


관련 권장 사항:

PHP로 구현된 Redis 다중 라이브러리 선택 기능 싱글턴 클래스(자세한 ​​설명)

PHP 전략 패턴 정의 및 사용법(자세한 설명)

PHP 사용자 정의 함수 Get/Post/Ajax

제출 방법에 대한 자세한 설명

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿