PHP

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.0PHP现在包含它自己的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散列

  • 在您的crypt函数的Unix手册页获取更多信息

← crc32

echo →