1、前言php
我的認爲,PHP是世界上爲數很少,最人性化的語言。html
雖然是二次開發、弱類型語言,由C/C++編寫的PHP引擎去解析。可是,其代碼優雅性和其運行速度不亞於,其餘編譯語言。web
2、PHP數據加密算法
數據加密的類型有:數組
MD五、sha一、sha25六、CRC32多項式冗餘校驗等。函數
1. MD五、sha一、sha256編碼
描述:hash加密算法,不可逆。經常使用於數據驗證與密碼驗證。加密
例如:spa
1 <?php 2 echo md5(md5('123456' . DX))
2. CRC32.net
描述:多項冗餘校驗,不可逆。經常使用於校驗數據的完整性,可用於校驗目標文件是否修改。
例如:
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建議,參數2、參數三都爲默認值。
password_valid()
hash驗證。
3、計算機底層數據存儲和傳輸
1、計算機底層數據存儲unicode編碼。
a、計算機數據傳輸爲UTF-8編碼格式。
b、strlen對存儲數據以UTF-8形式轉碼解析,並以8bit爲一個byte進行計算字符單位長度。
c、mb_strlen() 對存儲數據以UTF-8形式轉碼,其參數二爲可指定參數。UTF-八、unicode、8bit,默認爲UTF-8解析字符單位長度。若計算漢字字符,指定參數二爲UTF-8,則該函數以UTF-8計算該字符長度,好比:「代碼」,則是兩個字節長度。
在unicode協議中,一箇中文漢字爲2byte。UTF-8協議中一箇中文漢字爲3byte。因此參數二指定爲unicode時,則 「代碼」 這串字符爲三個單位長度。
4、總結
a. 若是咱們作web應用,用於客戶端登錄註冊驗證時,咱們能夠用MD五、sha一、sha25六、password_hash、password_valid等哈希加密驗證。
b. 若是咱們讓目標文件隨源文件的更改而改變,那麼咱們就能夠使用CRC32對數據進行加密,生成目標文件。
c. 計算機底層數據存儲在Unicode時代,則全部字符都以兩個字節存儲,那麼若是是單字節字符,則補位0。那麼UTF-8就做爲傳輸數據的數據編碼格式出如今計算機的舞臺。咱們的PHP底層函數解析,都是以UTF-8的編碼協議解析。在Unicode中一箇中文漢字爲2byte。而UTF-8中,一箇中文漢字爲3byte 。
參考文獻: