最近在工作中負責對接 API,資料介面互動過程中,且不可避免地會有一些敏感資料的傳輸,為了讓資料互動更安全,因此對資料進行加密。
對方的要求是對介面的業務資料進行AES-128-CBC-PKCS5Padding
加密,然後再做Base64
編碼將得到的最終字串進行提交,也給到了加密方式對應的金鑰(key)和初始化向量(偏移量)。
首先看到這個加密方式之後,就在PHP函數庫中進行尋找,看看有沒有對應的加密函數,然而找了一圈下來,發現並沒有,需要自己實現,後了解到可以用mcrypt 函數擴展實現,但是mcrypt函數自PHP 7.1.0 起就廢棄了,強烈建議不要使用本函數,只好再尋找其他加密函數庫,在手冊的下方看到了OpenSSL 函數,透過了解openssl_encrypt(加密數據) 函數發現可以實現需求,openssl_encrypt 具體的使用方法請自行看手冊【建議:PHP視訊教學】
實作函數如下:
#function encrypt($input, $key, $iv){ return base64_encode(openssl_encrypt($input, 'AES-128-CBC', $key, OPENSSL_RAW_DATA,$iv)); } // 解密 function decrypt($input, $key, $iv){ return openssl_decrypt(base64_decode($input), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); } // 测试加密 (我这里用的是json字符串) $dataJson = '[{"Code": "123123", "Name": "Bob", "Address": "\u94f6\u5ddd\u5e02"}, {"Code": "464776", "Name": "Hello", "Address": "\u5317\u4eac\u5e02"}]'; print_r(encrypt($dataJson, $key, $iv)); //u9Bd8oHXDGvjZcTIX9HK1r1q+aSu+/48gsfoGVrxoScZuX8yaj/xco8F2yHt2T987JNHil9LwjAmu9o5NJaicWQDaiKwMD5o70k1A9bGjDd71xb4hXRx3ddZwI85oTQQEUQLadR5C759SdaN8AOxlzH+yGlAWTOaEleulKoRTwaknG1NCM/qIRQ8gI5lzv+D // 测试解密 $strr = 'u9Bd8oHXDGvjZcTIX9HK1r1q+aSu+/48gsfoGVrxoScZuX8yaj/xco8F2yHt2T987JNHil9LwjAmu9o5NJaicWQDaiKwMD5o70k1A9bGjDd71xb4hXRx3ddZwI85oTQQEUQLadR5C759SdaN8AOxlzH+yGlAWTOaEleulKoRTwaknG1NCM/qIRQ8gI5lzv+D'; print_r(decrypt($strr, $key, $iv)); // [{"Code": "123123", "Name": "Bob", "Address": "\u94f6\u5ddd\u5e02"}, {"Code": "464776", "Name": "Hello", "Address": "\u5317\u4eac\u5e02"}]
自測通過,一臉得意地坐等聯調。然後開始寫其他業務去了,過了幾天,結果一聯調發現我加密的對方無法解密,對方加密的我無法解密,加密演算法不匹配(撓頭中。經過Google搜尋相關問題,發現一句話,大概的意思是說,在廢棄的mcrypt加密庫中,128實際上指的是塊大小而不是密鑰大小,但是在openssl 中的aes-128-cbc 的128 指的是密鑰大小,也就是說,在使用有效的256位元密鑰時,它們都是aes-256,而如果要把mcrypt 轉為openssl 的加密方式,mcrypt 的128 需要寫成openssl 的256 ,於是抱著試試看的態度,更改了一下aes-128-cbc 為aes-256-cbc,然後進行調試,最後發現聯調通過了。不過具體的技術細節原理還不是很明白,先這樣子修改使用,以後有時間再研究吧。
> **解决的方案,是把加密方式 AES-128-CBC 替换成 AES-256-CBC**
##
以上是一文詳解PHP怎麼實現AES-128-CBC-PKCS5Padding加密的詳細內容。更多資訊請關注PHP中文網其他相關文章!