如何使用公钥/私钥加密php中的数据?

2022-08-30 20:25:13

我有一小串一些数据(小于1kb),我希望当用户代理从我的网站发送时,它们会传递给其他网站。为了让其他网站验证我是创建字符串的人,我通过两个选项。

  1. 服务器会 ping 我进行 ping 以确认(如PayPal、openid 等)。
  2. 我使用公钥/私钥来证明我发送了消息(如PGP,DKIM等)。

我不想设置HMAC,因为这意味着我必须为每个站点使用自定义密钥,这将是一个痛苦。

在这两个选择中,似乎#2可以节省带宽,这使得它似乎是一个更好的选择。

那么,如何使用PHP设置公钥/私钥加密,是否有任何缺点?


答案 1

使用 PHP Openssl 函数创建私钥和公钥对:

// Configuration settings for the key
$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key into $private_key
openssl_pkey_export($res, $private_key);

// Extract the public key into $public_key
$public_key = openssl_pkey_get_details($res);
$public_key = $public_key["key"];

然后,您可以使用私钥和公钥进行加密和解密,如下所示:

// Something to encrypt
$text = 'This is the text to encrypt';

echo "This is the original text: $text\n\n";

// Encrypt using the public key
openssl_public_encrypt($text, $encrypted, $public_key);

$encrypted_hex = bin2hex($encrypted);
echo "This is the encrypted text: $encrypted_hex\n\n";

// Decrypt the data using the private key
openssl_private_decrypt($encrypted, $decrypted, $private_key);

echo "This is the decrypted text: $decrypted\n\n";

答案 2

我会使用OpenSSL创建S / MIME公钥/私钥对,然后使用OpenSSL命令进行加密和解密。我相信这优于使用PGP,因为openssl包含在大多数Linux操作系统中,而PGP则没有。OpenSSL也是基于标准的,一旦你记下了命令,通常更容易使用。

我建议不要使用“纯 PHP”解决方案(纯 PHP 是指在 PHP 中执行加密,而不是使用 PHP 调用现有库或单独的可执行文件)。您不想在PHP中进行批量加密。太慢了。你想使用OpenSSL,因为它是高性能的,而且安全性很好理解。

这就是魔力。

要创建 X.509 密钥:

$subj="/C=US/ST=California/L=Remote/O=Country Govt./OU=My Dept/CN=Mr. Agent/emailAddress=agent@investiations.com"
openssl req -x509 -newkey rsa:1024 -keyout mycert.key -out mycert.pem -nodes -subj $subj

这将私钥放在mycert中.key公钥放在mycert.pem中。私钥不受密码保护。

现在,要使用 S/MIME 对邮件进行签名,

openssl smime -sign -signer mycert.pem -inkey mycert.key <input >output

要使用 S/MIME 加密邮件:

openssl smime -encrypt -recip yourcert.pem <input >output

要使用 S/MIME 解密邮件:

openssl smime -decrypt -inkey mycert.key -certfile mycert.pem <input >output

我还有一些关于从C语言绑定中使用OpenSSL的演示,但不是从PHP使用的。


推荐