首頁  >  文章  >  後端開發  >  PHP實作API時如何處理資料加密與解密

PHP實作API時如何處理資料加密與解密

WBOY
WBOY原創
2023-06-17 15:40:401560瀏覽

隨著網路的不斷發展,API(應用程式介面)的應用範圍越來越廣泛,各種系統之間的資料互動也越來越頻繁。而對於敏感資料的傳輸,資料加密和解密是不可或缺的步驟。本文將介紹基於PHP實作API時如何處理資料加密和解密。

一、為什麼要進行資料加密

資料加密是指把原有的明文依照一定的演算法轉換為密文,使得未得到對應金鑰的人無法解讀,進而實現資料的保密性。在API開發中,需要進行資料加密的主因為以下兩點:

  1. 資料安全性

API開放給第三方使用時,由於介面資料的傳輸並不能保證一定是在私密通訊環境下進行,因此可以透過加密來確保資料的安全性和真實性,避免資料在傳輸過程中被竊取或竄改。

  1. 合法性驗證

資料加密可以透過身分驗證、簽章等方式來保證資料傳輸的合法性。在API請求發送過程中,透過對請求參數進行不可逆演算法加密,可以保證請求的合法性,防止非法篡改或偽造請求資料。

二、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()函數進行解密操作。

  1. 非對稱加密演算法

非對稱加密演算法是指,加密和解密時使用的金鑰不同,一般將公鑰公開,用於加密數據,再由伺服器端的私鑰進行解密。在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()函數對加密資料進行解密,然後傳回解密後的資料。

三、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()函數對資料進行雜湊加密,傳回簽章後的資料。

四、資料加密與解密範例

接下來,我們將對上述資料加密與簽章方法進行綜合應用,示範如何使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn