PHP 编译时未启用 OpenSSL 支持?以下是如何调用 openssl 命令行实用程序以实现相同目标的方法
<?php
// 假设 $sealed 和 $env_key 分别包含密封数据和我们的信封密钥,这些数据都由密封者提供。
//
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
openssl_open — 打开密封数据
$data
,&$output
,$encrypted_key
,$private_key
,$cipher_algo
,$iv
= null
openssl_open() 使用从 encrypted_key
中使用 private_key
解密的信封密钥打开(解密)data
。解密使用 cipher_algo
和 iv
完成。仅当密码方法需要时才需要 IV。该函数使用解密后的数据填充 output
。信封密钥通常在使用与私钥关联的公钥密封数据时生成。有关更多信息,请参阅 openssl_seal()。
data
密封的数据。
output
如果调用成功,则在此参数中返回打开的数据。
encrypted_key
可以使用 private_key
解密的加密对称密钥。
private_key
用于解密 encrypted_key
的私钥。
cipher_algo
用于解密 data
的密码方法。
PHP 8.0 之前的版本的默认值为('RC4'
),这被认为是不安全的。强烈建议显式指定安全密码方法。
iv
用于解密 data
的初始化向量。如果密码方法需要 IV,则需要它。这可以通过使用 cipher_algo
调用 openssl_cipher_iv_length() 来发现。
版本 | 描述 |
---|---|
8.0.0 |
private_key 现在接受 OpenSSLAsymmetricKey 或 OpenSSLCertificate 实例;以前,接受类型为 OpenSSL key 或 OpenSSL X.509 CSR 的 资源。 |
8.0.0 |
cipher_algo 不再是可选参数。 |
示例 #1 openssl_open() 示例
<?php
// 假设 $sealed、$env_key 和 $iv 包含密封数据、我们的信封密钥和 IV。
// 这些都由封送方提供给我们。
// 从位于 private_key.pem 的文件中获取私钥
$pkey = openssl_get_privatekey("file://private_key.pem");
// 解密数据并将其存储在 $open 中
if (openssl_open($sealed, $open, $env_key, $pkey, 'AES256', $iv)) {
echo "这是打开的数据:", $open;
} else {
echo "打开数据失败";
}
?>
PHP 编译时未启用 OpenSSL 支持?以下是如何调用 openssl 命令行实用程序以实现相同目标的方法
<?php
// 假设 $sealed 和 $env_key 分别包含密封数据和我们的信封密钥,这些数据都由密封者提供。
//
示例代码,假设 mycert.pem 是一个包含私钥和公钥的证书。
$cert = file_get_contents("mycert.pem");
$public = openssl_get_publickey($cert);
$private = openssl_get_privatekey($cert);
$data = "I'm a lumberjack and I'm okay.";
echo "数据之前: {$data}\n";
openssl_seal($data, $cipher, $e, array($public));
echo "密文: {$cipher}\n";
openssl_open($cipher, $open, $e[0], $private);
echo "解密后: {$open}\n";