x69420/doctrine-encrypt-bundle

Symfony 5 扩展包,允许使用某些加密算法在数据库中对数据进行加密,这个分支利用了 OpenSSL

v5.0.0 2021-12-24 21:24 UTC

README

#DoctrineEncryptBundle 版本 3.0

该扩展包允许创建 doctrine 实体,其中字段将使用某些加密算法在数据库中进行保护,这对于开发者来说是清晰的,因为扩展包使用了 doctrine 生命周期事件

这是一个由 vmelnik-ukrain 创建的原始扩展包的分支,感谢他(许多感谢):[vmelnik-ukraine/DoctrineEncryptBundle](https://github.com/vmelnik-ukraine/DoctrineEncryptBundle),这是从 Marcel van Nuil 的 nepda/doctrine-encrypt 扩展包再次分支而来。

此分支的目标

我的主要目标是改进加密器:虽然存在多个加密器,但它们都基于 mcrypt 且存在缺陷。我将它们替换为 OpenSSL 替代方案,部分来自此分支(又是!):https://github.com/nepda/doctrine-encrypt/blob/master/src/DoctrineEncrypt/Encryptors/OpenSslEncryptor.php 如果作者接受合并我的更改,我可能会关闭这个分支。

我还从伟大的 payum 库中借用“SensitiveValue”和“Mask”类,以防止密钥被打印出来(更多信息,请参阅 payum 文档)。

我添加了一个 twig 扩展,以便在需要仅在显示时解码数据的情况下使用。(需要额外的努力才能完全满意,例如可选地不在实体中解码)

加密器还会抛出详细错误,并处理简单的完整性检查(数据的长度以 JSON 字符串的形式存储,并在解密端进行验证)。

此分支的范围

此文件和文档的其余部分可能仍然是分支内容。除了我更改的命名空间和作者列表外(使用搜索和替换方式)。

###它具体做什么

它允许你在每个字符串属性上添加 @Encrypt 注解

    /**
     * @var string
     * @ORM\Column(name="host", type="string", length=255)
     * @Encrypted
     */
    private $host;
    /** @var string store the decryptedVersion of $host */
    private $hostDecrypted;
    
        /**
         * Set host
         * 
         * You MUST assign null to the decryped var 
         * 
         *
         * @param string $host
         *
         * @return ItopUser
         */
        public function setHost($host)
        {
            $this->host             = $host;
            $this->hostDecrypted    = null;//mandatory if you want your host to be encoded again!
            return $this;
        }
    
        /**
         * Get host
         * 
         * You MUST return the decryped var if it is set
         * 
         * @return string
         */
        public function getHost()
        {
            if (!empty($this->hostDecrypted)) {
                return $this->hostDecrypted;
            }
            return $this->host;
        }
    
        /**
         * INTERNAL 
         * Set hostDecrypted
         *
         * @param string $host
         *
         * @return ItopUser
         */
        public function setHostDecrypted($hostDecrypted)
        {
            $this->hostDecrypted = $hostDecrypted;
    
            return $this;
        }
    
        /**
         * INTERNAL 
         * Get hostDecrypted
         *
         * @return string
         */
        public function getHostDecrypted()
        {
            return $this->hostDecrypted;
        }

该扩展包使用 doctrine 的生命周期事件在数据插入数据库时加密数据,在加载到实体管理器时解密数据。目前它只能加密字符串值,数字和其他字段将在开发过程中添加。您需要添加 *Decrypt 字段,它不得持久化,getter/setter 必须存在并具有标准名称,加密属性的 getter/setter 必须遵循上述模式

此版本 3.0 丢弃了对 2.0 的许多功能支持

为了性能和可读性,删除了许多未使用的功能

  • 不再支持嵌入式注解(我从未了解过它,所以……如果您好奇,请在谷歌上搜索 Doctrine\ORM\Mapping\Embedded
  • 不再测试注解仅模式,使用它时请了解风险;)

事件监听器已几乎完全重写,现在它使用缓存来处理大多数耗时操作,并监听许多更少的事件。它不再需要在每次 flush 时更新。

###加密数据库的优势和劣势

####优势

  • 信息存储安全
  • 不必担心在其他位置进行备份
  • 对管理数据库的员工来说难以阅读

####缺点

  • 无法对加密数据进行ORDER BY操作
  • 在SELECT WHERE语句中,WHERE值也必须进行加密
  • 当你丢失密钥时,你会丢失数据(请将密钥备份到安全位置)

###文档

此捆绑包负责对数据库中的数据进行加密/解密。所有加密/解密工作都在PHP的服务器端进行。

以下文档可用

###许可

此捆绑包采用MIT许可。请参阅捆绑包中的完整许可

###版本

我使用语义化版本控制,如此处所述