PHP 每日一函式 — 字串函式 crypt ()

eternal_strong發表於2020-05-04

單向字串雜湊 crypt()

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

函式返回使用 DES、Blowfish 或 MD5 演算法加密的字串。
在不同的作業系統上,該函式的行為不同,某些作業系統支援一種以上的演算法型別。在安裝時,PHP 會檢查什麼演算法可用以及使用什麼演算法。
具體的演算法依賴於 salt 引數的格式和長度。通過增加由使用特定加密方法的特定字串所生成的字串數量,salt 可以使加密更安全。

提示:沒有相應的解密函式。crypt() 函式使用一種單向演算法。
引數 描述
str 必需。規定要編碼的字串。
salt 可選。用於增加被編碼字元數目的字串,以使編碼更加安全。如果未提供 salt 引數,則每次呼叫該函式時 PHP 會隨機生成一個。

返回值: 返回雜湊後的字串或一個少於 13 字元的字串,從而保證在失敗時與鹽值區分開來。

這裡有一些和 crypt() 函式一起使用的常量。這些常量值是在安裝時由 PHP 設定的。

常量 描述
[CRYPT_SALT_LENGTH] 預設的加密長度。使用標準的 DES 加密,長度為 2
[CRYPT_STD_DES] 基於標準 DES 演算法的雜湊使用 “./0-9A-Za-z” 字元中的兩個字元作為鹽值。在鹽值中使用非法的字元將導致 crypt() 失敗。
[CRYPT_EXT_DES] 擴充套件的基於 DES 演算法的雜湊。其鹽值為 9 個字元的字串,由 1 個下劃線後面跟著 4 位元組迴圈次數和 4 位元組鹽值組成。它們被編碼成可列印字元,每個字元 6 位,有效位最少的優先。0 到 63 被編碼為 “./0-9A-Za-z”。在鹽值中使用非法的字元將導致 crypt() 失敗。
[CRYPT_MD5] MD5 雜湊使用一個以 $1$ 開始的 12 字元的字串鹽值。
[CRYPT_BLOWFISH] Blowfish 演算法使用如下鹽值:“$2a$”,一個兩位 cost 引數,“$” 以及 64 位由 “./0-9A-Za-z” 中的字元組合而成的字串。在鹽值中使用此範圍之外的字元將導致 crypt() 返回一個空字串。兩位 cost 引數是迴圈次數以 2 為底的對數,它的範圍是 04-31,超出這個範圍將導致 crypt() 失敗。
CRYPT_SHA256 SHA-256 演算法使用一個以 $5$ 開頭的 16 字元字串鹽值進行雜湊。如果鹽值字串以 “rounds=<N>$” 開頭,N 的數字值將被用來指定雜湊迴圈的執行次數,這點很像 Blowfish 演算法的 cost 引數。預設的迴圈次數是 5000,最小是 1000,最大是 999,999,999。超出這個範圍的 N 將會被轉換為最接近的值。
CRYPT_SHA512 SHA-512 演算法使用一個以 $6$ 開頭的 16 字元字串鹽值進行雜湊。如果鹽值字串以 “rounds=<N>$” 開頭,N 的數字值將被用來指定雜湊迴圈的執行次數,這點很像 Blowfish 演算法的 cost 引數。預設的迴圈次數是 5000,最小是 1000,最大是 999,999,999。超出這個範圍的 N 將會被轉換為最接近的值。
在該函式支援多種演算法的系統上,如果支援上述常量則值設定為 "1",否則設定為 "0"
if (CRYPT_STD_DES == 1) {
    echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "<br>";
}

if (CRYPT_EXT_DES == 1) {
    echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "<br>";
}

if (CRYPT_MD5 == 1) {
    echo 'MD5:          ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "<br>";
}

if (CRYPT_BLOWFISH == 1) {
    echo 'Blowfish:     ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "<br>";
}

if (CRYPT_SHA256 == 1) {
    echo 'SHA-256:      ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "<br>";
}

if (CRYPT_SHA512 == 1) {
    echo 'SHA-512:      ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "<br>";
}

/*
Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
*/
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章