- 或者带check的列表?对,比如每个检查项前面加[ ],方便对照。然后字数控制在800-1500,不要太啰嗦。还要避免空泛,每个检查项要具体,比如“数据库所有表必须包含tenant_id字段,且为联合索引的第一列”这种具体的,不是“要做好租户隔离”这种空的。
然后代码示例要可运行,比如:
首先TenantContext类,用来存当前请求的租户ID,比如从JWT或者session里拿。然后Encryptor类,用openssl_encrypt,算法用AES-256-GCM,因为 authenticated encryption,防篡改。然后密钥派生用hash_hkdf,PHP7.1以上就支持了?对,hash_hkdf是PHP 7.1+有的,要是低版本的话可以用hash_pbkdf2,不过现在生产环境基本都是7.4以上了,所以没问题。
然后代码里要演示,比如当前租户是1001,加密手机号13800138000,然后解密,还要注意GCM的tag要存下来,所以加密后的数据是iv.tag.ciphertext,用.分隔,这样解密的时候拆分。
然后还要注意,代码里不要硬编码密钥,主密钥从环境变量$_ENV['APP_MASTER_KEY']拿,这样符合生产环境规范。
然后检查清单部分,分几个大类:
一、租户数据隔离基础检查
[ ] 1. 隔离模式选型匹配业务规模:10租户以下可选独立库,10-1000租户选共享库分表,1000+选共享库共享表+行级权限
[ ] 2. 所有业务表必须包含tenant_id字段,且作为联合索引首列,禁止创建不带tenant_id的业务表
[ ] 3. 数据访问层强制注入租户上下文:所有ORM查询(Eloquent/Doctrine)自动拼接tenant_id条件,禁止手动编写不带租户过滤的SQL
[ ] 4. 数据库账号按租户维度做读写权限拆分:租户级账号仅能访问对应tenant_id的数据,禁止使用超级账号直连业务库
[ ] 5. 定期执行跨租户数据泄露扫描:每月模拟A租户请求查询B租户数据,验证隔离逻辑有效性
二、敏感数据加密落地检查
[ ] 1. 敏感字段明确分级:手机号、身份证、银行卡号等列为P1级,必须加密存储;用户昵称等P2级可选加密
[ ] 2. 加密算法统一使用AES-256-GCM,禁止使用DES、RC4等弱算法,禁止ECB模式
[ ] 3. 租户级密钥隔离:每个租户使用独立派生密钥,禁止全平台共用同一加密密钥
[ ] 4. 加密逻辑统一封装在数据访问层,禁止业务代码散落加密/解密逻辑
[ ] 5. 加密字段查询支持:如需对加密字段做模糊查询,需额外部署保序加密(OPE)或明文索引字段,禁止直接对密文做like查询
三、密钥管理检查
[ ] 1. 主密钥禁止硬编码在代码/配置文件,必须存储在KMS(密钥管理服务)或环境变量中,定期轮换
[ ] 2. 密钥访问权限最小化:仅加密服务账号可访问主密钥,禁止开发/测试环境使用生产主密钥
[ ] 3. 密钥泄露应急流程明确:主密钥泄露后24小时内完成全平台密钥轮换,租户密钥泄露后仅需轮换对应租户密钥
四、合规与审计检查
[ ] 1. 所有数据访问日志必须包含租户ID、操作人、操作时间、访问字段,留存6个月以上
[ ] 2. 加密操作日志单独归档,记录密钥ID、加密字段、操作结果,满足等保2.0要求
[ ] 3. 租户数据删除支持“彻底删除”:删除租户数据时同步删除对应加密密钥,禁止仅做逻辑删除
然后代码示例部分,就写那个TenantContext和Encryptor的示例,然后演示用法。
然后总结部分:多租户隔离和加密不是一次性工作,要纳入日常迭代的检查项,每次上线新功能都要验证隔离逻辑,密钥定期轮换,不要等出事故才补。
然后结尾自然带那个链接:本文由 PHP 加密服务团队整理发布,原文出处及更多代码保护
如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。