目录

PHP crypt() 函数


❮ PHP 字符串参考

定义和用法

crypt() 函数返回使用 DES、Blowfish 或 MD5 算法的哈希字符串。

该函数在不同的操作系统上表现不同。 PHP 在安装时检查哪些算法可用以及要使用哪些算法。

盐参数是可选的。然而, crypt() 创建一个没有盐的弱密码。确保指定足够强的盐以获得更好的安全性。

有一些常量与 crypt() 函数一起使用。这些常量的值由 PHP 在安装时设置。

常数:

  • [CRYPT_STD_DES] - 基于标准 DES 的哈希,带有来自字母表 "./0-9A-Za-z" 的两个字符盐。在盐中使用无效字符将导致此功能失败。
  • [CRYPT_EXT_DES] - 扩展的基于 DES 的哈希,具有九个字符 salt,由下划线后跟 4 个字节的迭代计数和 4 个字节的 salt 组成。这些被编码为可打印字符,每个字符 6 位,最低有效字符在前。值 0 到 63 编码为"./0-9A-Za-z"。在盐中使用无效字符将导致函数失败。
  • [CRYPT_MD5] - MD5 哈希,使用以 $1$ 开头的 12 个字符盐
  • [CRYPT_BLOWFISH] - 使用以 $2a$、$2x$ 或 $2y$ 开头的盐进行 Blowfish 哈希,两位数的成本参数 "$" 以及字母表中的 22 个字符 "./0-9A-Za-z"。使用字母表之外的字符将导致此函数返回零长度字符串。 "$" 参数是底层 Blowfish-bashed 哈希算法的迭代计数的以 2 为底的对数,并且必须在 04-31 范围内。超出此范围的值将导致函数失败。
  • [CRYPT_SHA_256] - SHA-256 哈希,具有以 $5$ 开头的 16 个字符盐。如果盐字符串以 "rounds=<N>$" 开头,则 N 的数值用于指示哈希循环应执行的次数,就像 Blowfish 上的成本参数一样。默认轮数为 5000,最小为 1000,最大为 999,999,999。任何超出此范围的 N 选择都将被截断为最接近的限制。
  • [CRYPT_SHA_512] - SHA-512 哈希,具有以 $6$ 开头的 16 个字符盐。如果盐字符串以 "rounds=<N>$" 开头,则 N 的数值用于指示哈希循环应执行的次数,就像 Blowfish 上的成本参数一样。默认轮数为 5000,最小为 1000,最大为 999,999,999。任何超出此范围的 N 选择都将被截断为最接近的限制。

在此函数支持多种算法的系统上,如果支持,上述常量将设置为"1",否则设置为"0"。

笔记:没有解密功能。 crypt() 函数使用单向算法。


语法

crypt( str,salt)

参数值

Parameter Description
str Required. Specifies the string to be hashed
salt Optional. A salt string to base the hashing on


技术细节

返回值: 返回编码字符串或小于 13 个字符的字符串,并保证在失败时与 salt 不同
PHP 版本: 4+
变更日志: PHP 5.6.0 - 如果出现以下情况,则显示 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、标准 DES、扩展 DES 和 Blowfish 算法的实现,如果系统缺乏对一种或多种算法的支持,则将使用它。

更多示例

示例

在此示例中,我们将测试不同的算法:

<?php
// 2 character salt
if (CRYPT_STD_DES == 1)
{
echo "Standard DES: ".crypt('something','st')."\n<br>";
}
else
{
echo "Standard DES not supported.\n<br>";
}

// 4 character salt
if (CRYPT_EXT_DES == 1)
{
echo "Extended DES: ".crypt('something','_S4..some')."\n<br>";
}
else
{
echo "Extended DES not supported.\n<br>";
}

// 12 character salt starting with $1$
if (CRYPT_MD5 == 1)
{
echo "MD5: ".crypt('something','$1$somethin$')."\n<br>";
}
else
{
echo "MD5 not supported.\n<br>";
}

// Salt starting with $2a$. The two digit cost parameter: 09. 22 characters
if (CRYPT_BLOWFISH == 1)
{
echo "Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>";
}
else
{
echo "Blowfish DES not supported.\n<br>";
}

// 16 character salt starting with $5$. The default number of rounds is 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 character salt starting with $6$. The default number of rounds is 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 字符串参考