一、前言
個人認為,PHP是世界上為數不多,最人性化的語言。
雖然是二次開發、弱類型語言,由C/C++編寫的PHP引擎去解析。但是,其代碼優雅性和其運行速度不亞於,其他編譯語言。
二、PHP數據加密
數據加密的類型有:
MD5、sha1、sha256、CRC32多項式冗余校驗等。
1. MD5、sha1、sha256
描述:hash加密算法,不可逆。常用於數據驗證與密碼驗證。
例如:
1 <?php 2 echo md5(md5('123456' . DX))
2. CRC32
描述:多項冗余校驗,不可逆。常用於校驗數據的完整性,可用於校驗目標文件是否修改。
例如:
1 <?php 2 $file = realpath('main.js') . filemtime(realpath('main.js') ); 3 echo printf("%x", crc32($file));
注:
因為PHP數值底層存儲都是帶符號的,這里把值處理成16進制。
如果,main.js文件被修改,則輸出結果也會變化;
3. base64_encode和base64_decode
描述:數據壓縮加密,可逆。常用於數據加密、傳輸。通常和strtr函數一起使用。
例如:
1 <?php 2 $tr = 'www.baidu.com'; 3 echo base64_encode($tr); 4 echo '<hr />'; 5 echo strtr(base64_encode($tr), 'c=Z', '-_/'); 6 echo '<hr />'; 7 $rtr = strtr(base64_encode($tr), '-_', 'c=z');
strtr函數描述:
詳情請查看php.net
簡單介紹:字符串替換。
4. password_hash、password_valid
描述:哈希加密,不可逆。常用於數據加密和認證。
例如:
1 //算法遞歸層數 2 $cost = 4; 3 //鹽值 4 $salt = '1234567891234567891234'; 5 //指定鹽值 最小值22; 指定算法遞歸層數 最小值4 最大值 25 6 echo password_hash('123456', PASSWORD_DEFAULT, ['cost' => $cost, 'salt' => $salt]); 7 echo '<hr />'; 8 echo password_verify('123456', '$2y$06$KfKrG52XutkMN9DcGeczVOVqGCDtMYWHk5BaqH/nu0tX/jjqhTGgO');
解析:
password_hash()
參數一:加密字符串
參數二:加密hash算法,PASSWORD_DEFAULT為默認bcrypt哈希算法。其他關於更多的算法,請百度搜索自行了解一下。
參數三:選項。數組類型,數組元素可選。
cost hash算法遞歸層數。
salt 哈希算法,加入的鹽值,即:干擾字符。
PHP7.0建議,參數二、參數三都為默認值。
password_valid()
hash驗證。
三、計算機底層數據存儲和傳輸
一、計算機底層數據存儲unicode編碼。
a、計算機數據傳輸為UTF-8編碼格式。
b、strlen對存儲數據以UTF-8形式轉碼解析,並以8bit為一個byte進行計算字符單位長度。
c、mb_strlen() 對存儲數據以UTF-8形式轉碼,其參數二為可指定參數。UTF-8、unicode、8bit,默認為UTF-8解析字符單位長度。若計算漢字字符,指定參數二為UTF-8,則該函數以UTF-8計算該字符長度,比如:“代碼”,則是兩個字節長度。
在unicode協議中,一個中文漢字為2byte。UTF-8協議中一個中文漢字為3byte。所以參數二指定為unicode時,則 “代碼” 這串字符為三個單位長度。
四、總結
a. 如果我們做web應用,用於客戶端登陸注冊驗證時,我們可以用MD5、sha1、sha256、password_hash、password_valid等哈希加密驗證。
b. 如果我們讓目標文件隨源文件的更改而改變,那么我們就可以使用CRC32對數據進行加密,生成目標文件。
c. 計算機底層數據存儲在Unicode時代,則所有字符都以兩個字節存儲,那么如果是單字節字符,則補位0。那么UTF-8就作為傳輸數據的數據編碼格式出現在計算機的舞台。我們的PHP底層函數解析,都是以UTF-8的編碼協議解析。在Unicode中一個中文漢字為2byte。而UTF-8中,一個中文漢字為3byte 。
參考文獻:
