crypt
crypt
(PHP 4, PHP 5, PHP 7)
crypt - 单向字符串散列
描述
string crypt ( string $str [, string $salt ] )
crypt()
将使用基于标准的基于DES的DES算法或可能在系统上提供的替代算法返回散列字符串。
salt参数是可选的。 但是,crypt()会创建一个没有salt的弱哈希。 没有它,PHP 5.6或更高版本会引发E_NOTICE错误。 确保指定足够强的盐以提高安全性。
password_hash()使用强大的散列,生成强壮的盐分,并自动应用适当的回合。password_hash()是一个简单的crypt()
包装器,并与现有的密码哈希兼容。鼓励使用password_hash()。
某些操作系统支持多种类型的散列。实际上,有时基于MD5的算法取代了标准的基于DES的算法。散列类型由salt参数触发。在5.3之前,PHP会在安装时根据系统的crypt()确定可用的算法。如果不提供salt,则根据MD5 crypt()的可用性,PHP将自动生成标准双字符(DES)salt或十二个字符(MD5)。PHP设置一个常数CRYPT_SALT_LENGTH
,表示可用哈希允许的最长有效salt。
标准的基于DES的crypt()返回salt作为输出的前两个字符。 它也只使用str的前八个字符,所以以相同的八个字符开始的较长的字符串将生成相同的结果(当使用相同的salt时)。
在crypt()函数支持多种散列类型的系统上,根据给定类型是否可用,将以下常量设置为0或1:
CRYPT_STD_DES
- 标准的基于DES的散列,其中含有字母“.0-9A-Za-z”中的两个字符的salt。在salt中使用无效字符将导致crypt()失败。
CRYPT_EXT_DES
- 扩展的基于DES的散列。“salt”是一个9个字符的字符串,由一个下划线和4个字节的迭代计数和4个字节的盐组成。它们被编码为可打印字符,每个字符6位,最低位字符在前。值0至63被编码为“.0-9A-Za-z”。在salt中使用无效字符将导致crypt()失败。
CRYPT_MD5
- 用$ 1 $开始的十二字符salt的MD5哈希
CRYPT_BLOWFISH
- 如下所示,Blowfish使用salt进行哈希处理:“$ 2a $”,“$ 2x $”或“$ 2y $”,两位数字的成本参数“$”以及字母表中的22个字符“./0-9A- ZA-Z”。在salt中使用此范围之外的字符将导致crypt()返回零长度的字符串。两位数成本参数是基础Blowfish算法的迭代次数的基数2对数,且必须在范围04-31内,超出此范围的值将导致crypt()失败。5.3.7之前版本的PHP仅支持“$ 2a $”作为salt前缀:PHP 5.3.7引入了新的前缀来修复Blowfish实现中的安全弱点。请参阅本文档了解安全修复程序的完整详细信息,但总括而言,开发人员仅针对PHP 5.3。
- CRYPT_SHA256 - 带有16字符salt的SHA-256哈希,前缀为$ 5 $。如果Salt字符串以'rounds = <N> $'开头,则N的数值用于指示执行散列循环的次数,非常类似Blowfish的成本参数。默认轮次数为5000,最小值为1000,最大值为999,999,999。超出此范围的任何N选择将被截断到最接近的极限。
- CRYPT_SHA512 - 带有16字符salt的SHA-512哈希,前缀为$ 6 $。如果Salt字符串以'rounds = <N> $'开头,则N的数值用于指示执行散列循环的次数,非常类似Blowfish的成本参数。默认轮次数为5000,最小值为1000,最大值为999,999,999。超出此范围的任何N选择将被截断到最接近的极限。
注意
:从PHP 5.3.0开始,PHP包含自己的实现,如果系统缺少对一个或多个算法的支持,将使用它。
参数
str
要被散列的字符串。
警告
使用该CRYPT_BLOWFISH
算法将导致str
参数被截断为最大长度为72个字符。
salt
一个可选的salt字符串,用于散列。如果未提供,则该行为由算法实现定义,并可能导致意外的结果。
返回值
返回散列字符串或长度小于13个字符的字符串,并保证与失败时的salt不同。
警告
验证密码时,应使用不易受时间攻击影响的字符串比较函数来比较crypt()
与以前已知的散列的输出。PHP 5.6开始为此提供hash_equals()。
更新日志
版本 | 描述 |
---|---|
5.6.5 | 当给出失败字符串“* 0”作为salt时,现在将返回“* 1”以与其他crypt实现一致。在此版本之前,PHP 5.6将错误地返回DES散列。 |
5.6.0 | 如果省略盐,请提高E_NOTICE安全警告。 |
5.5.21 | 当给出失败字符串“* 0”作为salt时,现在将返回“* 1”以与其他crypt实现一致。在此版本之前,PHP 5.5(及更早版本的分支)将不正确地返回DES散列。 |
5.3.7 | 增加了$ 2x $和$ 2y $ Blowfish模式来处理潜在的高位攻击。 |
5.3.2 | 基于Ulrich Drepper的»实现添加了SHA-256和SHA-512 crypt。 |
5.3.2 | 修正Blowfish在无效循环中的行为以返回“失败”字符串(“* 0”或“* 1”),而不是退回到DES。 |
5.3.0 | PHP现在包含它自己的MD5 crypt,Standard DES,Extended DES和Blowfish算法的实现,并且如果系统缺少对一个或多个算法的支持,将使用它。 |
例子
示例#1 crypt()示例
<?php
$hashed_password = crypt('mypassword' // let the salt be automatically generated
/* You should pass the entire results of crypt() as the salt for comparing a
password, to avoid problems when different hashing algorithms are used. (As
it says above, standard DES-based password hashing uses a 2-character salt,
but MD5-based hashing uses 12.) */
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo "Password verified!";
}
?>
示例#2 使用crypt()和htpasswd
<?php
// Set the password
$password = 'mypassword';
// Get the hash, letting the salt be automatically generated
$hash = crypt($password
?>
Example#3 使用crypt()和不同的散列类型
<?php
/* These salts are examples only, and should not be used verbatim in your code.
You should generate a distinct, correctly-formatted salt for each password.
*/
if (CRYPT_STD_DES == 1) {
echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
}
if (CRYPT_EXT_DES == 1) {
echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n";
}
if (CRYPT_MD5 == 1) {
echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n";
}
if (CRYPT_BLOWFISH == 1) {
echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA256 == 1) {
echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA512 == 1) {
echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}
?>
上面的例子会输出类似于:
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
注意
注意
:没有解密函数,因为crypt()
使用单向算法。
扩展内容
- hash_equals() - 定时攻击安全字符串比较
- password_hash() - 创建密码哈希
- md5() - 计算字符串的md5散列
- 在Mcrypt扩展
- 在您的crypt函数的Unix手册页获取更多信息
← crc32
echo →