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 中的一些经验积累
Oct 09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
php 无限级缓存的类的扩展
Mar 16 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
如何用php获取文件名后缀
Jun 09 PHP
php实现的xml操作类
Jan 15 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
Mar 25 PHP
PHP设计模式之迭代器模式
Jun 17 PHP
php 实现301重定向跳转实例代码
Jul 18 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
在 PHP 和 Laravel 中使用 Traits的方法
Nov 13 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
一个更简单的无限级分类菜单代码
2007/01/16 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
详解Python当中的字符串和编码
2015/04/25 Python
浅谈python迭代器
2017/11/08 Python
python使用turtle库绘制时钟
2020/03/25 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
Python日期时间Time模块实例详解
2019/04/15 Python
Python如何使用函数做字典的值
2019/11/30 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
党员组织关系介绍信
2014/02/13 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
用Python可视化新冠疫情数据
2022/01/18 Python