这次我们要学习的又是一个 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://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84Mhash%E6%89%A9%E5%B1%95%E5%87%BD%E6%95%B0%E7%9A%84%E5%AD%A6%E4%B9%A0.php

参考文档:

https://www.php.net/manual/zh/book.mhash.php

PHP的Mhash扩展函数的学习的更多相关文章

  1. 学习PHP中统计扩展函数的使用

    做统计相关系统的朋友一定都会学习过什么正态分布.方差.标准差之类的概念,在 PHP 中,也有相应的扩展函数是专门为这些统计相关的功能所开发的.我们今天要学习的 stats 扩展函数库就是这类操作函数. ...

  2. 学习PHP中的任意精度扩展函数

    今天来学习的是关于数学方面的第一个扩展.对于数学操作来说,无非就是那些各种各样的数学运算,当然,整个程序软件的开发过程中,数学运算也是最基础最根本的东西之一.不管你是学得什么专业,到最后基本上都会要学 ...

  3. jQuery学习(二) 自定义扩展函数

    jQuery函数调用写法很优雅,在项目开发过程中,有需要自定义函数经常被使用到,将这些函数放置到项目ExtTool.js中,为了编码方式的统一,也希望这些自定义函数与jQuery函数一致的调用方式.在 ...

  4. knockoutJS学习笔记02:jsRender模板引擎

    上一篇最后提到了模板,并尝试自己编写一个最简单版本:有些朋友可能用过 jqtmpl,这是一个基于jquery的模板引擎,不过它已经不再更新了,而且据说渲染速度比较慢.这里介绍另外一个模板引擎:jsRe ...

  5. C#学习笔记

    1.C#中[],List,Array,ArrayList的区别 [] 是针对特定类型.固定长度的. List 是针对特定类型.任意长度的. Array 是针对任意类型.固定长度的. ArrayList ...

  6. SQLite XXTea加密学习

    这几天优化数据库读写,移植了xxtea加密到最新的数据库sqlite 3.12.2里,一些好文章放在这里.移植后,数据库读写性能异常优秀! 这几天又发现,数据库还是发生了无法写入情况,数据库崩溃掉了. ...

  7. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  8. 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...

  9. C语言(函数)学习之strstr strcasestr

    C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...

随机推荐

  1. 图 邻接表 邻接矩阵 BFS生成树 DFS生成树

  2. 【SpringMVC】SpringMVC搭建框架

    开发环境 IDE:idea 2019.3.2 构建工具:maven3.5.4 服务器:tomcat 9.0.30 Spring版本:5.3.1 创建maven工程 添加打包方式:war 引入依赖 &l ...

  3. WPF教程(四)RelativeSource属性

    我们进行Bingding时,如果明确知道数据源的Name,就能用Source或者ElementName进行绑定,但是有时候我们需要绑定的数据源可能没有明确的Name,此时我们就需要利用Bingding ...

  4. JDBC中级篇(MYSQL)——处理大文本(CLOB)

    注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package b_blob_clob; import java.io.FileNotFoundException; import ...

  5. 原来:HTTP可以复用TCP连接

    问题 线上的一个项目会和微信服务器有API请求(目的是获取用户的微信信息),但会有偶发的报错: 'Connection aborted.', ConnectionResetError(104, 'Co ...

  6. HCNP Routing&Switching之OSPF虚连接

    前文我们了解了OSPF的网络类型.帧中继交换机映射以及路由器帧中继映射相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15195762.html:今天我 ...

  7. Win10安装gcc

    使用MinGW安装gcc 1.下载MinGW,地址 https://sourceforge.net/projects/mingw/files/ ,选择Download mingw-get-setup. ...

  8. ES6扩展——箭头函数

    1.箭头函数 在es6中,单一参数的单行箭头函数语法结构可以总结如下: const 函数名 = 传入的参数 => 函数返回的内容,因此针对于 const pop = arr => arr. ...

  9. ros-kinetic install error: sudo rosdep init ImportError: No module named 'rosdep2'

    refer to: https://blog.csdn.net/yueyueniaolzp/article/details/85070093 方法一 将Ubuntu默认python版本设置为2.7 方 ...

  10. SQL查询数据库名、表名、列名

    1.获取所有用户名SELECT name FROM Sysusers where status='2' and islogin='1'islogin='1'表示帐户islogin='0'表示角色sta ...