この記事では主に PHP の openssl 暗号化拡張機能の使用方法について概要を紹介します。興味のある方はぜひ参考にしてください。
はじめに
インターネットの発展の歴史において、セキュリティは常に開発者が非常に重要視するテーマでした。 データ送信のセキュリティを実現するには、以下を確保する必要があります。偽造されたリクエスト)、データの整合性(変更されていない)、データのプライバシー(暗号化されたテキスト、直接読み取ることはできません)など。 SSL/TLS プロトコルによって実装された HTTPS プロトコルはすでに存在しますが、これはクライアント上のブラウザの適切な実装に依存しており、非常に非効率であるため、一般的な機密データ (トランザクションの支払い情報など) を依然として必要とします。暗号化方式を使用して手動で暗号化します。
一般の WEB 開発者は、基盤となるセキュリティ関連テクノロジーの一部を深く理解する必要はありませんが、暗号化の基本を学び、既存の暗号化関連ツールを使用することは非常に必要です。仕事の都合上、暗号化関連の記事をいくつか読み、自分の経験に基づいてこの記事を完成させました。
暗号化の基本
暗号化の使用方法を学ぶ前に、暗号化に関連する基本的な知識を理解する必要があります。
暗号化アルゴリズムは、一般的に対称暗号化アルゴリズムと非対称暗号化アルゴリズムの 2 種類に分類されます。
対称暗号化
対称暗号化アルゴリズムでは、メッセージの送信者と受信者が同じキーを使用し、送信者はそのキーを使用してファイルを暗号化し、受信者は同じキーを使用して復号化してファイルを取得します。情報。一般的な対称暗号化アルゴリズムは、des/aes/3des です。対称暗号化アルゴリズムの特徴は次のとおりです。高速で、暗号化の前後でファイル サイズがあまり変化しませんが、送信者と暗号化が行われるため、キーの保存が大きな問題となります。メッセージの受信者は、一方の当事者のキーが失われると、情報送信が安全でなくなる可能性があります。
非対称暗号化対称暗号化の反対は非対称暗号化です。非対称暗号化の基本的な考え方は、公開鍵と秘密鍵に分かれた相対鍵のペアを使用することです。安全に保管し、公開鍵を公開します。公開キーと秘密キーはペアであり、公開キーがデータの暗号化に使用される場合、対応する秘密キーのみを使用してデータを暗号化できます。を使用して復号化できます。送信する前に、受信者の公開キーを使用してデータを暗号化するだけです。一般的な非対称暗号化アルゴリズムには RSA/DSA が含まれます。
非対称暗号化には鍵の保管の問題はありませんが、大量の計算が必要となり、暗号化速度が非常に遅くなります。場合によっては、大量のデータをブロック単位で暗号化する必要があります。
デジタル署名 データの完全性を保証するために、ハッシュ関数を通じてハッシュ値を計算する必要があります。このハッシュ値はデジタル署名と呼ばれます。その特徴は次のとおりです:
•元のデータがどれほど大きくても、結果の長さは同じです
•入力は同じであり、出力も同じです•入力への小さな変更は大きな影響を及ぼします。結果の変更
•暗号化プロセスは不可逆的であり、ハッシュ値から元のデータを取得することはできません
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加密 ... )
エシムメトリック暗号化関連:
openssl_get_publickey();openssl_pkey_get_public(); // 从证书导出公匙; openssl_get_privatekey();openssl_pkey_get_private(); // 从证书导出私匙;
openssl_public_encrypt(string $data , string &$crypted , mixed $key [, int $padding = OPENSSL\_PKCS1\_PADDING ] )
公開キーを使用してデータを暗号化します。$data は暗号化されるデータであり、暗号化されたデータが格納されます。この変数に入力します。 $key は、暗号化されるデータです。 受信する公開鍵データ。暗号化されたデータは、暗号化ビットの正確な整数倍ではない可能性があるため、$padding のオプションには、それぞれ、OPENSSL_PKCS1_PADDING、OPENSSL_NO_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为要签名的数据;$signature为签名结果的引用变量;$priv_key_id为签名所使用的私匙;$signature_alg为签名要使用的算法,其算法列表可以使用<span style="font-family:NSimsun">openssl_get_md_methods ()</span>
得到,形如:
array( 0 => MD5, 1 => SHA1, 2 => SHA256, ... )
验签函数:与签名函数相对,只不过它要传入与私匙对应的公匙;其结果为签名验证结果,1为成功,0为失败,-1则表示错误;
加密实例
以下是一个非对称加密使用的小例子:
// 获取公匙 $pub_key = openssl_get_publickey('test.pem'); $encrypted = ''; // 对数据分块加密 for ($offset = 0, $length = strlen($raw_msg); $offset < $length; $offset += $key_size){ $encryptedBlock = ''; $data = substr($raw_msg, $offset, $key_size) if (!openssl_public_encrypt($data, $encryptedBlock, $pub_key, OPENSSL_PKCS1_PADDING)){ return ''; } else { $encrypted .= $encryptedBlock; } return $encrypted;
而对称加密就非常简单了,直接使用ssl_encrypt()函数即可;
当然一些接口可能会对加密方法进行不同的要求,如不同的padding,加密块大小等等,这些就需要使用者自己调整了。
因为我们是在HTTP协议之上处理的数据,所以数据加密完成后,就可以直接发送了,不用再考虑底层的传输,使用cURL或SOAP扩展方法,就可以直接请求接口啦。
结语
密码学是一个十分高深的学科,它理论艰深,概念繁多,作为一个WEB开发人员,虽然不需要我们去研究其底层实现,但是学会使用封装好的方法很有利于我们开发。甚至了解其基本实现,也可以触类旁通,对算法等有新的理解。
以上就是本篇文的全部内容,希望能对大家的学习有所帮助。
相关推荐:
以上がPHP openssl 暗号化拡張機能の使用の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。