taitava / silverstripe-encrypt-at-rest
启用数据库中数据的加密
1.3.1
2018-08-20 20:13 UTC
Requires
- defuse/php-encryption: 2.0.x
- silverstripe/framework: >=3.4.0
This package is auto-updated.
Last update: 2024-09-16 05:37:10 UTC
README
silverstripe-encrypt-at-rest
此模块允许在数据库中对数据进行加密,但在从数据库提取时使用秘密密钥(希望只有网络服务器知道)进行解密。
注意: 此方法除了数据库泄露的情况外,不能提供显著的保护。它应该作为分层安全策略的一部分使用。这是因为密钥仍然在网络服务器上,如果攻击者通过远程代码执行获得访问权限,他们可以读取数据库和加密密钥,从而解密内容。
注意: 此模块尚未准备好实际使用,目前处于 v0.0.1 版本。
用法
在您的 DataObject 中,使用 EncryptedDBField 来加密它。在此阶段,所有内容都存储为文本。
在您的 _ss_environment
文件中设置一个密钥。
define('ENCRYPT_AT_REST_KEY', 'mysupersecretlonghexkeyhere1234567890');
特定于 DataObject 的加密密钥
另一种可选的、更高级的设置密钥的方法是在您的 DataObject 类中创建一个可选的方法
class MyDataObject extends DataObject { private static $db = array( 'MyEncryptedField' => 'EncryptedText' ); public function provideEncryptionKey($field_name, $field_type) { return *A custom key here*; } }
这样,您可以拥有多个密钥,并能够决定在何种情况下使用哪个密钥。您可以选择返回 Defuse\Crypto\Key 对象或密钥的纯字符串表示。如果您想坚持使用在 ENCRYPT_AT_REST_KEY
常量中定义的默认密钥,也可以返回 null
。如果根本不创建 provideEncryptionKey()
方法,也会使用后者。
$field_name
和 $field_type
参数可以用来了解当前正在加密/解密的字段是哪个。后者参数告诉字段的类型类,例如 EncryptedText
。
待办事项
- 确保 $this->value 一直是未加密的值
- 清理
- EncryptedEnum 需要验证
- 扩展测试
- 在尝试解密之前,测试值是否确实被加密