morebec / orkestra-privacy
Orkestra 组件提供隐私工具。
Requires
- php: >=7.4
- morebec/orkestra-datetime: ^2.5.6
Requires (Dev)
- ext-dom: *
- friendsofphp/php-cs-fixer: ^2.16
- phpstan/phpstan: ^0.12.7
- phpunit/phpunit: ^9.5
- symfony/var-dumper: 5.*
Suggests
- morebec/orkestra-postgresql-personal-information-store: PostgreSQL implementation of the Personal Information Store with encryption
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.