morebec/orkestra-privacy

Orkestra 组件提供隐私工具。

v2.5.6 2023-03-31 18:46 UTC

This package is auto-updated.

Last update: 2024-09-30 01:41:16 UTC


README

隐私组件提出了一组接口,用于访问 PersonalInformationStore,可以用于集中存储用户的个人可识别信息(PII),以及存储其他数据,例如存储此类信息的原因、处理操作或法律依据。

它不提供任何实现(除了一个用于测试的内存实现)。

对于实际实现,您可以查看官方的 PostgreSQLPersonalInformationStore,这是一个带有加密支持的现成 PostgreSQL 实现。

其主要目标之一是为事件源应用程序提供解决方案,使其能够在保持不可变性的同时,允许具有可遗忘的个人数据。

事件源

关于隐私法规和事件源的一个挑战是,这些隐私法规允许数据主体请求从系统中删除其个人信息,而事件源系统在本质上是不可变的。

有三种常见的解决方案,复杂性和有效性各不相同

可变事件存储

一种可能的解决方案是拥有一个可变的事件存储,即拥有一个事件存储实现,可以删除其中的一些事件。使用基于 RDBMS 或 Mongo Db 的事件存储在技术上可以轻松实现这一点。这种方法的缺点是,事件源“免费审计”的承诺不再可能,因为数据可以在概念层面上被篡改,并且可以在应用程序内部进行。

这种策略的另一个缺点是,它需要仔细操作,因为改变“过去”可能会产生难以预测的副作用,使应用程序不稳定或不可用。

可遗忘的事件有效负载

一个试图保持事件存储不可变的解决方案是,避免直接将数据存储在事件存储中,而是将数据的引用存储在另一个使用加密的安全存储中。

UserRegistered
{
    username: personal-data/x54tufojs536pzeqhelshvd7
    fullname: personal-data/folshvd7js536pzeqhex54tu
    password: personal-data/x134s5do6pzxqhelshvd8f
}

这种策略带来的挑战是,需要访问原始数据的事件消费者将需要查询个人信息系统,这增加了复杂性,可能会影响性能。

加密擦除

加密擦除是一种策略,其中在将数据存储在事件中之前对其进行加密,然后将在另一个存储中存储解密密钥。当用户行使被遗忘权时,只需简单地丢弃解密密钥,即可使信息过时且无法访问。它与可遗忘有效负载具有类似的思想,不同之处在于实际数据以加密形式保留在事件存储中。

它具有与 可遗忘事件有效负载 策略相同的挑战,以及与加密相关的附加挑战,例如密钥轮换或随时间加密减弱。事实上,如果使用了一种后来被发现较弱或无效的算法进行加密的值,数据仍然可以恢复。

值得一提的是,这仍然不清楚这是否是一项合法措施,因为数据并未根据 GDPR 等法规要求进行技术删除。

即使以加密形式,个人信息在 GDPR 中仍被视为个人数据。

使用最先进算法加密的个人数据泄露仍然属于个人数据泄露,并必须通知当局。

摘要

隐私组件可以用来支持可变事件存储和加密擦除,因为个人信息存储的API仅提供查找、更新和删除操作。从技术角度来看,建议使用“可遗忘有效载荷”策略,而不是其他两种提到的策略,因为它提供了最具有未来性和合规性的解决方案。

针对可能带来的性能影响,可以采取多种策略来最小化这种影响。

安装

composer require morebec/orkestra-orkestra-privacy

用法

为了完全使用该组件,您需要一个实现PersonalInformationStoreInterface的实例。

官方的PostgreSQLPersonalInformationStore是一个具有加密支持的现成实现。

存储与一些核心概念一起工作

  • 个人信息代表PII值,例如人的姓名、电子邮件地址、电话号码、出生日期等,以及有关如何获取数据、为何目的以及保留多长时间等附加信息。
  • 个人信息令牌代表由应用程序内部使用的令牌,用于识别特定人员。例如内部UUID,换句话说,是个人信息的主人。为了符合GDPR的要求,此值不应是自然键且容易废弃,即不应在删除其数据后用于识别自然人。它作为一组相关值的命名空间。
  • 参考令牌代表对某些给定个人信息的引用,可以在应用程序中用于引用存储中的数据。
  • 对应于与个人数据片段相关联的键名,例如电子邮件地址、用户名、电话号码等。

添加个人信息

要将个人信息添加到存储中,必须使用PersonalData类或PersonalDataInterface的实现,并将其添加到存储中

use Morebec\Orkestra\Privacy\PersonalData;
 
$personalToken='usr123456';

$data = new PersonalData($personalToken, 'emailAddress' /* key */, 'jane.doe@email.com' /* value */, 'registration_form' /* source */);
$data->disposedAt($clock->now()->addDays(15));

// You can use this reference token to reference this personal data within the store in your application code.
$referenceToken = $store->put($data);

值可以是任何PHP标量原语或标量原语数组。

如果对于相同的个人令牌组合已存在个人信息条目,它将被覆盖,有关更多信息请参阅更新数据部分。

检索个人信息

检索数据的主要方式是使用数据的参考令牌

$data = $store->findOneByReferenceToken($referenceToken);

返回值是RecordedPersonalData的实例,这是一个围绕个人数据的不可变数据结构。

如果数据不存在,将返回null

还可以查询个人信息存储以获取特定个人令牌

// Data can also be retrieved in an number of ways:
$data = $store->findOneByKeyName('user123456', 'emailAddress'); 

还可以通过个人令牌查询以获取存储中存在的所有相关个人信息。

// Returns an array of all personal data related to a personal token.
$data = $store->findByPersonalToken('user123456');

如果数据不存在,将返回null

更新数据

可以通过覆盖已存在的某些个人信息来执行数据更新,使用put方法。

use Morebec\Orkestra\Privacy\PersonalData;
$data = new PersonalData('usr123456', 'emailAddress', 'jane.doe123@email.com', 'account_settings');

$referenceToken = $store->put($data);

如果数据不存在,则相当于将新数据添加到存储中。

或者使用更明确的replace方法。

use Morebec\Orkestra\Privacy\PersonalData;
$data = new PersonalData('usr123456', 'emailAddress', 'jane.doe123@email.com', 'account_settings');

$referenceToken = $store->replace($referenceToken, $data);

删除数据

有两种不同的方法可以从存储中删除数据。

第一种是通过指定个人令牌组合。

$store->removeByKeyName('user123456', 'emailAddress');

另一种方法是通过指定仅个人令牌并使用erase方法。

// Deletes all records for a given personal token.
$store->erase('user123456');

这将导致删除与该个人令牌相关的所有个人信息。

删除可丢弃数据

PersonalDataInterface 有一个值,表示数据应被视为可丢弃的 DateTime。这种可丢弃的特性用于防止无限期且无活跃使用地存储信息。为了方便清理存储中的过期数据,这个包包含了一个 DisposedPersonalDataRemoverInterface

$remover->run(); // Will remove all disposable data as of the current date time.