justmd5 / crypto
使用私钥/公钥对数据进行加密和签名
Requires
- php: ^7.0
- ext-openssl: *
Requires (Dev)
- phpunit/phpunit: ^6.5
- symfony/var-dumper: ^3.3
This package is auto-updated.
Last update: 2024-09-22 09:38:56 UTC
README
此包允许您轻松生成私钥/公钥对,并使用这些密钥对消息进行加密/解密。
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
类型的异常。
确定数据是否可以解密
PublicKey
和 PrivateKey
类都有一个 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 以获取详细信息。
安全漏洞
请查阅我们的安全策略,了解如何报告安全漏洞。
感谢
致谢
许可协议
MIT 许可协议 (MIT)。更多信息请参阅许可文件。