記錄這兩天遇到的一些問題,一開始主要是對一些概念理解的不清楚
比如AES是一種算法,而OpenSSL是一個擴展庫,其中包含對AES算法的實現
當然在完全理解算法后可以自己實現,但可能會遇到很多問題,我會在以后進行嘗試
目前在項目的使用中,還是使用擴展庫的方法最快最簡單
1,加密方法:
通用的單鑰加密算法為DES(Data Encryption Standard),通用的雙鑰加密算法為RSA( Rivest-Shamir-Adleman),都產生於上個世紀70年代。
目前用AES來代替DES(都是單鑰)。
我選擇使用AES算法來進行加密。
2,簡單了解AES:
AES 有三種算法,主要是對數據塊的大小存在區別:
AES-128:需要提供 16 位的密鑰
AES-192:需要提供 24 位的密鑰
AES-256:需要提供 32 位的密鑰
AES 是按數據塊大小(128/192/256)對待加密內容進行分塊處理的,會經常出現最后一段數據長度不足的場景,這時就需要填充數據長度到加密算法對應的數據塊大小。
3,實現方式:
AES本質是算法,下面需要想辦法實現。
在PHP中,如果不自己實現算法的話,有兩種方式可以調用AES算法進行加密
一個是MCrypt,一個是OpenSSL
(PHP在7.2版本已經完全移除了MCrypt加密;PHP的OpenSSL擴展已經實現了AES加密算法,我們可以通過OpenSSL擴展提供的方法實現對數據的加密和解密)
我們選擇OpenSSL
4,在PHP中加入OpenSSL擴展
因為還沒有嘗試Linux的OpenSSL安裝,故這里只記錄Window的成功安裝方式。
步驟:
1: 首先檢查php.ini中;extension=php_openssl.dll是否存在, 如果存在的話去掉前面的注釋符‘;', 如果不存在這行,那么添加extension=php_openssl.dll。
2: 講php文件夾下的: php_openssl.dll, ssleay32.dll, libeay32.dll 3個文件拷貝到 WINDOWS\system32\ 文件夾下。(注:所在子目錄可能有所不同)
3: 重啟apache或者iis(iisreset /restart)
至此,openssl功能就開啟了。
5,添加范例代碼:
如下:(作者來自思否captainblue)
1 class AES_128_CW { 2 private $_iv = ''; 3 private $_secret = ''; 4 5 public function __construct($iv,$secret){ 6 $this->_iv = substr($iv.'0000000000000000', 0,16);//可以忽略這一步,只要你保證iv長度是16 7 $this->_secret = hash('md5',$secret,true); 8 } 9 10 public function decode($secretData){ 11 return openssl_decrypt(urldecode($secretData),'aes-128-cbc',$this->_secret,false,$this->_iv); 12 } 13 14 public function encode($data){ 15 return urlencode(openssl_encrypt($data,'aes-128-cbc',$this->_secret,false,$this->_iv)); 16 } 17 }
6,進行測試
本地環境PHP版本是5.6.9,phpstudy 8.1
就是這樣
修改后可以將該類放入項目的擴展類庫,進行公共使用,或是以中間件的方式進行通訊加密,以后更新這部分。