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服务器实现多session并发运行
Oct 09 PHP
几种显示数据的方法的比较
Oct 09 PHP
php中常用字符串处理代码片段整理
Nov 07 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
php 的反射详解及示例代码
Aug 25 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 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 301转向实现代码
2008/09/18 PHP
php防止sql注入代码实例
2013/12/18 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
js实现日期级联效果
2014/01/23 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
python选择排序算法的实现代码
2013/11/21 Python
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
使用python实现生成用户信息
2017/03/20 Python
python http接口自动化脚本详解
2018/01/02 Python
python实现读取大文件并逐行写入另外一个文件
2018/04/19 Python
int在python中的含义以及用法
2019/06/27 Python
python打印异常信息的两种实现方式
2019/12/24 Python
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
计生工作先进事迹
2014/08/15 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
同意落户证明
2015/06/19 职场文书
mysql 带多个条件的查询方式
2021/06/05 MySQL
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android