这是本次加密扩大系列的最初一篇文章,也是咱们要学习理解的最初一个 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 = '测试加密'; // 原始数据
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES); // 加密证书的随机串, 加密证书的随机串
$ad = 'fullstackpm'; // 加密证书的随机串
$kengen = sodium_crypto_aead_aes256gcm_keygen(); // 密钥
// 是否可用
echo sodium_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
各自媒体平台均可搜寻【硬核项目经理】