首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

crypt

(PHP 4, PHP 5, PHP 7)

crypt - 单向字符串散列

描述

代码语言:javascript
复制
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()示例

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?php
//?Set?the?password
$password?=?'mypassword';

//?Get?the?hash,?letting?the?salt?be?automatically?generated
$hash?=?crypt($password);
?>

Example#3 使用crypt()和不同的散列类型

代码语言:javascript
复制
<?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";
}
?>

上面的例子会输出类似于:

代码语言:javascript
复制
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散列
  • 在您的crypt函数的Unix手册页获取更多信息

← crc32

echo →

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com