ホームページ  >  記事  >  バックエンド開発  >  PHPの対称暗号化機能でデータの暗号化と復号化を実現

PHPの対称暗号化機能でデータの暗号化と復号化を実現

高洛峰
高洛峰オリジナル
2017-01-07 16:32:432292ブラウズ

プロジェクト内で、ユーザー 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));
 }
}
rreee

以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。

データの暗号化と復号化を実現するためのPHP対称暗号化機能に関連するその他の記事については、PHP中国語Webサイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。