PHP crypt() 函式
❮ PHP 字串參考
定義和用法
crypt() 函式使用 DES、Blowfish 或 MD5 演算法返回一個雜湊字串。
此函式在不同作業系統上的行為不同。PHP 在安裝時會檢查可用演算法以及要使用的演算法。
salt 引數是可選的。但是,沒有 salt 的 crypt() 會建立弱密碼。為獲得更好的安全性,請務必指定足夠強的 salt。
有一些常量與 crypt() 函式一起使用。這些常量的值由 PHP 在安裝時設定。
常量
- [CRYPT_STD_DES] - 標準 DES 雜湊,具有兩個字元的 salt,來自字母表 "./0-9A-Za-z"。在 salt 中使用無效字元將導致此函式失敗。
- [CRYPT_EXT_DES] - 擴充套件 DES 雜湊,具有九個字元的 salt,由下劃線後跟 4 位元組的迭代計數和 4 位元組的 salt 組成。這些被編碼為可列印字元,每個字元 6 位,先是最低有效字元。值 0 到 63 編碼為 "./0-9A-Za-z"。在 salt 中使用無效字元將導致函式失敗。
- [CRYPT_MD5] - MD5 雜湊,具有一個以 $1$ 開頭的 12 位 salt
- [CRYPT_BLOWFISH] - Blowfish 雜湊,salt 以 $2a$、 $2x$ 或 $2y$ 開頭,一個兩位數的成本引數 "$",以及來自字母表 "./0-9A-Za-z" 的 22 個字元。使用字母表之外的字元將導致此函式返回零長度字串。 "$" 引數是底層 Blowfish 雜湊演算法的迭代次數的基數為 2 的對數,必須在 04-31 的範圍內。超出此範圍的值將導致函式失敗。
- [CRYPT_SHA_256] - SHA-256 雜湊,具有一個以 $5$ 開頭的 16 位 salt。如果 salt 字串以 "rounds=<N>$" 開頭,則 N 的數值用於指示雜湊迴圈應執行多少次,這與 Blowfish 的成本引數非常相似。預設輪數為 5000,最小值為 1000,最大值為 999,999,999。任何超出此範圍的 N 選擇都將被截斷到最近的限制。
- [CRYPT_SHA_512] - SHA-512 雜湊,具有一個以 $6$ 開頭的 16 位 salt。如果 salt 字串以 "rounds=<N>$" 開頭,則 N 的數值用於指示雜湊迴圈應執行多少次,這與 Blowfish 的成本引數非常相似。預設輪數為 5000,最小值為 1000,最大值為 999,999,999。任何超出此範圍的 N 選擇都將被截斷到最近的限制。
在支援多種演算法的系統上,如果支援,上述常量將設定為 "1",否則設定為 "0"。
注意:沒有解密函式。crypt() 函式使用單向演算法。
語法
crypt(str,salt)
引數值
引數 | 描述 |
---|---|
str | 必需。指定要雜湊的字串 |
salt | 可選。用於雜湊的 salt 字串 |
技術詳情
返回值 | 返回編碼後的字串,或者返回一個長度小於 13 個字元的字串,並且在失敗時保證與 salt 不同 |
---|---|
PHP 版本 | 4+ |
更新日誌 | PHP 5.6.0 - 如果省略 salt,則顯示 E_NOTICE 安全警告。 PHP 5.3.7 - 添加了 $2x$ 和 $2y$ Blowfish 模式。 PHP 5.3.2 - 添加了 SHA-256 和 SHA-512。修復了 Blowfish 對無效輪數的行為,返回 "failure" 字串 ("*0" 或 "*1"),而不是回退到 DES。 PHP 5.3.0 - PHP 現在包含自己的 MD5 crypt、Standard DES、Extended DES 和 Blowfish 演算法的實現,如果系統缺少一個或多個演算法的支援,它將使用自己的實現。 |
更多示例
示例
在此示例中,我們將測試不同的演算法
<?php
// 2 字元 salt
if (CRYPT_STD_DES == 1)
{
echo "Standard DES: ".crypt('something','st')."\n<br>";
}
else
{
echo "Standard DES not supported.\n<br>";
}
// 4 字元 salt
if (CRYPT_EXT_DES == 1)
{
echo "Extended DES: ".crypt('something','_S4..some')."\n<br>";
}
else
{
echo "Extended DES not supported.\n<br>";
}
// 12 字元 salt 以 $1$ 開頭
if (CRYPT_MD5 == 1)
{
echo "MD5: ".crypt('something','$1$somethin$')."\n<br>";
}
else
{
echo "MD5 not supported.\n<br>";
}
// salt 以 $2a$ 開頭。兩位數成本引數:09。22 個字元
if (CRYPT_BLOWFISH == 1)
{
echo "Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>";
}
else
{
echo "Blowfish DES not supported.\n<br>";
}
// 16 字元 salt 以 $5$ 開頭。預設輪數為 5000。
if (CRYPT_SHA256 == 1)
{
echo "SHA-256: ".crypt('something','$5$rounds=5000$anexamplestringforsalt$')."\n<br>"; }
else
{
echo "SHA-256 not supported.\n<br>";
}
// 16 字元 salt 以 $6$ 開頭。預設輪數為 5000。
if (CRYPT_SHA512 == 1)
{
echo "SHA-512: ".crypt('something','$6$rounds=5000$anexamplestringforsalt$');
}
else
{
echo "SHA-512 not supported.";
}
?>
上述程式碼的輸出可能是(取決於作業系統)
Standard DES: stqAdD7zlbByI
Extended DES: _S4..someQXidlBpTUu6
MD5: $1$somethin$4NZKrUlY6r7K7.rdEOZ0w.
Blowfish: $2a$09$anexamplestringforsaleLouKejcjRlExmf1671qw3Khl49R3dfu
SHA-256: $5$rounds=5000$anexamplestringf$KIrctqsxo2wrPg5Ag/hs4jTi4PmoNKQUGWFXlVy9vu9
SHA-512: $6$rounds=5000$anexamplestringf$Oo0skOAdUFXkQxJpwzO05wgRHG0dhuaPBaOU/
oNbGpCEKlf/7oVM5wn6AN0w2vwUgA0O24oLzGQpp1XKI6LLQ0.
❮ PHP 字串參考