データの暗号化と復号化を実現するPHP対称暗号化機能の詳細説明

墨辰丷
リリース: 2023-03-28 15:36:02
オリジナル
2447 人が閲覧しました

この記事では、データの暗号化と復号化を実装するための PHP の単純な対称暗号化関数について詳しく説明します。必要に応じて、対称暗号化と非対称暗号化についても詳しく説明します。

プロジェクト内で、ユーザー ID を暗号化し、復号化のために次の連絡先に送信する必要がある箇所があります。 (あまり明かさないでごめんなさい -_-!) 最初に思いついたのは、Kangsheng Ucenter の関数でした。その後、検索して Concise Magic に簡単なメソッドを見つけたので、それを使用するフォーム関数に統合しました。

1. 対称暗号化

送信者は鍵とアルゴリズムを使用して平文を暗号文に変換し、受信者はその鍵とアルゴリズムを使用して暗号文を平文に変換します。同じキーペアでデータが暗号化および復号化されます。

暗号化と復号化に同じキーが使用されるため、セキュリティはアルゴリズムに関連するだけでなく、キーのセキュリティも非常に重要です。

もちろん、キーが複雑であればあるほど良いというわけではありません。逆に、キーが大きいほど暗号化は強力になりますが、暗号化と復号化のプロセスは遅くなります。キーのサイズは、セキュリティと効率を考慮する必要があります。

結局のところ、対称暗号アルゴリズムの特徴は、アルゴリズムが公開されており、計算量が少なく、暗号化速度が速く、暗号化効率が高いという利点がなければ、暗号化効率が高い方が良いです。非対称暗号化を直接使用します。

さらに、ペアのユーザーが対称暗号化アルゴリズムを使用するたびに、相手が知らない一意のキーを使用する必要があるため、送信者と受信者の両方が所有するキーの数が飛躍的に増加します。鍵の管理はユーザーの責任となります。

対称暗号化アルゴリズムは、主に鍵管理が難しく、使用コストが高いため、分散ネットワーク システムで使用するのがより困難です。

2. 非対称暗号化

非対称暗号化は、暗号化と復号化にそれぞれ公開鍵と秘密鍵のペアを使用し、比較的安全です。秘密キーは一方の当事者のみが安全に保管でき、漏洩することはありませんが、公開キーは要求した人に送信できます。

最も一般的な非対称暗号化は、銀行システムと支払いプラットフォームです。たとえば、Alipay または UnionPay の支払いインターフェイスを申請すると、モールで支払いを行うときに公開キーを取得し、その公開キーを使用して情報を暗号化し、プラットフォームに送信します。お客様の情報を復号化し、支払い操作を実行するため。

非対称暗号化は非常に安全ですが、対称暗号化に比べて非常に遅いため、通常、非対称暗号化を扱うときはメッセージの送信に対称暗号化を使用しますが、対称暗号化で使用される鍵を使用することもできます。暗号化して送信してください。申請した支払いインターフェイスでキーが提供されましたか? ^.^

3. 組み合わせて使用​​します

対称暗号化は高速であり、大量のデータを送信する場合に適しています。非対称暗号化は暗号化と復号化に時間がかかり、低速であるため、少量のデータの暗号化にのみ適していますが、非対称暗号化の安全性は非常に高いです。

長所を生かして短所を回避する: 対称暗号化キーを非対称暗号化公開キーを使用して暗号化し、送信します。受信者は秘密キーを使用して復号し、対称暗号化キーを取得します。その後、双方が対称暗号化キーを使用できます。コミュニケーションをとること。

プロジェクトで使用されたメソッドは公開されるべきではありませんが、ここでは他の 2 つの例のみがリストされています。 1 つ目は ucenter からのもので、2 つ目は 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));
 }
}
ログイン後にコピー

以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。


関連する推奨事項:

Redis マルチデータベース選択関数 PHP で実装されたシングルトン クラス (詳細な説明)

PHP 戦略パターンの定義と使用法 (詳細な説明)

PHP カスタム関数Get/Post/AjaxのSubmitメソッドの詳細説明

以上がデータの暗号化と復号化を実現するPHP対称暗号化機能の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート