dq042000/laminas-doctrine-encrypt

当在Laminas中使用时,为Doctrine实体提供属性加密和哈希处理

v2.6.1 2023-12-28 03:56 UTC

This package is auto-updated.

Last update: 2024-09-28 05:38:39 UTC


README

提供Laminas & Doctrine 2加密模块。支持Mezzio。

安装

composer require somecoding/laminas-doctrine-encrypt

要求

  • PHP 8.1或更高版本(必须启用Sodium扩展)

如果你使用Windows系统,并且使用Xampp,PHP 8.1的安装可能不会自动启用Sodium扩展。如果是这种情况,你会得到一个错误('This is not implemented, as it is not possible to securely wipe memory from PHP')。通过向你的php.ini文件中添加以下内容来为PHP启用Sodium

extension = C:\xampp\php\ext\php_sodium.dll

这也可能适用于其他本地安装。

配置

Zend Framework / Laminas

请确保将模块添加到你的应用程序配置中。在你的modules.config.php文件中,确保包含Keet\\Encrypt

附加

使用的配置使用了别名,如hashing_serviceencryption_adapter。你可以用你自己的配置覆盖它们以实现你自己的服务和/或适配器类。如果实现了正确的接口类,这些类将自动由本模块使用。但在做这些之前,请确保阅读代码。

模块

提供了*.dist文件。将这些文件(移除扩展名)复制到你的应用程序中,并填写所需的关键/盐值。如果已填写,则可以使用Halite进行加密。

然而,必须指出,在编写此README时,Halite模块包含重复的const声明,因此你必须在你的PHP配置中禁用E_NOTICE警告 :(

Mezzio

当使用Mezzio时,你需要在config/config.php文件中添加ConfigProvider。

    \Keet\Encrypt\ConfigProvider::class,

当声明实体的路径时(可能是包含App\ConfigProvider的文件),请确保以数组的形式传递路径。

    'my_entity' => [
        'class' => AnnotationDriver::class,
        'cache' => 'array',
        'paths' => [ __DIR__ . '/Entity' ],
    ],

注解示例

加密

简单来说,假设你有一个Address实体,根据EU GDPR法规,地址的部分,如街道,需要加密。这使用默认配置所需的关键和盐

要加密一个街道名称,添加@Encrypted,如下所示

/**
 * @var string
 * @ORM\Column(name="street", type="text", nullable=true)
 * @Encrypted
 */
protected $street;

默认情况下,加密服务假设要加密的数据类型为string。然而,你可能需要加密其他类型的数据,例如门牌号。支持非字符串类型,但如果不是字符串,则必须提供数据类型。你可以这样做

/**
 * @var int
 * @ORM\Column(name="house_number", type="text", nullable=false)
 * @Encrypted(type="int")
 */
protected $houseNumber;

支持的类型可以在这里找到

密文表示

密文始终是长度可变且长度始终大于255个字符的字符串。因此,你应该使用能够表示其完整长度的数据类型。请注意,任何非字符串属性在数据库中都将被处理为字符串表示。

哈希处理

比如说你想存储一个密码,它应该与上面的大致相同。然而,这是不应该解密的数据(并且没有解密的需要),因此你应该对它进行哈希处理。

要对某些内容进行散列,例如密码,添加@Hashed注解。下面是示例。

/**
 * @var string
 * @ORM\Column(name="password", type="text", nullable=false)
 * @Hashed
 */
protected $password;

注意,与@Encrypted不同,没有提供类型选项。因为我们无法解密数据(它是一向的),所以不需要知道原始类型是什么。响应总是字符串值。

控制器示例

哈希处理

提供了一个HashingService。此服务也使用HashingAdapter,但提供了可以在控制器和其他类(如插件)中使用的功能。服务在别名'hashing_service'下注册。您可以在自己的项目中重写'hashing_service'以提供自己的实现。

HashingService提供了散列和验证字符串的能力。这是两个独立的操作,一个是一向散列字符串。另一个(需要散列字符串)执行相同的操作,然后验证两个字符串是否完全相同(从而验证)。

在控制器中,要散列字符串,只需这样做

$secret = $this->getHashingService()->hash('correct horse battery staple');

为了验证您下次处理的是相同的字符串,例如在登录时比较密码,请这样做

$verified = $this->getHashingService()->verify('correct horse battery staple', $secret);

$verified将被设置为布尔值。

为了不超过必须存储的时间存储任何输入数据,您可以直接从表单数据中比较,如下所示

if($form->isValid() && $this->getHashingService()->verify($form->getData()['password_field'], $user->getPassword()) {
    // do other things
}

加密

还提供了一个EncryptionService,其工作方式与HashingService非常相似。它提供了加密和解密数据的功能。

要加密数据,请这样做

$encrypted = $this->getEncryptionService()->encrypt('correct horse battery staple');

要解密数据,请这样做

$decrypted = $this->getEncryptionService()->decrypt($string);