Sodium 扩展在 PHP7.2 后是跟随 PHP 源码一起发布的,只须要在编译的时候加上 --with-sodium 即可安装成功。如果是 PHP7.2 之前的版本,须要单独安装这个扩展。同时,操作系统中也须要安装 libsodium-devel 库。
AEAD_AES_256_GCM 加解密首先是这个 AEAD_AES_256_GCM 加解密能力函数的运用。在微信支付干系的开拓中,有一个接口便是利用的这种办法进行数据加密,在官方文档中,也供应了 PHP 对应的解密办法,个中利用的便是 Sodium 扩展库中的函数。(见文末参考文档中第二条链接)
$data='测试加密';//原始数据$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($data,$ad,$nonce,$kengen);var_dump($pem);//string(28)"��VRw!�����f��l�O�tV=\x�"//解密$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='测试认证署名';//天生署名$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 密码。
//Hash$password='测试Hash';$hash=sodium_crypto_pwhash_str($password,SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,//最大打算量SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE//最大RAM量);var_dump($hash);//string(97)"$argon2id$v=19$m=65536,t=2,p=1$VFfdNV4W0MFwLiLPdr9i6g$QDmd5sQToZANYTVEkPVTbPvbY7tuf1ALKU3IXrF44R0"//验证Hash信息var_dump(sodium_crypto_pwhash_str_verify($hash,$password));//bool(true)
总结
虽说我们平常可能没打仗过,但是确实在开拓中 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.php
https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_11