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 字符串参考