この記事では、PHP で Sodium 暗号化拡張機能を使用する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
これは、この暗号化拡張シリーズの最後の記事であり、やりたいこと 最後に学ぶべき PHP 暗号化拡張機能。 Sodium の出現の目的は、元の暗号化拡張機能である Mcrypt を置き換えることでもあります。 Mcrypt は PHP7.2 以降削除され、PHP7.1 では廃止とマークされました。ただし、Sodium 拡張機能のアプリケーションはそれほど多くはなく、ほとんどの場合、OpenSSL を使用して暗号化操作を実行しますが、同時に Sodium 拡張機能は多くの機能を提供するため、この記事ではそれらについてのみ理解します。もちろん、最も重要なことは、この拡張機能に関する公式ドキュメントですら完全ではなく、ほとんどの関数のパラメーターの説明がなく、検索しても見つかる情報がほとんどないことです。
Sodium 拡張機能は、PHP7.2 以降の PHP ソース コードとともにリリースされました。正常にインストールするには、コンパイル時に --with-sodium を追加するだけです。 PHP7.2より前のバージョンの場合は、この拡張機能を別途インストールする必要があります。同時に、libsodium-devel ライブラリもオペレーティング システムにインストールする必要があります。
最初は、この AEAD_AES_256_GCM 暗号化および復号化機能関数の適用です。 WeChat決済関連の開発ではこの方式を利用してデータを暗号化するインターフェースがあり、公式ドキュメントではSodium拡張ライブラリの関数を利用したPHPの対応する復号化方式も提供されています。 (この記事の最後にある参考ドキュメントの 2 番目のリンクを参照してください)
$data = '测试加密'; // 原始数据 $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES); // 加密证书的随机串,加密证书的随机串 $ad = 'fullstackpm'; // 加密证书的随机串 $kengen = sodium_crypto_aead_aes256gcm_keygen(); // 密钥 // 是否可用 echo sodium_crypto_aead_aes256gcm_is_available(), PHP_EOL; // 1 // 加密 $pem = sodium_crypto_aead_aes256gcm_encrypt($data, $ad, $nonce, $kengen); var_dump($pem); // string(28) "��VRw!�����f��l�O�tV=\x�" // 解密 $v = sodium_crypto_aead_aes256gcm_decrypt($pem, $ad, $nonce, $kengen); var_dump($v); // string(12) "测试加密"
コード内のコメントには、関連する関数とパラメーターの詳細が記載されています。これを使用して WeChat 決済で復号化する場合、広告、キー、ノンスなどはすべて WeChat によって提供され、ここでのデモンストレーションとして、それらはすべて自己生成コンテンツです。
sodium_crypto_aead_aes256gcm_encrypt() 暗号化によって生成されたコンテンツもバイナリ コンテンツであるため、比較的安全な暗号化形式です。
Sodium 拡張ライブラリには、データが改ざんされているかどうかを検証する機能、つまり情報の署名を比較する機能も備わっています。
// 信息签名 $key = sodium_crypto_auth_keygen(); // 生成随机签名密钥 $message = '测试认证签名'; // 生成签名 $signature = sodium_crypto_auth($message, $key); var_dump($signature); // string(32) "�B� // 9���l�wn�x���ӛc�ܙ�u^j��" // 验证签名 var_dump(sodium_crypto_auth_verify($signature, $message, $key)); // bool(true)
必要なのは、単純なランダムな署名キーだけであり、署名ダイジェストを元のテキストと比較して、データが送信中に改ざんされているかどうかを判断します。
はい、お読みのとおり、Sodium 拡張機能は一連のハッシュ暗号化関数も提供します。ただし、その使用方法はもう少し複雑で、生成されるコンテンツはパスワード ハッシュ アルゴリズムによって生成されるコンテンツに似ています。ただし、このタイプのハッシュ パスワードを生成するには、パスワード ハッシュ アルゴリズムのpassword_hash()を使用することをお勧めします。
// Hash $password = '测试Hash'; $hash = sodium_crypto_pwhash_str( $password, SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, // 最大计算量 SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE // 最大RAM量 ); var_dump($hash); // string(97) "$argon2id$v=19$m=65536,t=2,p=1$VFfdNV4W0MFwLiLPdr9i6g$QDmd5sQToZANYTVEkPVTbPvbY7tuf1ALKU3IXrF44R0" // 验证 Hash 信息 var_dump(sodium_crypto_pwhash_str_verify($hash, $password)); // bool(true)
私たちは普段これに触れることがないかもしれませんが、WeChat がこれを使用しているため、Sodium 拡張機能にはまだ実用的なアプリケーションが開発中であることは事実です。データの暗号化に加えて、それについても深く理解する必要があります。しかし、私たちは公式ができるだけ早くドキュメントを改善できることを望んでいます。そうしないと、この拡張機能セットの内容を体系的に学ぶことができなくなります。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E7%9A%84Sodium%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E5%87%BD%E6%95%B0%E4%BA%86%E8%A7%A3.php
推奨学習: php ビデオ チュートリアル
以上がPHPでのSodium暗号化拡張機能の使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。