这次咱们要学习的又是一个 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(); // 33for ($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

各自媒体平台均可搜寻【硬核项目经理】