combodo/doctrine-encrypt-bundle

Symfony 2 的扩展包,允许使用某些加密算法在数据库中加密数据,这个分支使用了 open ssl

3.0.4 2017-03-17 10:47 UTC

README

#DoctrineEncryptBundle 版本 3.0

扩展包允许使用加密算法在数据库中创建 doctrine 实体字段,并使用 doctrine 生命周期事件保护,对于开发者来说很清晰,因为扩展包使用 doctrine 生命周期事件

这是由 vmelnik-ukrain 创建的原始扩展包的分支,由他创建,可以在以下位置找到: 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
  • 仅注解模式不再测试,使用时请了解风险;)

对事件监听器进行了几乎完全的重新设计,现在它大部分耗时的操作都使用缓存,并且监听的事件也少了许多。它不再需要在每次刷新时进行更新。

###加密数据库的优缺点

####优点

  • 信息存储安全
  • 无需担心在其他位置保存备份
  • 数据库管理人员无法阅读

####缺点

  • 无法在加密数据上使用 ORDER BY
  • 在 SELECT WHERE 语句中,WHERE 条件值也必须进行加密
  • 如果丢失密钥,就会丢失数据(请将密钥备份到安全的位置)

###文档

此包负责您数据库中的数据加密/解密。所有加密/解密工作都在 PHP 服务器端完成。

以下文档可供使用

###许可证

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

###版本

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