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与C#分别格式化文件大小的代码
May 14 PHP
php和javascript之间变量的传递实现代码
Dec 19 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
php不使用copy()函数复制文件的方法
Mar 13 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 PHP
PHP操作Redis常用技巧总结
Apr 24 PHP
PHP调用接口用post方法传送json数据的实例
May 31 PHP
Yii框架响应组件用法实例分析
Sep 04 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 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
星际玩家的三大定律
2020/03/04 星际争霸
解析如何用php screw加密php源代码
2013/06/20 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
jQuery中last()方法用法实例
2015/01/06 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
axios基本入门用法教程
2017/03/25 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
神经网络python源码分享
2017/12/15 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
MIS软件工程师的面试题
2016/04/22 面试题
农业大学毕业生的个人自我评价
2013/10/11 职场文书
医学院校毕业生自荐信范文
2014/01/01 职场文书
中餐厅主管的职责范文
2014/02/04 职场文书
公司承诺书格式
2014/05/21 职场文书
投标承诺函范文
2015/01/21 职场文书
遗愿清单观后感
2015/06/09 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL