Magento 使用 DES-CBC 加密
各位Magento工程師想必常有串接第三方服務的經驗。許多第三方服務供應商會要求先將資料依據指定的加密法加密後再傳送過去。資料加密方式百百種,今天來介紹如何在Magento內使用DES-CBC演算法來加密資料。DES-CBC演算法可參考維基百科,這裡不再贅述。
需準備的參數
- $key: 通常由第三方服務供應商提供
- $iv: initial vector, 通常由第三方服務商提供,必須是長度為8的常數字串
- $plaintext: 需要被加密的明文資料
取得加密處理物件
private function getCrypt(string $key, string $iv) { return new Mcrypt($key, MCRYPT_DES, MCRYPT_MODE_CBC, $iv); }
其中Mcrypt是 \Magento\Framework\Encryption\Adapter\Mcrypt 這個class. 在建立一個新的Mcrypt物件時,給入參數除了剛才提及的$key和$iv, 也要指定其cipher是DES (MCRYPT_DES), 模式是CBC (MCRYPT_MODE_CBC). 接下來的加密解密皆可以透過這個物件處理。
加密前處理
在加密明文之前,必須先將明文字串長度填充至$iv字串長度的倍數。因$iv字串長度為8,若明文字串長度為20, 則須將明文填充至24位。將需要填充的位元數作為ascii碼轉換成字元,即是填充物。詳參 pkcs#5 填充法。
private function pad(string $text) { $padSize = 8 - (strlen($text) % 8); $padChr = chr($padSize); return str_pad($text, 8, $padChr); }
加密函式
準備完全,現在可撰寫加密函式了!先將明文填充至8倍數長度後,即可使用剛才取得的Mcrypt物件加密。
public function (string $plaintext, string $key, string $iv) { $plaintext = $this->pad($plaintext); return $this->getCrypt($key, $iv)->encrypt($plaintext); }
到這裡為止我們已經成功獲得DES-CBC加密後的資料了。至於怎麼進行解密,未來有機會再來分享,敬請期待!
持續鎖定歐斯瑞分享的相關文章!記得追蹤我們的FB粉絲團及IG,更別忘了訂閱我們的電子報,隨時掌握第一手新知分享喔!有任何問題也歡迎隨時聯絡我們。下次見囉!
我要留言