PHP的Mhash扩展函数的学习
这次我们要学习的又是一个 Hash 加密扩展。不过这个扩展 Mhash 已经集成在了 Hash 扩展中。同时也需要注意的是,这个扩展已经不推荐使用了,我们应该直接使用 Hash 扩展中的函数来进行 Hash 加密操作。所以,我们今天仍然是以学习为目的的进行了解。关于 Hash 扩展的内容,我们可以查看之前的文章:PHP的Hash信息摘要扩展框架 。
加密散列函数的使用
$hash = mhash(MHASH_MD5, "测试Mhash");
echo $hash, PHP_EOL;
echo bin2hex($hash), PHP_EOL;
// /�8�><�۠�P4q�j�
// 2fcb38e93e3cc8dba09f503471846a9d
$hash = hash('md5', "测试Mhash");
echo $hash, PHP_EOL;
// 2fcb38e93e3cc8dba09f503471846a9d
$hash = mhash(MHASH_MD5, "测试Mhash", 'hmac secret');
echo $hash, PHP_EOL;
echo bin2hex($hash), PHP_EOL;
// �k�<F�m �OM����
// b86bb83c46b76d09be4f4daf18ebfe85
从代码中可以看出,mhash() 函数和 hash() 的使用非常像,当然,他们的作用也是一样的。不过,mhash() 函数加密出来的直接是二进制的,我们将这个内容通过 bin2hex() 转成 16 进制之后就可以看到和普通的 hash() 函数加密的结构是完全相同的了。
在进行 hmac 加密的时候直接在第三个参数上添加 key 就可以了。
遍历所有支持的算法类型
当然,就像 Hash 加密一样,Mhash 加密也是可以选择不同的算法的。我们也是直接使用相关的函数就可以看到当前环境中所支持的加密算法。
echo mhash_count(), PHP_EOL;
$nr = mhash_count(); // 33
for ($i = 0; $i <= $nr; $i++) {
echo sprintf("Hash:%s,块大小为: %d\n",
mhash_get_hash_name($i),
mhash_get_block_size($i));
}
// Hash:CRC32,块大小为: 4
// Hash:MD5,块大小为: 16
// Hash:SHA1,块大小为: 20
// Hash:HAVAL256,块大小为: 32
// Hash:,块大小为: 0
// Hash:RIPEMD160,块大小为: 20
// Hash:,块大小为: 0
// Hash:TIGER,块大小为: 24
// Hash:GOST,块大小为: 32
// Hash:CRC32B,块大小为: 4
// Hash:HAVAL224,块大小为: 28
// Hash:HAVAL192,块大小为: 24
// Hash:HAVAL160,块大小为: 20
// Hash:HAVAL128,块大小为: 16
// Hash:TIGER128,块大小为: 16
// Hash:TIGER160,块大小为: 20
// Hash:MD4,块大小为: 16
// Hash:SHA256,块大小为: 32
// Hash:ADLER32,块大小为: 4
// Hash:SHA224,块大小为: 28
// Hash:SHA512,块大小为: 64
// Hash:SHA384,块大小为: 48
// Hash:WHIRLPOOL,块大小为: 64
// Hash:RIPEMD128,块大小为: 16
// Hash:RIPEMD256,块大小为: 32
// Hash:RIPEMD320,块大小为: 40
// Hash:,块大小为: 0
// Hash:SNEFRU256,块大小为: 32
// Hash:MD2,块大小为: 16
// Hash:FNV132,块大小为: 4
// Hash:FNV1A32,块大小为: 4
// Hash:FNV164,块大小为: 8
// Hash:FNV1A64,块大小为: 8
// Hash:JOAAT,块大小为: 4
在 PHP 中也提供了非常多的常量来代表这些算法,比如在前一段代码中我们使用的 MHASH_MD5 。其实就是我们遍历的这些内容在前面加上 MHASH_ 就可以了。具体支持的常量列表我们可以在官方手册中找到,在这里就不进行复制粘贴了。
Salted S2K 算法生成密码摘要
另外,Mhash 还为我们提供了一个非常方便的 Salted S2K 算法可以用来方便地生成一套非常方便地密码加密内容。
// OpenPGP 指定的 Salted S2K 算法
$hashPassword = mhash_keygen_s2k(MHASH_SHA1, '我的密码', random_bytes(2), 4);
echo $hashPassword, PHP_EOL;
echo bin2hex($hashPassword), PHP_EOL;
// �-!=
// 101ab899
当然,这个算法也是比较安全的,有 salt 参数,并且它可以指定返回的数据长度。它返回的也是二进制的数据,如果需要保存标准的文本内容也需要将其转化为 16 进制的形式。不过相对来说,我反而觉得这种直接生成二进制内容的还更安全一些。
总结
不同的函数有不同的应用场景,但其实 Mhash 已经没有什么特别的应用场景了,毕竟 Hash 扩展中的相关函数已经完全能够替代它的作用了,而且还更加的丰富易用。大家如果在老的项目中见到这些函数的使用,也完全可以慢慢的通过重构替换到新的函数。
测试代码:
参考文档:
https://www.php.net/manual/zh/book.mhash.php
PHP的Mhash扩展函数的学习的更多相关文章
- 学习PHP中统计扩展函数的使用
做统计相关系统的朋友一定都会学习过什么正态分布.方差.标准差之类的概念,在 PHP 中,也有相应的扩展函数是专门为这些统计相关的功能所开发的.我们今天要学习的 stats 扩展函数库就是这类操作函数. ...
- 学习PHP中的任意精度扩展函数
今天来学习的是关于数学方面的第一个扩展.对于数学操作来说,无非就是那些各种各样的数学运算,当然,整个程序软件的开发过程中,数学运算也是最基础最根本的东西之一.不管你是学得什么专业,到最后基本上都会要学 ...
- jQuery学习(二) 自定义扩展函数
jQuery函数调用写法很优雅,在项目开发过程中,有需要自定义函数经常被使用到,将这些函数放置到项目ExtTool.js中,为了编码方式的统一,也希望这些自定义函数与jQuery函数一致的调用方式.在 ...
- knockoutJS学习笔记02:jsRender模板引擎
上一篇最后提到了模板,并尝试自己编写一个最简单版本:有些朋友可能用过 jqtmpl,这是一个基于jquery的模板引擎,不过它已经不再更新了,而且据说渲染速度比较慢.这里介绍另外一个模板引擎:jsRe ...
- C#学习笔记
1.C#中[],List,Array,ArrayList的区别 [] 是针对特定类型.固定长度的. List 是针对特定类型.任意长度的. Array 是针对任意类型.固定长度的. ArrayList ...
- SQLite XXTea加密学习
这几天优化数据库读写,移植了xxtea加密到最新的数据库sqlite 3.12.2里,一些好文章放在这里.移植后,数据库读写性能异常优秀! 这几天又发现,数据库还是发生了无法写入情况,数据库崩溃掉了. ...
- opengl入门学习
OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...
- 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...
- C语言(函数)学习之strstr strcasestr
C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...
随机推荐
- Java的安装过程和开发环境
首先需要安装jdk(Java Development Kit开发工具包) 下载地址:https://www.oracle.com/java/technologies/javase-downloads. ...
- 题解 Cover
传送门 考场上坚持认为树上背包可以有70pts,于是爆零了 首先我以为是树上背包的部分分其实是树形DP 然后极其魔鬼的正解: 首先我们令 \(dp[i][j]\) 为以i为根的子树覆盖次数至多为j时的 ...
- spring cloud 网管篇zuul
1, consul 2, zuul 程序的yml 文件 server: port: 8083spring: application: name: zuulInfo # 应用名称 cloud: cons ...
- UWP App Data存储和获取
这篇博客介绍如何在UWP开发时,如何存储App Data和获取. App Data是指用户的一些设定,偏好等.例如,App的主题,是否接收推送,离线接收消息等.需要区分下App Data和User D ...
- Spring PropertyPlaceholderConfigurer 自定义扩展
原文地址:https://blog.csdn.net/feiyu8607/article/details/8282893 Spring中PropertyPlaceholderConfigurer这个类 ...
- Docker是简介
Docker是什么 使用最广泛的开源容器引擎 一种操作系统级的虚拟化技术 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制) 一个简单的应用程序打包工具 D ...
- 关于MYSQL5.7:Access denied for user 'root'@'localhost' (using password:YES)解决
这一类解决要提供远程服务,需要进入mysql的my.ini文件中进行修改,但是在win10系统中,my.ini不再放在MYSQL安装目录的根目录中了,需要到一类应用缓存目录中寻找MYSQL的详细配置文 ...
- Servlet的特点及运行过程
- 微信小程序学习笔记三 路由的基本使用
小程序中路由的使用 1.1 页面路由 在小程序中, 所有页面的路由全部由框架进行管理 1.2 页面栈 框架以栈的形式维护了当前的所有页面, 当发生路由切换的时候, 页面栈的表现如下: 1.3 获取当前 ...
- 关于ubuntu使用的那些事儿
时间:2019-04-09 整理:PangYuaner 标题:Ubuntu18.04安装微信(Linux通用) 地址:https://www.cnblogs.com/dotnetcrazy/p/912 ...