はじめに
インターネットの発展の歴史において、セキュリティは常に開発者が非常に重視するテーマであり、データ送信のセキュリティを実現するには、データ ソース (リクエストの偽造ではない)、データの整合性を確保する必要があります。 (変更されていない)、データプライバシー(暗号化されたテキスト、直接読み取ることはできません)など。 SSL/TLS プロトコルによって実装された HTTPS プロトコルはすでに存在しますが、これはクライアント上のブラウザの適切な実装に依存しており、非常に非効率であるため、一般的な機密データ (トランザクションの支払い情報など) を依然として必要とします。暗号化方式を使用して手動で暗号化します。
一般の WEB 開発者は、基盤となるセキュリティ関連テクノロジーの一部を深く理解する必要はありませんが、暗号化の基本を学び、既存の暗号化関連ツールを使用することは非常に必要です。仕事の都合上、暗号化関連の記事をいくつか読み、自分の経験に基づいてこの記事を完成させました。
暗号化の基本
暗号化の使用方法を学ぶ前に、暗号化に関連する基本的な知識を理解する必要があります。
暗号化アルゴリズムは、一般的に対称暗号化アルゴリズムと非対称暗号化アルゴリズムの 2 種類に分類されます。
対称暗号化
対称暗号化アルゴリズムでは、メッセージの送信者と受信者が同じキーを使用してファイルを暗号化し、受信者が同じキーを使用して復号化して情報を取得します。一般的な対称暗号化アルゴリズムは、des/aes/3des です。対称暗号化アルゴリズムの特徴は次のとおりです。高速で、暗号化の前後でファイル サイズがあまり変化しませんが、送信者と暗号化が行われるため、キーの保存が大きな問題となります。メッセージの受信者は、一方の当事者のキーが失われると、情報送信が安全でなくなる可能性があります。
非対称暗号化
対称暗号化の反対は、非対称暗号化の基本的な考え方で、公開鍵と秘密鍵に分けられた相対的な鍵のペアを使用することです。が公開されます。公開キーと秘密キーはペアであり、公開キーがデータの暗号化に使用される場合、対応する秘密キーのみを使用してデータを暗号化できます。を使用して復号化できます。送信する前に、受信者の公開キーを使用してデータを暗号化するだけです。一般的な非対称暗号化アルゴリズムには RSA/DSA が含まれます。
非対称暗号化には鍵の保管の問題はありませんが、大量の計算が必要となり、暗号化速度が非常に遅くなります。場合によっては、大量のデータをブロック単位で暗号化する必要があります。
デジタル署名
データの完全性を保証するために、ハッシュ関数を通じてハッシュ値を計算する必要があります。このハッシュ値はデジタル署名と呼ばれます。その特徴は次のとおりです:
•元のデータがどれほど大きくても、結果の長さは同じです
•入力は同じであり、出力も同じです•入力への小さな変更は大きな変化を引き起こします。結果では;
•暗号化プロセスは不可逆的であり、ハッシュ値から元のデータを取得することはできません。
一般的なデジタル署名アルゴリズムには、md5、hash1、およびその他のアルゴリズムが含まれます。
PHP の openssl 拡張機能
openssl 拡張機能は、暗号化と復号化に関連する複数の PHP 関数をカプセル化する openssl 暗号化拡張機能パッケージを使用しており、データの暗号化と復号化が大幅に容易になります。 一般的に使用される関数は次のとおりです:
対称暗号化関連:
string openssl_encrypt (string $data, string $method, string $password)
$data は暗号化されるデータ、$method は暗号化に使用されるメソッドです、 $password は使用されるキーであり、関数は暗号化されたデータを返します。 $method リストは openssl_get_cipher_methods() を使用して取得できます。 $method リストは次の形式になります。
Array( 0 => aes-128-cbc, // aes加密 1 => des-ecb, // des加密 2 => des-ede3, // 3des加密 ... )
復号化関数は string openssl_encrypt (string $data、string $method、string $password) です
非対称暗号化関連:
openssl_get_publickey();openssl_pkey_get_public(); // 从证书导出公匙; openssl_get_privatekey();openssl_pkey_get_private(); // 从证书导出私匙;
それらはすべて、証明書ファイル (通常は .pem ファイル) を渡すだけで済みます。
openssl_public_encrypt(string $data , string &$crypted , mixed $key [, int $padding = OPENSSL\_PKCS1\_PADDING ] )
公開鍵を使用してデータを暗号化します。$data は暗号化されるデータです。$crypted は参照変数であり、暗号化されたデータはこの変数に入れられます。 ; 暗号化されたデータがグループ化される場合、暗号化ビット数はビットの整数倍であるため、$padding が必要です。$padding のオプションは、それぞれ PKCS1 パディングまたはパディングなしです。 ;
このメソッドの逆も可能です (パラメーターは一貫しています):
openssl_private_encrypt(); // 使用私匙加密; openssl_private_decrypt(); // 使用私匙解密; openssl_private_decrypt(); // 使用公匙解密;
署名関数と署名検証関数もあります:
bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] ) int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
署名関数: $data は署名されるデータです。署名結果の変数; $priv_key_id は署名に使用される秘密鍵です; $signature_alg 署名に使用されるアルゴリズムです。アルゴリズムのリストは、openssl_get_md_methods () の形式で取得できます。関数: 秘密鍵に対応する公開鍵を渡す必要があることを除いて、署名関数とは反対です。結果は署名検証結果です。1 は成功を意味し、0 は失敗を意味し、-1 はエラーを意味します。例
以下は非対称暗号化の小さな例です:
array( 0 => MD5, 1 => SHA1, 2 => SHA256, ... )
対称暗号化は非常に簡単です。ssl_encrypt() を直接使用します。関数を使用するだけです。
もちろん、インターフェイスによっては、暗号化方法に異なる要件がある場合があります。パディング、暗号化ブロック サイズなど、ユーザーが自分で調整する必要があります。
データは HTTP プロトコル上で処理されるため、データの暗号化が完了した後、基盤となる送信を考慮する必要がなく、インターフェイスに直接リクエストできます。 。
結論
暗号化は、難しい理論と多くの概念を伴う非常に高度な主題です。WEB 開発者として、その基礎となる実装を学ぶ必要はありませんが、カプセル化されたメソッドの使用を学ぶことは開発にとって非常に有益です。基本的な実装を理解するだけでも、アルゴリズムなどについて新たな理解を得ることができます。
PHP の openssl 暗号化拡張機能の使用に関する上記の概要 (推奨) は、編集者によって共有されたすべての内容です。参考にしていただければ幸いです。また、PHP 中国語 Web サイトをサポートしていただければ幸いです。
PHP openssl 暗号化拡張機能の使用概要 (推奨) の詳細については、PHP 中国語 Web サイトに注目してください。