taitava/silverstripe-encrypt-at-rest

启用数据库中数据的加密

安装: 267

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 11

类型:silverstripe-module

1.3.1 2018-08-20 20:13 UTC

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 需要验证
  • 扩展测试
  • 在尝试解密之前,测试值是否确实被加密