gtt/crypt-bundle

提供基于各种加密组件的symfony加密/解密服务

4.0.0 2018-11-30 15:38 UTC

This package is auto-updated.

Last update: 2024-09-09 14:09:07 UTC


README

Build Status Latest Stable Version Latest Unstable Version License

提供了一个简单的配置方式,用于基于知名的加密算法对数据进行加密和解密。通过这个CryptBundle,你可以像操作基本的EncryptorInterfaceDecryptorInterface一样轻松地加密或解密数据。

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会提供EncryptorInterfaceDecryptorInterface的实现。加密算法的选择取决于你 - 你可以在包配置中指定它。

要求

仅需要PHP 5.6+和symfony/framework-bundle。

安装

应通过composer安装此包

composer require gtt/crypt-bundle

之后,您需要在您的应用程序内核中注册此包。

您可能还需要安装特定的加密库,例如

composer install zendframework/zend-crypt
composer install defuse/php-encryption

(您可以添加所需的库。所有这些都是可选的)

加密

在底层,包提供了到知名PHP组件的桥梁,以实现加密数据,作为encryptordecryptor接口的实现。这些实现作为Symfony服务注册,可供您的代码使用。有关详细信息,请参阅使用部分

配置

包配置定义了一个或多个加密器部分,它们按加密类型分组(目前支持的类型是aes和rsa),以及加密器和解密器的名称对(以下示例中的aes_binary_cryptor、aes_log_cryptor和rsa_default_cryptor)。每个加密器部分包含定义特定加密类型的加密器和解密器对的选项。您可以在使用doctrine/dbal时,开启对数据库字符串的自动加密。您可以看到一个示例,其中包含两对aes加密器和解密器的配置以及一对rsa加密器和解密器的配置,并使用rsa_default_cryptor加密数据库值。

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解码

使用方法

为了在您的代码中使用加密和解密器,您有以下三种选择

标记您的服务(推荐)

在您的服务中接收加密器或解密器,首选的方式是实现服务类中的非常简单的 EncryptorAwareInterfaceDecryptorAwareInterface。如果觉得麻烦,大多数情况下您也可以使用 traits:SingleDecryptorAwareTraitSingleEncryptorAwareTrait。之后,您应该使用 gtt.crypt.encryptor.awaregtt.crypt.decryptor.aware 标签(取决于您是想获取加密器还是解密器)标记服务,并在标签属性 cryptor_name 中指定密文名称。例如,如果您使用如 配置部分 中的配置,则 cryptor_name 属性的值可以是 aes_binary_cryptoraes_log_cryptorrsa_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_cryptoraes_log_cryptorrsa_default_cryptor 之一。您可以直接在您的包的 DI 配置中注入这些服务。

使用密文注册表

Crypt-bundle 还注册了 ID 为 gtt.crypt.registryCryptorRegistry 服务,该服务收集所有配置的加密器和解密器。您可以通过调用 getEncryptor 或 getDecryptor 方法(指定加密器或解密器的名称)来使用它获取密文。例如,如果您使用如 配置部分 中的配置,则名称可以是 aes_binary_cryptoraes_log_cryptorrsa_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]
)

支持的加密组件