それでは、ハッシュクラス暗号化とは何か違うのでしょうか?ハッシュ型暗号化は一方向の不可逆暗号化です。暗号化されたコンテンツは 16 進数のハッシュ文字列です。平文コンテンツを元に戻すにはレインボー テーブルのみを使用できるため、ソルト値または複数セットの 2 層暗号化を追加する限り、それをリバースエンジニアリングするのは非常に困難です。したがって、ユーザーのパスワードを保存するには通常、ハッシュ暗号化が使用され、データベースからユーザーのパスワードが漏洩した場合でも安全です。 OpenSSL の対称/非対称暗号化タイプでは、特定のキーワードまたは証明書を使用して、順方向の暗号化と逆方向の復号化を実行できます。オリジナルのテキスト
が利用可能です。次に、対称暗号化と非対称暗号化について詳しく説明します。
対称暗号化と非対称暗号化とは
対称暗号化は通常、キーを使用して元のテキストを暗号化します。言い換えれば、サーバー、クライアント、その他のピアのいずれであっても、両者が通信する場合、送信する暗号化されたコンテンツは暗号化/復号化操作に同じキーを使用する必要があります。両端はそのようなキーを同時に保存する必要があります。皆さんも思ったことがあると思いますが、今はWeb開発でもアプリ開発でも、コードを逆コンパイルしてソースコードを見ることができます。対称暗号化を使用すると、キーを簡単に取得できます。ただし、対称暗号化の利点は、非常に高速でリソースを消費しないことです。
非対称暗号化では、両端で異なるキーが保持されます。私たちが目にする最も一般的な https 証明書と同様に、公開キーと秘密キーという 2 つの概念があります。通常、暗号化には公開鍵を使用し、復号には秘密鍵を使用しますが、通常、公開鍵は公開して相手に送り、秘密鍵はここで保管します。つまり、相手が私たちにデータを送信するとき、相手は私たちが渡した公開鍵を使用してデータを暗号化します。私たちがデータを復号化するための秘密鍵を他の人が持っていないため、送信プロセス中のデータは非常に安全です。データを受信したら、独自の秘密キーを使用して復号化し、元のデータを取得します。両側のキーの内容は同じではないため、非対称暗号化は対称暗号化よりもはるかに安全です。非対称暗号化は対称暗号化に比べてアルゴリズムや複雑さが数段高いものの、対称暗号化の利点に比べて、特にデータ量が多い場合には速度やパフォーマンスがボトルネックとなっています。 。さらに、非対称暗号化の数学的原理は、大きな数値を分解するのが難しい、つまり、数値が大きくなるほど因数分解が難しくなるということです。アルゴリズムが短時間でこの問題を解決できれば、おめでとうございます。それは最新の暗号化アルゴリズムの基礎です。天井はあなたによって破られました。
対称暗号化で一般的に使用されるアルゴリズムには、AES、DES、3DES、IDEA、RC2、RC5 などがあります。より一般的に使用されるアルゴリズムは、AES と DES です。
非対称暗号化に一般的に使用されるアルゴリズムには、RSA、Elgamal、ECC などがあります。RSA は非常に一般的に使用されており、一般的です。SSL および一部の証明書アルゴリズムは RSA に基づいています。
システムセキュリティのために何をすべきでしょうか?
では、これら 2 つの暗号化機能を妥協して使用する方法はあるのでしょうか?もちろん、デジタル エンベロープという非常に古典的なテクノロジもあります。
実際、その意味は非常に単純で、これら 2 つの暗号化方式のそれぞれの利点を活用するということです。非対称暗号化は安全性は高いですが速度が遅く、データ量が大きくなると速度も遅くなりますので、対称暗号化の鍵を暗号化するために使用します。通常、この鍵はそれほど大きくありません。次に、実際のデータ エンティティは、この対称的に暗号化されたキーを使用して対称暗号化を実行し、速度を向上させます。このように、クライアントに送信すると、非対称暗号化を使用して暗号化されたキーと、対称暗号化を使用して暗号化されたデータ コンテンツの 2 つのコンテンツが含まれます。クライアントは情報を取得した後、まず非対称暗号化キーを使用して対称暗号化キーを復号化し、次にこのキーを使用して最終的なデータ コンテンツを復号化します。混乱していますか?写真で見てみましょう。おそらく誰もが一目でそれを理解できるでしょう。
公開鍵と秘密鍵については説明の必要はありません。セッション キーは、対称暗号化アルゴリズムのキーです。デジタルエンベロープの送信プロセスに関する上記の説明と組み合わせると、誰でも理解できるはずです。
OpenSSL 拡張対称暗号化
さて、理論的な知識をたくさん紹介しましたが、本題に戻りましょう。PHP で対称暗号化と非対称暗号化を実装するにはどうすればよいでしょうか? Woolen布?これは非常に簡単で、OpenSSL 拡張機能を使用するだけです。この拡張機能は PHP ソース コードとともにリリースされており、コンパイルおよびインストール時に --with-openssl を追加するだけです。もちろん、システム環境に OpenSSL ソフトウェアがインストールされている必要がありますが、基本的にはすでにさまざまなオペレーティング システムで利用可能です。最も簡単な方法は、オペレーティング システムのコマンド ラインに openssl コマンドがあるかどうかを確認して、OpenSSL 関連ソフトウェアが現在のシステムにインストールされているかどうかを確認することです。
[root@localhost ~]# openssl version OpenSSL 1.1.1 FIPS 11 Sep 2018
今日は対称暗号に関する比較的単純な関数を中心に勉強します。
対称暗号化/復号化の実装
$data = '测试对称加密'; $key = '加密用的key'; $algorithm = 'DES-EDE-CFB'; $ivlen = openssl_cipher_iv_length($algorithm); $iv = openssl_random_pseudo_bytes($ivlen); $password = openssl_encrypt($data, $algorithm, $key, 0, $iv); echo $password, PHP_EOL; // 4PvOc75QkIJ184/RULdOTeO8 echo openssl_decrypt($password, $algorithm, $key, 0, $iv), PHP_EOL; // 测试对称加密 // Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended
openssl_encrypt() はデータを暗号化するためのものです。元のテキスト、アルゴリズム、キーの 3 つのパラメータが必要です。後者のパラメータはオプションですが、現在は推奨されています。 iv (ベクトル) パラメータを定義するため、iv パラメータがない場合は警告メッセージが報告されます。 openssl_cipher_iv_length() を使用して現在のアルゴリズムに必要な iv 長を取得し、openssl_random_pseudo_bytes() 関数を使用してアルゴリズムの長さに一致するランダムな iv コンテンツを生成します。
中央の 0 パラメータは、指定されたタグのビット単位の OR 値です。これには、OPENSSL_RAW_DATA と OPENSSL_ZERO_PADDING という 2 つのオプションの定数があります。OPENSSL_RAW_DATA に設定すると、暗号化されたデータがそのまま返されます (バイナリ化されたコンテンツ) OPENSSL_ZERO_PADDING に設定すると、暗号化されたデータが Base64 以降のコンテンツとして返されます。
openssl_decrypt() はデータの復号化に使用されます。必要なパラメータは、元のデータが暗号化されたデータに置き換えられることを除いて、基本的に暗号化関数と同じです。
対称暗号化には、AEAD 暗号モード (GCM または CCM) もあり、このモードのアルゴリズムを使用する場合は、もう 1 つのパラメーターが必要です。
$algorithm = 'aes-128-gcm'; $password = openssl_encrypt($data, $algorithm, $key, 0, $iv, $tags); echo $password, PHP_EOL; // dPYsR+sdP56rQ99CNxciah+N echo openssl_decrypt($password, $algorithm, $key, 0, $iv, $tags), PHP_EOL; // 测试对称加密
この $tags は参照型パラメータです。つまり、暗号化後にこの変数に割り当てられます。復号化時にも同じ検証タグが必要です。
暗号化および復号化プロセスの観点から、この情報をデータベースに保存したい場合、または送信および復号化する場合には、少なくともこれらのフィールド、暗号化に使用された iv、および暗号化アルゴリズムに使用される iv、および AEAD モードでの暗号化に使用される検証タグ。そうしないと、データを復号化できません。
対称暗号化アルゴリズムクエリ
print_r(openssl_get_cipher_methods()); // Array // ( // [0] => AES-128-CBC // [1] => AES-128-CBC-HMAC-SHA1 // [2] => AES-128-CFB // [3] => AES-128-CFB1 // [4] => AES-128-CFB8 // [5] => AES-128-CTR // [6] => AES-128-ECB // [7] => AES-128-OFB // [8] => AES-128-XTS // [9] => AES-192-CBC // [10] => AES-192-CFB // [11] => AES-192-CFB1 // [12] => AES-192-CFB8 // …… // )
上記の暗号化/復号化テストで選択されたアルゴリズムを検索し、現在の環境でサポートされているすべてのアルゴリズムのリストを表示します。
概要
この記事の内容には多くの理論的な知識が含まれており、誰もがそれを理解する必要があります。 OpenSSL を使用した暗号化/復号化関数の実装は、実際には比較的簡単です。結局のところ、すべてがカプセル化されているため、ドキュメントに従って関数を呼び出すだけです。学習には依然として理論と実践を組み合わせることが必要ですが、もちろん、より重要なことは自分でやってみることです。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84OpenSSL%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86.php
推奨学習:php ビデオ チュートリアル