x69420 / doctrine-encrypt-bundle
Symfony 5 扩展包,允许使用某些加密算法在数据库中对数据进行加密,这个分支利用了 OpenSSL
Requires
- php: >=7.0
- ext-json: *
- ext-openssl: *
- doctrine/cache: ^1.0
- doctrine/orm: >=2.5
- symfony/config: ^5.0
- symfony/dependency-injection: ^5.0
- symfony/http-kernel: ^5.0
- twig/twig: ^2.4 || ^3.0
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许可。请参阅捆绑包中的完整许可
###版本
我使用语义化版本控制,如此处所述