gtt / crypt-bundle
提供基于各种加密组件的symfony加密/解密服务
Requires
- php: ~7.2
- symfony/config: ^4.1
- symfony/console: ^4.1
- symfony/dependency-injection: ^4.1
- symfony/http-kernel: ^4.1
Requires (Dev)
- defuse/php-encryption: ^2.2.1
- mikey179/vfsstream: ^1.6
- phpunit/phpunit: ~7.0
- zendframework/zend-crypt: ^2.6
Suggests
- defuse/php-encryption: requires in case when symmetric cryptography is used
- zendframework/zend-crypt: required in case when zend-crypt cryptographic component is used
README
提供了一个简单的配置方式,用于基于知名的加密算法对数据进行加密和解密。通过这个CryptBundle,你可以像操作基本的EncryptorInterface或DecryptorInterface一样轻松地加密或解密数据。
use Gtt\Bundle\CryptBundle\Encryption\EncryptorInterface; use Gtt\Bundle\CryptBundle\Encryption\DecryptorInterface; class MyMagicService { /** * Encryptor * * @var EncryptorInterface */ protected $encryptor; /** * Decryptor * * @var DecryptorInterface */ protected $decryptor; public function __construct(EncryptorInterface $encryptor, DecryptorInterface $decryptor) { $this->encryptor = $encryptor; $this->decryptor = $decryptor; } public function doSomeMagic() { $someStringData = "Crypt me!"; $encrypted = $this->encryptor->encrypt($someStringData); $decrypted = $this->decryptor->decrypt($encrypted); return $someStringData == $decrypted; } }
CryptBundle会提供EncryptorInterface或DecryptorInterface的实现。加密算法的选择取决于你 - 你可以在包配置中指定它。
要求
仅需要PHP 5.6+和symfony/framework-bundle。
安装
应通过composer安装此包
composer require gtt/crypt-bundle
之后,您需要在您的应用程序内核中注册此包。
您可能还需要安装特定的加密库,例如
composer install zendframework/zend-crypt
composer install defuse/php-encryption
(您可以添加所需的库。所有这些都是可选的)
加密
在底层,包提供了到知名PHP组件的桥梁,以实现加密数据,作为encryptor和decryptor接口的实现。这些实现作为Symfony服务注册,可供您的代码使用。有关详细信息,请参阅使用部分。
配置
包配置定义了一个或多个加密器部分,它们按加密类型分组(目前支持的类型是aes和rsa),以及加密器和解密器的名称对(以下示例中的
gtt_crypt: cryptors: aes: aes_binary_cryptor: key_size: 128 key_path: "/tmp/keys/aes/first.key" binary_output: true aes_log_cryptor: key_size: 128 key_path: "/tmp/keys/aes/second.key" binary_output: false rsa: rsa_default_cryptor: private_key: "/tmp/keys/rsa/priv.key" public_key: "/tmp/keys/rsa/pub.key" binary_output: false padding: 4 doctrine: dbal: encrypted_string: rsa_default_cryptor
您可以看到支持加密类型的配置选项参考
RSA
- private_key - RSA私钥的路径
- pass_phrase - RSA私钥的密码短语
- public_key - RSA公钥的路径
- binary_output - 加密结果是否应该使用base64算法编码,或者是否应在解密前将输入字符串base64解码
- padding - 在加密消息之前添加到消息中的数据的数量。应该是以下列表中的常量之一:-- OPENSSL_PKCS1_PADDING -- OPENSSL_SSLV23_PADDING -- OPENSSL_NO_PADDING -- OPENSSL_PKCS1_OAEP_PADDING
AES
- key_size - AES密钥大小。对于1.x版本应该是128,对于2.x版本应该是256的defuse/php-encryption。
- key_path - AES私钥路径。可以通过内置的 crypt:aes:generate-key 命令生成
- binary_output - 加密结果是否应该使用base64算法编码,或者是否应在解密前将输入字符串base64解码
使用方法
为了在您的代码中使用加密和解密器,您有以下三种选择
标记您的服务(推荐)
在您的服务中接收加密器或解密器,首选的方式是实现服务类中的非常简单的 EncryptorAwareInterface 或 DecryptorAwareInterface。如果觉得麻烦,大多数情况下您也可以使用 traits:SingleDecryptorAwareTrait 和 SingleEncryptorAwareTrait。之后,您应该使用 gtt.crypt.encryptor.aware
或 gtt.crypt.decryptor.aware
标签(取决于您是想获取加密器还是解密器)标记服务,并在标签属性 cryptor_name
中指定密文名称。例如,如果您使用如 配置部分 中的配置,则 cryptor_name 属性的值可以是 aes_binary_cryptor、aes_log_cryptor 或 rsa_default_cryptor 之一。设置注入(在 EncryptorAwareInterface/DecryptorAwareInterface 接口中定义设置器)将由 CryptorInjectorPass 执行。
services: gtt_encryptor_holder: class: Your\Class\That\Wants\To\Receive\Encryptor tags: - { name: gtt.crypt.encryptor.aware, cryptor_name: "aes_binary_cryptor" } gtt_decryptor_holder: class: Your\Class\That\Wants\To\Receive\Decryptor tags: - { name: gtt.crypt.decryptor.aware, cryptor_name: "aes_binary_cryptor" }
通过服务ID直接注入密文
由 CryptBundle 配置的每个加密器或解密器都是一个服务,其ID根据以下模式构建:加密器为 gtt.crypt.encryptor.<name>
,解密器为 gtt.crypt.decryptor.<name>
,其中 <name>
是在包配置中定义的对应密文名称。例如,如果您使用如 配置部分 中的配置,则值可以是 aes_binary_cryptor、aes_log_cryptor 或 rsa_default_cryptor 之一。您可以直接在您的包的 DI 配置中注入这些服务。
使用密文注册表
Crypt-bundle 还注册了 ID 为 gtt.crypt.registry 的 CryptorRegistry 服务,该服务收集所有配置的加密器和解密器。您可以通过调用 getEncryptor 或 getDecryptor 方法(指定加密器或解密器的名称)来使用它获取密文。例如,如果您使用如 配置部分 中的配置,则名称可以是 aes_binary_cryptor、aes_log_cryptor 或 rsa_default_cryptor 之一。
加密数据库值
当启用数据库值加密时,会自动注册 encrypted_string
dbal 类型。您可以在 doctrine 实体或直接 dbal 查询中使用此类型。
use Gtt\Bundle\CryptBundle\Bridge\Doctrine\DBAL\Enum\TypeEnum; $this->connection->executeQuery( 'INSERT INTO something VALUES(:my_secret)', ['my_secret' => 'A very secret value'], ['my_secret' => TypeEnum::ENCRYPTED_STRING] )
支持的加密组件
- RSA(基于 zendframework/zend-crypt)
- AES(基于 defuse/php-encryption)