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 相关文章推荐
用PHP实现Ftp用户的在线管理的代码
Mar 06 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
php中批量替换文件名的实现代码
Jul 20 PHP
php随机输出名人名言的代码
Oct 07 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
php异步多线程swoole用法实例
Nov 14 PHP
php计算2个日期的差值函数分享
Feb 02 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
PHP实现将标点符号正则替换为空格的方法
Aug 09 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 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
用session做客户验证时的注意事项
2006/10/09 PHP
PHP Token(令牌)设计
2008/03/15 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
IE和Firefox下event事件杂谈
2009/12/18 Javascript
JS 遮照层实现代码
2010/03/31 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
Angular2开发——组件规划篇
2017/03/28 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
Python的Django框架中settings文件的部署建议
2015/05/30 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
python 全局变量的import机制介绍
2017/09/07 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
Java语言程序设计测试题判断题部分
2013/01/06 面试题
送给程序员的20个Java集合面试问题
2014/08/06 面试题
会计职业生涯规划书
2014/01/13 职场文书
班组长岗位职责
2014/03/03 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
mysql事务隔离级别详情
2021/10/24 MySQL