在进行 hmac 加密的时候直接在第三个参数上添加 key 就可以了。
遍历所有支持的算法类型当然,就像 Hash 加密一样,Mhash 加密也是可以选择不同的算法的。我们也是直策应用干系的函数就可以看到当前环境中所支持的加密算法。
echomhash_count(),PHP_EOL;$nr=mhash_count();//33for($i=0;$i<=$nr;$i++){echosprintf("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_ 就可以了。详细支持的常量列表我们可以在官方手册中找到,在这里就不进行复制粘贴了。

其余,Mhash 还为我们供应了一个非常方便的 Salted S2K 算法可以用来方便地天生一套非常方便地密码加密内容。
//OpenPGP指定的SaltedS2K算法$hashPassword=mhash_keygen_s2k(MHASH_SHA1,'我的密码',random_bytes(2),4);echo$hashPassword,PHP_EOL;echobin2hex($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