ホームページ  >  記事  >  バックエンド開発  >  PHP openssl 暗号化拡張機能の使用の概要

PHP openssl 暗号化拡張機能の使用の概要

墨辰丷
墨辰丷オリジナル
2018-06-01 17:35:411431ブラウズ

この記事では主に PHP の openssl 暗号化拡張機能の使用方法について概要を紹介します。興味のある方はぜひ参考にしてください。

はじめに

インターネットの発展の歴史において、セキュリティは常に開発者が非常に重要視するテーマでした。 データ送信のセキュリティを実現するには、以下を確保する必要があります。偽造されたリクエスト)、データの整合性(変更されていない)、データのプライバシー(暗号化されたテキスト、直接読み取ることはできません)など。 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加密
  ...
  )
decryption関数は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 は暗号化されるデータであり、暗号化されたデータが格納されます。この変数に入力します。 $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(&#39;test.pem&#39;);

$encrypted = &#39;&#39;;
// 对数据分块加密
for ($offset = 0, $length = strlen($raw_msg); $offset < $length; $offset += $key_size){  
  $encryptedBlock = &#39;&#39;;
  $data = substr($raw_msg, $offset, $key_size)
  if (!openssl_public_encrypt($data, $encryptedBlock, $pub_key, OPENSSL_PKCS1_PADDING)){
    return &#39;&#39;;
  } else {
    $encrypted .= $encryptedBlock;
 }
 return $encrypted;

而对称加密就非常简单了,直接使用ssl_encrypt()函数即可;

当然一些接口可能会对加密方法进行不同的要求,如不同的padding,加密块大小等等,这些就需要使用者自己调整了。

因为我们是在HTTP协议之上处理的数据,所以数据加密完成后,就可以直接发送了,不用再考虑底层的传输,使用cURL或SOAP扩展方法,就可以直接请求接口啦。

结语

密码学是一个十分高深的学科,它理论艰深,概念繁多,作为一个WEB开发人员,虽然不需要我们去研究其底层实现,但是学会使用封装好的方法很有利于我们开发。甚至了解其基本实现,也可以触类旁通,对算法等有新的理解。

以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

php实现获取当前url地址的方法

php实现36进制与10进制转换功能的方法

PHP全功能无变形图片裁剪操作类与用法详解

以上がPHP openssl 暗号化拡張機能の使用の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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