combodo / doctrine-encrypt-bundle
Symfony 2 的扩展包,允许使用某些加密算法在数据库中加密数据,这个分支使用了 open ssl
Requires
- php: >=5.4
- ext-openssl: *
- doctrine/orm: >=2.5
- symfony/framework-bundle: >=2.5
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 许可证。请参阅包中的完整许可证。
###版本
我正在使用语义版本控制,如此处所述