PHP crypt() 函数
❮ PHP 字符串参考
定义和用法
crypt() 函数使用 DES、Blowfish 或 MD5 算法返回哈希字符串。
此函数在不同的操作系统上表现不同。 PHP 在安装时会检查哪些算法可用以及使用哪些算法。
salt 参数是可选的。但是,如果没有 salt,crypt() 会创建一个弱密码。确保为提高安全性指定足够强的 salt。
一些常量与 crypt() 函数一起使用。这些常量的值在 PHP 安装时由 PHP 设置。
常量
- [CRYPT_STD_DES] - 基于标准 DES 的哈希,使用来自字母表“./0-9A-Za-z”的两个字符 salt。 在 salt 中使用无效字符会导致此函数失败。
- [CRYPT_EXT_DES] - 基于扩展 DES 的哈希,使用九个字符的 salt,由下划线后跟 4 个字节的迭代计数和 4 个字节的 salt 组成。 这些被编码为可打印字符,每个字符 6 位,最低有效字符优先。 值 0 到 63 被编码为“./0-9A-Za-z”。 在 salt 中使用无效字符会导致函数失败。
- [CRYPT_MD5] - 以 $1$ 开头的 12 个字符 salt 的 MD5 哈希
- [CRYPT_BLOWFISH] - 以 $2a$、$2x$ 或 $2y$ 开头的 salt 的 Blowfish 哈希,一个两位数的成本参数“$”和来自字母表“./0-9A-Za-z”的 22 个字符。 在字母表之外使用字符会导致此函数返回一个零长度字符串。 “$”参数是底层 Blowfish 基于哈希算法的迭代计数的以 2 为底的对数,必须在 04-31 范围内。 此范围之外的值会导致函数失败。
- [CRYPT_SHA_256] - 以 $5$ 开头的 16 个字符 salt 的 SHA-256 哈希。 如果 salt 字符串以“rounds=<N>$”开头,则 N 的数值用于指示哈希循环应执行多少次,类似于 Blowfish 上的成本参数。 默认轮数为 5000,最小值为 1000,最大值为 999,999,999。 此范围之外的任何 N 选择都将被截断到最接近的限制。
- [CRYPT_SHA_512] - 使用 16 个字符的盐进行 SHA-512 哈希,盐以 $6 开头。如果盐字符串以“rounds=
$”开头,则 N 的数值用于指示哈希循环应执行的次数,类似于 Blowfish 上的 cost 参数。默认循环次数为 5000 次,最小值为 1000 次,最大值为 999,999,999 次。任何超出此范围的 N 选择都将被截断到最近的限制。
在支持多种算法的系统上,如果支持上述常量,则设置为“1”,否则设置为“0”。
注意:没有解密函数。crypt() 函数使用单向算法。
语法
crypt(str,salt)
参数值
参数 | 描述 |
---|---|
str | 必需。指定要哈希的字符串 |
salt | 可选。用于对哈希进行基础运算的盐字符串 |
技术细节
返回值 | 返回编码后的字符串,或长度小于 13 个字符的字符串,该字符串在失败时保证与盐不同 |
---|---|
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 在无效循环次数时返回“失败”字符串(“*0”或“*1”),而不是回退到 DES 的行为。 PHP 5.3.0 - PHP 现在包含了对 MD5 crypt、标准 DES、扩展 DES 和 Blowfish 算法的自身实现,如果系统缺少对一种或多种算法的支持,将使用该实现。 |
更多示例
示例
在本例中,我们将测试不同的算法
<?php
// 2 个字符的盐
if (CRYPT_STD_DES == 1)
{
echo "标准 DES: ".crypt('something','st')."\n<br>";
}
else
{
echo "标准 DES 不支持。\n<br>";
}
// 4 个字符的盐
if (CRYPT_EXT_DES == 1)
{
echo "扩展 DES: ".crypt('something','_S4..some')."\n<br>";
}
else
{
echo "扩展 DES 不支持。\n<br>";
}
// 以 $1$ 开头的 12 个字符的盐
if (CRYPT_MD5 == 1)
{
echo "MD5: ".crypt('something','$1$somethin$')."\n<br>";
}
else
{
echo "MD5 不支持。\n<br>";
}
// 以 $2a$ 开头的盐。两位数的 cost 参数:09。22 个字符
if (CRYPT_BLOWFISH == 1)
{
echo "Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>";
}
else
{
echo "Blowfish DES 不支持。\n<br>";
}
// 以 $5$ 开头的 16 个字符的盐。默认循环次数为 5000 次。
if (CRYPT_SHA256 == 1)
{
echo "SHA-256: ".crypt('something','$5$rounds=5000$anexamplestringforsalt$')."\n<br>"; }
else
{
echo "SHA-256 不支持。\n<br>";
}
// 以 $6$ 开头的 16 个字符的盐。默认循环次数为 5000 次。
if (CRYPT_SHA512 == 1)
{
echo "SHA-512: ".crypt('something','$6$rounds=5000$anexamplestringforsalt$');
}
else
{
echo "SHA-512 不支持。" ;
}
?>
上述代码的输出可能为(取决于操作系统)
标准 DES: stqAdD7zlbByI
扩展 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 字符串参考