当前位置: 首页 > news >正文

Hyperf方案 数据隐私合规(GDPR)

GDPR 合规涉及几个核心维度,用组合方案最实用: ┌───────────────┬───────────────────────────────┬──────────────────┐ │ 维度 │ 库 │ 说明 │ ├───────────────┼───────────────────────────────┼──────────────────┤ │ 个人数据加密 │ 原生 openssl │ 零依赖,PHP 内置 │ ├───────────────┼───────────────────────────────┼──────────────────┤ │ 数据匿名化 │ webnet-fr/database-anonymizer │ CLI + PHP API │ ├───────────────┼───────────────────────────────┼──────────────────┤ │ 审计日志 │ Hyperf ORM 事件 │ 原生支持 │ ├───────────────┼───────────────────────────────┼──────────────────┤ │ 数据导出/删除 │ 自实现接口 │ GDPR Art.17/20 │ └───────────────┴───────────────────────────────┴──────────────────┘ --- 安装composerrequire webnet-fr/database-anonymizer ---1. 个人数据加密(字段级)<?php namespace App\Trait;trait EncryptsPersonalData{private static string$cipher='aes-256-gcm';publicfunctionencryptPII(string$value): string{$key=base64_decode(env('PII_ENCRYPTION_KEY'));$iv=random_bytes(12);$tag='';$encrypted=openssl_encrypt($value, self::$cipher,$key, OPENSSL_RAW_DATA,$iv,$tag);returnbase64_encode($iv.$tag.$encrypted);}publicfunctiondecryptPII(string$value): string{$key=base64_decode(env('PII_ENCRYPTION_KEY'));$raw=base64_decode($value);$iv=substr($raw,0,12);$tag=substr($raw,12,16);$data=substr($raw,28);returnopenssl_decrypt($data, self::$cipher,$key, OPENSSL_RAW_DATA,$iv,$tag);}}Model 中使用: class User extends Model{use EncryptsPersonalData;// 自动加解密 publicfunctionsetEmailAttribute(string$v): void{$this->attributes['email']=$this->encryptPII($v);}publicfunctiongetEmailAttribute(string$v): string{return$this->decryptPII($v);}}---2. 数据匿名化配置(webnet-fr) config/anonymizer.yaml: tables: users: email: generator: faker formatter: safeEmail name: generator: faker formatter: name phone: generator: faker formatter: phoneNumber ip_address: generator: faker formatter: ipv4 执行匿名化(测试环境/数据导出前): php vendor/bin/database-anonymizer anonymize--config=config/anonymizer.yaml ---3. 审计日志中间件<?php namespace App\Middleware;use App\Model\GdprAuditLog;use Psr\Http\Message\ResponseInterface;use Psr\Http\Message\ServerRequestInterface;use Psr\Http\Server\MiddlewareInterface;use Psr\Http\Server\RequestHandlerInterface;class GdprAuditMiddleware implements MiddlewareInterface{private array$sensitiveRoutes=['/api/users','/api/profile'];publicfunctionprocess(ServerRequestInterface$request, RequestHandlerInterface$handler): ResponseInterface{$response=$handler->handle($request);if($this->isSensitive($request->getUri()->getPath())){GdprAuditLog::create(['user_id'=>auth()->id(),'action'=>$request->getMethod(),'resource'=>$request->getUri()->getPath(),'ip'=>$request->getServerParams()['remote_addr']??'','created_at'=>now(),]);}return$response;}privatefunctionisSensitive(string$path): bool{returnstr_starts_with($path, implode('|',$this->sensitiveRoutes))||collect($this->sensitiveRoutes)->contains(fn($r)=>str_starts_with($path,$r));}}---4. GDPR 权利接口(Art.17 删除 / Art.20 导出)<?php namespace App\Controller;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\DeleteMapping;use Hyperf\HttpServer\Annotation\GetMapping;#[Controller(prefix: '/api/gdpr')]class GdprController{// Art.20 数据可携带权 - 导出#[GetMapping(path: 'export')]publicfunctionexport(): array{$user=auth()->user();return['exported_at'=>now()->toIso8601String(),'data'=>['profile'=>$user->only(['name','email','created_at']),'orders'=>$user->orders()->get(['id','total','created_at']),'activity'=>GdprAuditLog::where('user_id',$user->id)->get(),],];}// Art.17 被遗忘权 - 删除#[DeleteMapping(path: 'erase')]publicfunctionerase(): array{$user=auth()->user();// 匿名化而非物理删除(保留业务完整性)$user->update(['name'=>'Deleted User','email'=>"deleted_{$user->id}@removed.invalid",'phone'=>null,'deleted_at'=>now(),]);GdprAuditLog::create(['user_id'=>$user->id,'action'=>'ERASE_REQUEST','resource'=>'user_account',]);return['status'=>'erased'];}}---5. 数据保留策略(定时清理)<?php namespace App\Crontab;use Hyperf\Crontab\Annotation\Crontab;#[Crontab(rule: '0 2 * * *', name: 'GdprRetention', singleton: true)]class GdprRetentionCrontab{publicfunctionexecute(): void{// 删除超过保留期的数据(GDPR 要求明确保留期限) GdprAuditLog::where('created_at','<', now()->subYears(2))->delete();User::onlyTrashed()->where('deleted_at','<', now()->subDays(30))->forceDelete();}}--- 核心要点: - 加密用 AES-256-GCM(带认证标签,防篡改) - PII_ENCRYPTION_KEY 用 base64_encode(random_bytes(32))生成,存 .env - 删除用匿名化替代物理删除,保留业务数据完整性 - 审计日志保留期建议2年,超期自动清理
http://www.jsqmd.com/news/658037/

相关文章:

  • 别等裁员潮——2026奇点大会紧急预警:AIAPI代码生成将重构IDE、CI、Code Review三重边界(附迁移路线图)
  • USB转TTL(也称 USB-TTL 模块)是一种串口通信适配器
  • 当思维的马拉松撞上AI的短跑局限——LongCoT与长程推理的深渊
  • 别再死记硬背了!用51单片机的AD/DA和PWM,亲手做个简易示波器信号发生器
  • 信息安全管理系统(ISMS)简介
  • 行波管从原理到设计,0 基础入门全攻略
  • 别再手动移植了!用Keil MDK为STM32F4系列一键生成静态库(SPL/HAL/LL全支持)
  • GstBuffer 核心机制与高效内存管理实战
  • Hyperf方案 多因素认证(MFA)
  • 如何快速配置插件系统:面向新手的5步完整指南
  • Docker一键部署Puter:打造私有云桌面与远程开发环境全攻略
  • 批量生成流程卡功能,助力企业简化工序流转与信息录入工作
  • 015、LangChain + RAG实战:把知识库问答系统真正串成一条可维护的工程链路
  • 2026 年阻垢剂领域优质企业推荐榜:上海环巨科技领衔,聚焦阻垢剂、缓蚀阻垢剂、反渗透阻垢剂、水处理阻垢剂专业服务商 - 海棠依旧大
  • 2026年维普论文AI率超标被打回?这份降AI攻略帮你一次过 - 我要发一区
  • 折叠波导慢波结构 CST 仿真全流程:从建模到注波互作用
  • 一人公司(OPC)典型案例与商业模式研究报告
  • 收藏!AI赋能程序员单干时代:一人公司如何从0到1?
  • REST 到底是什么?一篇讲透 + FastAPI 实战
  • 基于二阶RC模型的锂电池SOC估计自适应无迹卡尔曼滤波算法研究——包含噪声系数自适应的Matl...
  • 基于ITR9909与BC517达林顿管的光电感应开关改造实战
  • 广东企业注意!下一个高新技术企业就是你,但申报路上这些坑别踩 - 沐霖信息科技
  • 暗黑3终极自动化指南:D3KeyHelper图形化宏工具完整配置教程
  • 2026年维普AI检测不通过怎么办?从60%降到5%的完整攻略 - 我要发一区
  • VMamba在图像分类任务中的性能优化与实践
  • Pycharm运行程序时,会报错:Process finished with exit code -1073740791 (0xC0000409),无法查看详细的报错信息
  • AD22更新网表时总是显示 net with name XXX In already exists
  • IRremoteESP8266库实战:三种方法解析与发送空调红外码
  • 密码进行加盐哈希 using CSharp,Python,Go,Java
  • 桌面端社区体验革命:Coolapk-UWP如何重新定义Windows平台社交应用