当前位置: 首页 > 后端技术 > PHP

理解PHP的Sodium加密扩展功能

时间:2023-03-30 06:18:35 PHP

这是本加密扩展系列的最后一篇文章,也是我们要学习了解的最后一篇PHP加密扩展。Sodium的目的也是为了取代原来的加密扩展Mcrypt。在PHP7.2之后,Mcrypt已被移除,并在PHP7.1中被标记为已过时。但是,Sodium扩展的应用并不多。在大多数情况下,我们会使用OpenSSL进行加密操作。同时,Sodium扩展提供了非常多的功能,我们只需要在本文中了解即可。当然,最重要的是,就连这个扩展的官方文档也不是很完善,大部分功能参数说明都没有,搜索到的资料也很少。Sodium扩展在PHP7.2之后随PHP源代码一起发布。只需要在编译的时候加上--with-sodium就可以安装成功。如果是PHP7.2之前的版本,需要单独安装这个扩展。同时,操作系统中也需要安装libsodium-devel库。AEAD_AES_256_GCM加解密首先是这个AEAD_AES_256_GCM加解密能力函数的应用。在微信支付相关的开发中,有一个接口就是使用该方法对数据进行加密。官方文档中也提供了对应的PHP解密方法,使用了Sodium扩展库中的函数。(见文末参考文档中的第二个链接)$data='testencryption';//原始数据$nonce=random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);//加密证书的随机字符串,加密证书的随机字符串$ad='fullstackpm';//加密证书的随机字符串$kengen=sodium_crypto_aead_aes256gcm_keygen();//密钥//可用echosodium_crypto_aead_aes256gcm_is_available(),PHP_EOL;//1//加密$pem=sodium_crypto_aead_aes256gcm_encrypt,$ncrypt($$kengen);var_dump($pem);//string(28)"??VRw!??????f????l??O??tV=\x?"//Decrypt$v=sodium_crypto_aead_aes256gcm_decrypt($pem,$ad,$nonce,$kengen);var_dump($v);//string(12)“测试加密”代码中的注释已经详细说明了相关功能和参数。在微信支付中用这个解密的时候,ad、key、nonce等都是微信提供的,我们这里作为演示,都是自己生成的。sodium_crypto_aead_aes256gcm_encrypt()加密生成的内容也是二进制内容,所以是一种相对安全的加密方式。信息签名Sodium扩展库还为我们带来了验证数据是否被篡改的功能,即比对信息签名的能力。//消息签名$key=sodium_crypto_auth_keygen();//生成随机签名密钥$message='testauthenticationsignature';//生成签名$signature=sodium_crypto_auth($message,$key);var_dump($signature);//string(32)"?B?//9????l?wn?x????c?徙?u^j?"//验证签名var_dump(sodium_crypto_auth_verify($signature,$message,$key));//bool(true)他们需要的是一个简单的随机签名密钥,然后将签名摘要与原始文本进行比较,以确定数据在传输过程中是否被篡改。Hash是的,你没看错,Sodium扩展也为我们提供了一套Hash加密函数。不过它的使用比较复杂,生成的内容有点像密码哈希算法生成的内容。但是,我们仍然建议使用密码哈希算法中的password_hash()来生成此类哈希密码。//Hash$password='测试哈希';$hash=sodium_crypto_pwhash_str($password,SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,//最大计算量SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE//最大内存量);var_dump($hash);//string(92)$argonv=19$m=65536,t=2,p=1$VFfdNV4W0MFwLiLPdr9i6g$QDmd5sQToZANYTVEkPVTbPvbY7tuf1ALKU3IXrF44R0"//验证Hash信息var_dump(sodium_crypto_pwhash_str,$verify$);虽然我们可能接触不到summary(usually)/true/bool但是,确实Sodium扩展在开发中还是有实际应用的,既然微信使用这种加密方式进行数据加密,我们应该也对它有更深入的了解。不过还是希望官方能尽快完善文档,否则无法系统的学习这个扩展的内容。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E7%9A%84Sodium%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E5%87%BD%E6%95%B0%E4%BA%86%E8%A7%A3.php参考文档:https://www.php.net/manual/en/book.sodium.phphttps://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_11各媒体平台均可搜索【硬核项目经理】