justmd5/crypto

使用私钥/公钥对数据进行加密和签名

v1.0.0 2020-12-31 02:35 UTC

This package is auto-updated.

Last update: 2024-09-22 09:38:56 UTC


README

Latest Version on Packagist Tests Total Downloads

此包允许您轻松生成私钥/公钥对,并使用这些密钥对消息进行加密/解密。

use Justmd5\Crypto\Rsa\KeyPair;
use Justmd5\Crypto\Rsa\PrivateKey;
use Justmd5\Crypto\Rsa\PublicKey;

// generating an RSA key pair
list($privateKey,$publicKey)   = (new KeyPair())->generate();

// when passing paths, the generated keys will be written those paths
(new KeyPair())->generate($pathToPrivateKey, $pathToPublicKey);

$data = 'my secret data';

$privateKey = PrivateKey::fromFile($pathToPrivateKey);
$encryptedData = $privateKey->encrypt($data); // returns something unreadable

$publicKey = PublicKey::fromFile($pathToPublicKey);
$decryptedData = $publicKey->decrypt($encryptedData); // returns 'my secret data'

此包中的大多数函数都是围绕 openssl_* 函数包装,以改进用户体验。

安装

您可以通过 composer 安装此包

composer require justmd5/crypto

用法

您可以使用 KeyPair 类的 generate 函数生成密钥对。

use Justmd5\Crypto\Rsa\KeyPair;

 list($privateKey,$publicKey)   = (new KeyPair())->generate();

您可以通过传递路径到 generate 函数将密钥写入磁盘。

// when passing paths, the generate keys will to those paths
(new KeyPair())->generate($pathToPrivateKey, $pathToPublicKey);

您可以使用 password 方法用密码保护私钥

 $generate = (new KeyPair())->password('my-password')->generate();
list(passwordProtectedPrivateKey,$publicKey)   = (new KeyPair())->generate();

当使用密码生成私钥时,您需要在实例化 PrivateKey 类时提供该密码。

加载密钥

要从一个文件中加载密钥,请使用 fromFile 静态方法。

Justmd5\Crypto\Rsa\PrivateKey::fromFile($pathToPrivateKey);
Justmd5\Crypto\Rsa\PublicKey::fromFile($pathToPublicKey);

或者,您还可以使用字符串创建密钥对象。

Justmd5\Crypto\Rsa\PrivateKey::fromString($privateKeyString);
Justmd5\Crypto\Rsa\PublicKey::fromString($publicKeyString);

如果私钥受密码保护,您需要将密码作为第二个参数传递。

Justmd5\Crypto\Rsa\PrivateKey::fromFile($pathToPrivateKey, $password);
Justmd5\Crypto\Rsa\PrivateKey::fromString($privateKeyString, $password);

如果您没有指定正确的密码,将会抛出 Justmd5\Crypto\Exceptions\InvalidPrivateKey 异常。

使用私钥加密消息,使用公钥解密

以下是使用私钥加密数据和如何使用公钥解密它的示例。

$data = 'my secret data';

$privateKey = Justmd5\Crypto\Rsa\PrivateKey::fromFile($pathToPrivateKey);
$encryptedData = $privateKey->encrypt($data); // encrypted data contains something unreadable

$publicKey = Justmd5\Crypto\Rsa\PublicKey::fromFile($pathToPublicKey);
$decryptedData = $publicKey->decrypt($encryptedData); // decrypted data contains 'my secret data'

如果 decrypt 无法解密给定的数据(可能是使用了与加密数据不匹配的私钥,或者数据被篡改),将会抛出 Justmd5\Crypto\Exceptions\CouldNotDecryptData 类型的异常。

使用公钥加密消息,使用私钥解密

以下是使用公钥加密数据和如何使用私钥解密它的示例。

$data = 'my secret data';

$publicKey = Justmd5\Crypto\Rsa\PublicKey::fromFile($pathToPublicKey);
$encryptedData = $publicKey->encrypt($data); // encrypted data contains something unreadable

$privateKey = Justmd5\Crypto\Rsa\PrivateKey::fromFile($pathToPrivateKey);
$decryptedData = $privateKey->decrypt($encryptedData); // decrypted data contains 'my secret data'

如果 decrypt 无法解密给定的数据(可能是使用了与加密数据不匹配的公钥,或者数据被篡改),将会抛出 Justmd5\Crypto\Exceptions\CouldNotDecryptData 类型的异常。

确定数据是否可以解密

PublicKeyPrivateKey 类都有一个 canDecrypt 方法来确定给定的数据是否可以解密。

Justmd5\Crypto\Rsa\PrivateKey::fromFile($pathToPrivateKey)->canDecrypt($data); // returns a boolean;
Justmd5\Crypto\Rsa\PublicKey::fromFile($pathToPublicKey)->canDecrypt($data); // returns a boolean;

签名和验证数据

PrivateKey 类有一个 sign 方法来生成给定数据的签名。您可以使用 PublicKey 类上的 verify 方法来验证签名是否有效。

如果 verify 返回 true,您就可以确信私钥的所有者签署了消息,并且消息没有被篡改。

$signature = Justmd5\Crypto\Rsa\PrivateKey::fromFile($pathToPrivateKey)->sign('my message'); // returns a string

$publicKey = Justmd5\Crypto\Rsa\PublicKey::fromFile($pathToPublicKey);

$publicKey->verify('my message', $signature) // returns true;
$publicKey->verify('my modified message', $signature) // returns false;

替代方案

此包旨在非常轻量级且易于使用。如果您需要更多功能,请考虑使用以下替代方案

关于 RSA 的使用说明

在编写本文时,RSA 对于我们构建此包用例来说是足够安全的。

要了解更多关于为什么 RSA 可能不足以满足您的需求的信息,请阅读 Paragonie.com 上的关于公钥加密的这篇帖子

测试

composer test

变更日志

请参阅 CHANGELOG 以获取有关最近更改的更多信息。

贡献

请参阅 CONTRIBUTING 以获取详细信息。

安全漏洞

请查阅我们的安全策略,了解如何报告安全漏洞。

感谢

spatie/crypto

致谢

许可协议

MIT 许可协议 (MIT)。更多信息请参阅许可文件