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

时间:2011-01-07 19:39:24

标签: php cryptography pgp php-openssl libsodium

我有一小段一些数据(小于1kb)我希望用户代理从我的网站发送到其他网站时。为了让其他站点验证我是创建字符串的那个,我有两个选项。

  1. 服务器回复我确认(如paypal,openid等)。
  2. 我使用公钥/私钥来证明我发送了消息(如PGP,DKIM等)。
  3. 我不想设置HMAC,因为这意味着我必须为每个站点使用自定义键,这将是一个痛苦。

    在这两个选项中,似乎#2会节省带宽,这使它看起来是更好的选择。

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

5 个答案:

答案 0 :(得分:16)

使用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";

答案 1 :(得分:10)

我将使用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。

答案 2 :(得分:3)

规则1:不要自己实施,使用库。

哪个图书馆? Here are my recommended PHP public-key cryptography libraries

  1. Halite,取决于libsodium(但除了安全性外,还强调简单易用)。
  2. libsodium,来自PECL
  3. EasyRSA,在最安全的模式下使用RSA实现安全的公钥加密和公钥签名(不是PKCS1v1.5,永远!)
  4. phpseclib,EasyRSA捎带。
  5. 一般情况下,如果安全是您的目标,您将需要libsodium。你是否使用Halite是一个品味问题。

答案 3 :(得分:2)

PGP是一个不错的选择 - 它可以正确且完整地实现(即您使用PGP几乎没有安全错误的空间)。我认为this SO question可以帮助您与GnuPG进行交流。问题是其他网站是否以及如何验证您的签名。您需要符合其验证机制要求或提供您自己的模块,这些网站将用于验证。

此外,您可以使用OAuth或OpenID识别其他网站上的用户,但我不是这些技术的专家。

答案 4 :(得分:1)

我用PHP和Python编写了一个用openSSL加密和解密的例子

http://glynrob.com/php/hashing-and-public-key-encryption/

Github源代码可用。

不要忘记私钥需要在解密位置可用才能使用。