PHP的幾個常用加密函數


在php的開發過程中,常常需要對部分數據(如用戶密碼)進行加密

一、加密類型:

1.單向散列加密

  就是把任意長度的信息進行散列計算,得到固定長度的輸出,這個散列計算過程是單向的,即不能對固定長度的輸出信息進行計算從而得到輸入信息。

(1)特征:雪崩效應、定長輸出和不可逆。
(2)作用是:確保數據的完整性。
(3)加密算法:md5(標准密鑰長度128位)、sha1(標准密鑰長度160位)、md4、CRC-32

2.對稱散列加密

  對稱加密是指加密和解密是使用同一個密鑰,或者可以互相推算。

(1)加密方和解密方使用同一個密鑰。
(2)加密解密的速度比較快,適合數據比較長時的使用。
(3)密鑰傳輸的過程不安全,且容易被破解,密鑰管理也比較麻煩。
(4)加密算法:DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard,支持128、192、256、512位密鑰的加密)、Blowfish。

3.非對稱散列加密

  非對稱加密和解密使用的不是同一個密鑰,其中一個對外公開,稱作公鑰,另一個只有所屬者知道,稱作私鑰。

(1)每個用戶擁用一對密鑰加密:公鑰和私鑰。
(2)公鑰加密,私鑰解密;私鑰加密,公鑰解密。
(3)公鑰傳輸的過程不安全,易被竊取和替換。
(4)由於公鑰使用的密鑰長度非常長,所以公鑰加密速度非常慢,一般不使用其去加密。
(5)某一個用戶用其私鑰加密,其他用戶用其公鑰解密,實現數字簽名的作用。
(6)公鑰加密的另一個作用是實現密鑰交換。
(7)加密和簽名算法:RSA、ELGamal。
(8)公鑰簽名算法:DSA。

注釋:

(1)RSA:由 RSA 公司發明,是一個支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的;
(2)DSA(Digital Signature Algorithm):數字簽名算法,是一種標准的 DSS(數字簽名標准);

(3)由於非對稱加密算法的運行速度比對稱加密算法的速度慢很多,當我們需要加密大量的數據時,建議采用對稱加密算法,提高加解密速度。
對稱加密算法不能實現簽名,因此簽名只能非對稱算法。
(4)由於對稱加密算法的密鑰管理是一個復雜的過程,密鑰的管理直接決定着他的安全性,因此當數據量很小時,我們可以考慮采用非對稱加密算法。
(5)在實際的操作過程中,我們通常采用的方式是:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數據,這樣我們就集成了兩類加密算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。

二、php中常用的加密函數:

1.MD5加密:

  string md5 ( string $str [, bool $raw_output = false ] )

  (1)md5()默認情況下以 32 字符十六進制數字形式返回散列值,它接受兩個參數,第一個為要加密的字符串,第二個為raw_output的布爾值,

        默認為false,如果設置為true,md5()則會返回原始的 16 位二進制格式報文摘要

  (2)md5()為單向加密,沒有逆向解密算法,但是還是可以對一些常見的字符串通過收集,枚舉,碰撞等方法破解

2.Crypt加密:

  string crypt ( string $str [, string $salt ] )

  (1)crypt()接受兩個參數,第一個為需要加密的字符串,第二個為鹽值(就是加密干擾值,如果沒有提供,則默認由PHP自動生成);

     返回散列后的字符串一個少於 13 字符的字符串,后者為了區別鹽值。

     (2)crypt()為單向加密,跟md5一樣。

3.Sha1加密:

  string sha1 ( string $str [, bool $raw_output = false ])

  (1)跟md5很像,不同的是sha1()默認情況下返回40個字符的散列值,傳入參數性質一樣,第一個為加密的字符串,

   第二個為raw_output的布爾值,默認為false,如果設置為true,sha1()則會返回原始的20 位原始格式報文摘要

  (2)sha1()也是單行加密,沒有逆向解密算法

4.Urlencode加密:

  string urlencode ( string $str )

  (1)一個參數,傳入要加密的字符串(通常應用於對URL的加密)

  (2)urlencode為雙向加密,可以用urldecode來加密(嚴格意義上來說,不算真正的加密)

  (3)返回字符串,此字符串中除了 -_. 之外的所有非字母數字字符都將被替換成百分號(%)后跟兩位十六進制數,空格則編碼為加號(+)。

  (3)常見的urlencode()的轉換字符

    ? => %3F = => %3D % => %25 & => %26 \ => %5C
空格 => %5C

5.base64編碼加密:

  string base64_decode ( string $encoded_data )

  (1)base64_encode()接受一個參數,也就是要編碼的數據(這里不說字符串,是因為很多時候base64用來編碼圖片)

  (2)base64_encode()為雙向加密,可用base64_decode()來解密

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM