crypt() 函數傳回使用DES、Blowfish 或MD5 演算法加密的字串。
在不同的作業系統上,該函數的行為不同,某些作業系統支援一種以上的演算法類型。在安裝時,PHP 會檢查什麼演算法可用以及使用什麼演算法。
確切的演算法依賴salt 參數的格式和長度。 salt 可以透過增加由一個特定字串與一個特定的加密方法產生的字串的數量來使得加密更安全。
這裡有一些和crypt() 函數一起使用的常數。這些常數值是在安裝時由PHP 設定的。
常量:
[CRYPT_SALT_LENGTH] - 預設的加密長度。使用標準的DES 加密,長度為2
[CRYPT_STD_DES] - 標準的基於DES 加密有2 個字元的salt,來自字母表"./0-9A-Za-z"。在salt 中使用無效的字元將引發函數失敗。
[CRYPT_EXT_DES] - 擴充的基於DES 加密有9 個字元的salt,由1 個底線,後邊跟4 個位元組的迭代次數和4 個位元組的salt 組成。這些被編碼為可列印字符,每個字符6 位,最低有效字符優先。值0 到63 被編碼為"./0-9A-Za-z"。在salt 中使用無效的字元將引發函數失敗。
[CRYPT_MD5] - MD5 加密有12 個字元的salt,以$1$ 開始。
[CRYPT_BLOWFISH] - Blowfish 加密有一個以$2a$、$2x$ 或$2y$ 開始的salt,一個兩位數的cost 參數"$",以及來自字母表"./0-9A-Za-z"中的22 個字元。使用字母表以外的字元將引發函數傳回一個長度為0 的字串。 "$" 參數是以2 為底的基於Blowfish 雜湊演算法的迭代次數的對數,必須在04-31 範圍內。在該範圍以外的值將引發函數失敗。
[CRYPT_SHA_256] - SHA-256 加密有16 個字元的salt,以$5$ 開始。如果salt 字串以"rounds=<N>$" 開始,N 的數字值用來表示雜湊迴圈被執行的次數,這與Blowfish 中的cost 參數類似。預設的循環次數是5000,最小值是1000,最大值是999,999,999。任何超出這個範圍的N 的值將會轉換成最接近的邊界值。
[CRYPT_SHA_512] - SHA-512 加密有16 個字元的salt,以$6$ 開始。如果salt 字串以"rounds=<N>$" 開始,N 的數字值用來表示雜湊迴圈被執行的次數,這與Blowfish 中的cost 參數類似。預設的循環次數是5000,最小值是1000,最大值是999,999,999。任何超出這個範圍的N 的值將會轉換成最接近的邊界值。
在該函數支援多種演算法的系統上,上面的常數如果支援則設定為"1",否則設定為"0"。
註釋:沒有對應的解密函數。 crypt() 函數使用單向演算法。
crypt( str,salt )
參數 | 描述 |
---|---|
str | 必需。規定要編碼的字串。 |
salt | 可選。用於增加被編碼字元數目的字串,以使編碼更加安全。如果未提供salt 參數,則每次呼叫函數時會隨機產生一個。 |
傳回值: | 傳回加密字串,如果失敗則傳回小於13 個字元並保證不同於salt 的字串。 |
---|---|
PHP 版本: | 4+ |
更新日誌: | 在PHP 5.3.7 中,新增了$2x$ 和$2y$ Blowfish 模式,用來處理潛在的高位攻擊。在PHP 5.3.2 中,新增了常數SHA-256 和SHA-512。自PHP 5.3.2 起,Blowfish 在無效的循環將返回"failure" 字串("*0" 或"*1"),而不是後退到DES。自PHP 5.3.0 起,PHP 自帶MD5 加密實作、標準DES 實作、擴充DES 實作以及Blowfish 演算法。如果系統不支援上述的演算法,將使用PHP 自帶的演算法實現。 |
利用htpasswd 進行crypt() 加密:
<?php //設定密碼$password = ' mypassword ' ; //取得雜湊值,使用自動鹽值$hash = crypt ( $password ) ; ?>在本實例中,我們以不同雜湊類型使用:
<?php if ( CRYPT_STD_DES == 1 ) { echo ' Standard DES: ' . crypt ( ' rasmuslerdorf ' , ' rl ' ) . " n " ; } if ( CRYPT_EXT_DES == 1 ) { echo ' Extended DES: ' . crypt ( ' rasmuslerdorf ' , ' _J9..rasm ' ) . " n " ; } if ( CRYPT_MD5 == 1 ) { echo ' MD5: ' . crypt ( ' rasmuslerdorf ' , ' $1$rasmusle$ ' ) . " n " ; } if ( CRYPT_BLOWFISH == 1 ) { echo ' Blowfish: ' . crypt ( ' rasmuslerdorf ' , ' $2a$07$usesomesillystringforsalt$ ' ) . " n " ; } if ( CRYPT_SHA256 == 1 ) { echo ' SHA-256: ' . crypt ( ' rasmuslerdorf ' , ' $5$rounds=5000$usesomesillystringforsalt$ ' ) . " n " ; } if ( CRYPT_SHA512 == 1 ) { echo ' SHA-512: ' . crypt ( ' rasmuslerdorf ' , ' $6$rounds=5000$usesomesillystringforsalt$ ' ) . " n " ; } ?>上面的程式碼輸出如下(取決於作業系統):
Standard DES: rl.3StKT.4T8MExtended DES: _J9..rasmBYk8r9AiWNcMD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hiSHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsillystri$KqJWpanXZHKq2BOB43TSaYhEWs2Q1 $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21