隨著網路的不斷發展,API(應用程式介面)的應用範圍越來越廣泛,各種系統之間的資料互動也越來越頻繁。而對於敏感資料的傳輸,資料加密和解密是不可或缺的步驟。本文將介紹基於PHP實作API時如何處理資料加密和解密。
一、為什麼要進行資料加密
資料加密是指把原有的明文依照一定的演算法轉換為密文,使得未得到對應金鑰的人無法解讀,進而實現資料的保密性。在API開發中,需要進行資料加密的主因為以下兩點:
API開放給第三方使用時,由於介面資料的傳輸並不能保證一定是在私密通訊環境下進行,因此可以透過加密來確保資料的安全性和真實性,避免資料在傳輸過程中被竊取或竄改。
資料加密可以透過身分驗證、簽章等方式來保證資料傳輸的合法性。在API請求發送過程中,透過對請求參數進行不可逆演算法加密,可以保證請求的合法性,防止非法篡改或偽造請求資料。
二、PHP實作資料加密
#對稱加密演算法是指,加密和解密時使用的金鑰是相同的,只需要將金鑰作為參數傳遞即可完成加密和解密操作。在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()函數對加密資料進行解密,然後傳回解密後的資料。
三、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中文網其他相關文章!