PHP で API を実装するときにデータの暗号化と復号化を処理する方法

WBOY
リリース: 2023-06-17 15:42:01
オリジナル
1549 人が閲覧しました

インターネットの継続的な発展に伴い、API (アプリケーション プログラミング インターフェイス) の適用範囲はますます広範になり、さまざまなシステム間のデータのやり取りがますます頻繁になってきています。機密データを送信するには、データの暗号化と復号化が不可欠な手順です。この記事では、PHP ベースの API を実装する際のデータの暗号化と復号化の処理方法を紹介します。

1. データ暗号化が必要な理由

データ暗号化とは、元の平文を特定のアルゴリズムに従って暗号文に変換し、対応する鍵を取得していない人には解読できないようにすることを指します。データの機密性。 API 開発において、データ暗号化が必要となる主な理由は次の 2 点です。

  1. データ セキュリティ

API がサードパーティに公開される場合、送信による暗号化が行われます。プライベートな通信環境で実行されることを保証するものではないため、送信プロセス中にデータが盗まれたり改ざんされたりすることを防ぐために、暗号化によってデータのセキュリティと信頼性を確保できます。

  1. 合法性検証

データ暗号化により、本人確認や署名などを通じてデータ送信の合法性を保証できます。 API リクエストの送信プロセス中、リクエスト パラメータは不可逆アルゴリズムで暗号化され、リクエストの正当性が保証され、リクエスト データの不正な改ざんや偽造が防止されます。

2. PHP はデータ暗号化を実装します

  1. 対称暗号化アルゴリズム

対称暗号化アルゴリズムとは、暗号化と復号化に使用されるキーが同じであることを意味します。キーをパラメータとして渡すだけで、暗号化と復号化の操作が完了します。 API 開発で一般的に使用される対称暗号化アルゴリズムには、DES、3DES、AES などが含まれます。

AES 暗号化アルゴリズムを例に挙げると、PHP は、対称暗号化操作を実装するための openssl_encrypt() や openssl_decrypt() などの関数を提供します。使用方法は以下の通りです。

//AES加密
function aesEncrypt($data, $key) {
    $iv_len = openssl_cipher_iv_length('AES-128-CBC');
    $iv = openssl_random_pseudo_bytes($iv_len);
    $encrypted = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
    $result = base64_encode($iv . $encrypted);
    return $result;
}
//AES解密
function aesDecrypt($data, $key) {
    $data = base64_decode($data);
    $iv_len = openssl_cipher_iv_length('AES-128-CBC');
    $iv = substr($data, 0, $iv_len);
    $encrypted = substr($data, $iv_len);
    $decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
    return $decrypted;
}
ログイン後にコピー

このうち、$dataは暗号化するデータ、$keyは鍵です。暗号化プロセス中に、openssl_cipher_iv_length() を呼び出して暗号化アルゴリズムに必要な IV ベクトルの長さを取得し、openssl_random_pseudo_bytes() を呼び出してランダムな IV ベクトルを生成してから、openssl_encrypt() 関数を呼び出して暗号化操作を実行します。復号化プロセスでは、まず、base64_decode() 関数によって暗号文がバイナリ データに復元され、次に IV ベクトルと暗号化データがそれぞれ抽出され、openssl_decrypt() 関数が呼び出されて復号化操作が実行されます。

    #非対称暗号化アルゴリズム
非対称暗号化アルゴリズムとは、暗号化と復号化に使用する鍵が異なることを意味し、一般に公開鍵を公開してデータの暗号化に使用します。その後、サーバー側の秘密キーによって復号化されます。 API 開発では、一般的な非対称暗号化アルゴリズムには RSA、DSA などが含まれます。

RSA 暗号化アルゴリズムを例に挙げると、PHP は、非対称暗号化操作を実装するための openssl_public_encrypt や openssl_private_decrypt などの関数を提供します。使用方法は以下の通りです。

//RSA加密
function rsaEncrypt($data,$public_key) {
    $encrypted = '';
    openssl_public_encrypt($data,$encrypted,$public_key,OPENSSL_PKCS1_PADDING);
    $encrypted = base64_encode($encrypted);
    return $encrypted;
}
//RSA解密
function rsaDecrypt($data,$private_key) {
    $decrypted = '';
    openssl_private_decrypt(base64_decode($data),$decrypted,$private_key,OPENSSL_PKCS1_PADDING);
    return $decrypted;
}
ログイン後にコピー

このうち、$dataは暗号化するデータ、$public_keyは公開鍵です。暗号化プロセス中に、openssl_public_encrypt() 関数を呼び出すことによってデータが暗号化され、その後、暗号化されたデータがbase64_encode() 関数によってエンコードされます。復号化プロセス中に、openssl_private_decrypt() 関数を呼び出すことによって暗号化されたデータが復号化され、復号化されたデータが返されます。

3. PHP はデータ署名を実装します

API のデータ署名は、パラメーターをハッシュすることによって正当性が検証されます。 API リクエスト パラメーターの場合、サーバーはデータ署名を実行して、データ送信の整合性と信頼性を保証する必要があります。

一般的に使用されるハッシュ アルゴリズムには、HMAC、SHA1、MD5 などが含まれます。 HMAC を例にとると、データ署名は PHP の組み込み hash_hmac() 関数を使用して簡単に実装できます。使用方法は次のとおりです。

//HMAC签名
function hmacSign($data, $secret) {
    $signed_data = hash_hmac('sha256', $data, $secret, false);
    return $signed_data;
}
ログイン後にコピー

このうち、$data は署名対象のデータ、$secret は署名鍵です。 hash_hmac() 関数を呼び出してデータをハッシュ暗号化し、署名されたデータを返します。

4. データの暗号化と復号化の例

次に、上記のデータ暗号化と署名方法を包括的に適用して、PHP を使用して API リクエスト パラメーターの暗号化と復号化プロセスを完了する方法を示します。

//数据加密
$data = [
    'user_id' => 12345,
    'user_name' => 'test',
    'timestamp' => time(),
];
$json_data = json_encode($data);
$encrypted_data = aesEncrypt($json_data, $encrypt_key);

//数据签名
$signature_data = $encrypted_data . $secret_key;
$signature = hmacSign($signature_data, $hmac_key);

//API请求构造
$params = [
    'data' => $encrypted_data,
    'signature'=> $signature,
];
$request_url = 'http://api.example.com' . '?'. http_build_query($params);

//API响应解析
$response_data = file_get_contents($request_url);
$response_data = json_decode($response_data, true);

//数据解密
$encrypted_data = $response_data['data'];
$signature_data = $encrypted_data . $secret_key;
$signature = $response_data['signature'];
if(hmacSign($signature_data, $hmac_key) === $signature) {
    $json_data = aesDecrypt($encrypted_data, $encrypt_key);
    $response = json_decode($json_data, true);
    //TODO:处理API响应数据
}
else {
    //TODO:处理签名不合法的情况
}
ログイン後にコピー
上記のコードでは、まず aesEncrypt() 関数を使用してリクエスト パラメーターを対称的に暗号化し、次に hmacSign() 関数を使用して暗号化されたデータをハッシュし、署名付きリクエスト パラメーターを生成します。サーバーはリクエストを受信すると、署名データをハッシュすることで署名が正当かどうかを検証し、aesDecrypt() 関数を使用して暗号化データを復号し、元のリクエスト パラメータを取得します。

実際の申請プロセスでは、API データの安全性を確保するために、暗号鍵や署名鍵などの情報が漏洩しないようにする必要があります。同時に、システムのパフォーマンスとセキュリティの要件を満たすために、システムの使用要件に基づいて適切な暗号化および署名アルゴリズムを選択する必要があります。

以上がPHP で API を実装するときにデータの暗号化と復号化を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート