PHP crypt()函数的用法讲解


Posted in PHP onFebruary 15, 2019

PHP crypt() 函数

定义和用法

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

在不同的操作系统上,该函数的行为不同,某些操作系统支持一种以上的算法类型。在安装时,PHP 会检查什么算法可用以及使用什么算法。

确切的算法依赖于 salt 参数的格式和长度。salt 可以通过增加由一个特定字符串与一个特定的加密方法生成的字符串的数量来使得加密更安全。

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

常量:

  • [CRYPT_SALT_LENGTH] - 默认的加密长度。使用标准的 DES 加密,长度为 2
  • [CRYPT_STD_DES] - 标准的基于 DES 加密有 2 个字符的 salt,来自字母表 "./0-9A-Za-z"。在 salt 中使用无效的字符将引发函数失败。
  • [CRYPT_EXT_DES] - 扩展的基于 DES 加密有 9 个字符的 salt,由 1 个下划线,后边跟 4 个字节的迭代次数和 4 个字节的 salt 组成。这些被编码为可打印字符,每个字符 6 位,最低有效字符优先。值 0 到 63 被编码为 "./0-9A-Za-z"。在 salt 中使用无效的字符将引发函数失败。
  • [CRYPT_MD5] - MD5 加密有 12 个字符的 salt,以 $1$ 开始。
  • [CRYPT_BLOWFISH] - Blowfish 加密有一个以 $2a$、$2x$ 或 $2y$ 开始的 salt,一个两位数的 cost 参数 "$",以及来自字母表 "./0-9A-Za-z" 中的 22 个字符。使用字母表以外的字符将引发函数返回一个长度为 0 的字符串。"$" 参数是以 2 为底的基于 Blowfish 散列算法的迭代次数的对数,必须在 04-31 范围内。在该范围以外的值将引发函数失败。
  • [CRYPT_SHA_256] - SHA-256 加密有 16 个字符的 salt,以 $5$ 开始。如果 salt 字符串以 "rounds=$" 开始,N 的数字值用于表示散列循环被执行的次数,这与 Blowfish 中的 cost 参数类似。默认的循环次数是 5000,最小值是 1000,最大值是 999,999,999。任何超出这个范围的 N 的值将会转换成最接近的边界值。
  • [CRYPT_SHA_512] - SHA-512 加密有 16 个字符的 salt,以 $6$ 开始。 如果 salt 字符串以 "rounds=$" 开始,N 的数字值用于表示散列循环被执行的次数,这与 Blowfish 中的 cost 参数类似。默认的循环次数是 5000,最小值是 1000,最大值是 999,999,999。任何超出这个范围的 N 的值将会转换成最接近的边界值。

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

注释: 没有相应的解密函数。crypt() 函数使用一种单向算法。

语法

crypt( _str,salt_ )

PHP crypt()函数的用法讲解

PHP crypt()函数的用法讲解

实例 1

<?php $hashed_password = crypt('mypassword'); // 自动生成盐值 /* 你应当使用 crypt()
得到的完整结果作为盐值进行密码校验,以此来避免使用不同散列算法导致的问题。(如上所述,基于标准 DES 算法的密码散列使用 2 字符盐值,但是基于 MD5
算法的散列使用 12 个字符盐值。)*/ if (hash_equals($hashed_password, crypt($user_input,
$hashed_password))) { echo "Password verified!"; } ?>

实例 2

利用 htpasswd 进行 crypt() 加密:

<?php // 设置密码 $password = 'mypassword'; // 获取散列值,使用自动盐值 $hash =
crypt($password); ?>

实例 1

在本实例中,我们以不同散列类型使用:

<?php 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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
eWebEditor v3.8 商业完整版 (PHP)
Dec 06 PHP
Session保存到数据库的php类分享
Oct 24 PHP
深入解析php之sphinx
May 15 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
destoon数据库表说明汇总
Jul 15 PHP
php上传文件问题汇总
Jan 30 PHP
PHP积分兑换接口实例
Feb 09 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
php实现可逆加密的方法
Aug 11 PHP
php验证手机号码
Nov 11 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
PHP依赖注入原理与用法分析
Aug 21 PHP
phpinfo无法显示的原因及解决办法
Feb 15 #PHP
实例介绍PHP中zip_open()函数用法
Feb 15 #PHP
PHP echo()函数讲解
Feb 15 #PHP
PHP crc32()函数讲解
Feb 14 #PHP
PHP count_chars()函数讲解
Feb 14 #PHP
PHP让网站移动访问更加友好方法
Feb 14 #PHP
PHP的curl函数的用法总结
Feb 14 #PHP
You might like
PHP 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
繁简字转换功能
2006/07/19 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python中使用序列的方法
2015/08/03 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python调用c++传递数组的实例
2019/02/13 Python
Python安装selenium包详细过程
2019/07/23 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
网站客服岗位职责
2014/04/05 职场文书
安全生产月活动总结
2014/05/04 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
销售代理协议书
2014/09/30 职场文书
网络妈妈观后感
2015/06/08 职场文书
结婚仪式主持词
2015/06/29 职场文书
HTTP中的Content-type详解
2022/01/18 HTML / CSS