隐私设计:软件开发团队实用指南

通过数据最小化、同意管理、访问控制和隐私保护架构模式在软件开发中通过设计实现隐私。

E
ECOSIRE Research and Development Team
|2026年3月16日3 分钟阅读683 字数|

属于我们的Compliance & Regulation系列

阅读完整指南

隐私设计:软件开发团队实用指南

“设计保护隐私”不是一项建议,而是 GDPR 第 25 条中的一项法律要求。 组织必须实施“适当的技术和组织措施”,以确保数据保护原则融入到处理本身中。然而,大多数开发团队都将隐私视为事后的想法,在架构确定后才添加同意书和 cookie 横幅。

本指南将隐私设计的七个基本原则转化为可操作的工程实践、设计模式和代码级实现。

要点

  • 隐私设计意味着将隐私嵌入到架构决策中,而不是稍后将其添加为功能
  • 模式级别的数据最小化从一开始就防止过度收集
  • 假名化和加密在发生违规时提供深度防御
  • 隐私保护分析可以在不暴露个人用户数据的情况下提供业务洞察

适用于软件的七个原则

1. 主动而非被动

在收集数据之前而不是在数据泄露之后建立隐私控制。

实践中

  • 将隐私要求纳入用户故事验收标准中
  • 在架构审查期间运行隐私威胁模型
  • 为每个涉及用户数据的拉取请求创建隐私清单

2.默认设置为隐私

用户不需要采取行动来保护他们的隐私。

实践中

  • 新用户帐户默认最小数据共享
  • 分析跟踪是选择加入,而不是选择退出
  • 个人资料可见性默认为私人
  • 数据保留默认为所需的最短期限
// Default privacy settings for new users
const DEFAULT_PRIVACY_SETTINGS = {
  profileVisibility: 'private',       // Not 'public'
  analyticsTracking: false,           // Opt-in required
  marketingEmails: false,             // Opt-in required
  dataSharing: false,                 // Opt-in required
  activityLog: true,                  // Security feature, on by default
  twoFactorAuth: true,               // Security feature, on by default
};

3. 设计中融入隐私

隐私是系统的核心组件,而不是附加组件。

数据库架构设计

-- Privacy-aware schema design
CREATE TABLE users (
    id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    -- Separate PII from operational data
    email VARCHAR(255) NOT NULL,          -- PII
    email_hash VARCHAR(64) NOT NULL,      -- For lookups without exposing email
    name_encrypted BYTEA,                 -- Encrypted at rest
    -- Operational fields (non-PII)
    role VARCHAR(50) NOT NULL DEFAULT 'user',
    created_at TIMESTAMP DEFAULT NOW(),
    -- Privacy metadata
    consent_timestamp TIMESTAMP,
    consent_version VARCHAR(20),
    data_retention_until TIMESTAMP,
    deletion_requested_at TIMESTAMP
);

-- Separate sensitive data into its own table with stricter access
CREATE TABLE user_pii (
    user_id UUID PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
    phone_encrypted BYTEA,
    address_encrypted BYTEA,
    date_of_birth_encrypted BYTEA,
    -- Audit trail
    last_accessed_at TIMESTAMP,
    last_accessed_by UUID
);

4. 完整功能(正和)

隐私不应以牺牲功能为代价。设计能够同时满足这两种需求的系统。

示例:不要在个性化和隐私之间进行选择,而是使用保护隐私的个性化:

  • 联邦学习:基于本地数据训练的机器学习模型,仅共享聚合结果
  • 差异隐私:向分析添加噪音以防止个人身份识别
  • 设备上处理:在用户设备上而不是服务器上计算的推荐

5. 端到端安全

在数据的整个生命周期中保护数据。

生命周期阶段安全措施
收藏TLS 1.3 传输中,输入验证
加工内存安全处理,不记录 PII
存储AES-256 静态加密、密钥管理
分享加密通道、与收件人的 DPA
档案加密存档、访问日志记录
删除密码擦除、验证

6. 可见性和透明度

用户必须了解他们的数据会发生什么。

实施

// Privacy dashboard API endpoint
@Controller('privacy')
export class PrivacyController {
  @Get('my-data')
  @ApiOperation({ summary: 'Get all personal data (GDPR Art. 15)' })
  async getMyData(@Req() req: AuthenticatedRequest) {
    return {
      profile: await this.userService.getProfile(req.user.sub),
      orders: await this.orderService.getUserOrders(req.user.sub),
      supportTickets: await this.supportService.getUserTickets(req.user.sub),
      loginHistory: await this.authService.getLoginHistory(req.user.sub),
      consentRecords: await this.consentService.getUserConsents(req.user.sub),
      dataProcessors: this.getDataProcessorList(),
    };
  }

  @Post('export')
  @ApiOperation({ summary: 'Export personal data (GDPR Art. 20)' })
  async exportMyData(@Req() req: AuthenticatedRequest) {
    // Generate machine-readable export (JSON)
    return this.privacyService.generateDataExport(req.user.sub);
  }

  @Post('delete')
  @ApiOperation({ summary: 'Request data deletion (GDPR Art. 17)' })
  async requestDeletion(@Req() req: AuthenticatedRequest) {
    return this.privacyService.initiateDataDeletion(req.user.sub);
  }
}

7. 尊重用户隐私

将用户置于每个设计决策的中心。


隐私保护架构模式

模式 1:数据分离

将个人身份信息与操作数据分开:

[Frontend] --> [API Gateway] --> [Application Service]
                                       |
                      +----------------+----------------+
                      |                                 |
              [Operational DB]                    [PII Vault]
              (Orders, products,                  (Names, emails,
               analytics - by ID)                  addresses - encrypted)

模式 2:同意驱动的处理

// Consent middleware
async function requireConsent(purpose: string) {
  return async (req: Request, res: Response, next: NextFunction) => {
    const consent = await consentService.check(req.user.id, purpose);
    if (!consent.granted) {
      throw new ForbiddenException(
        `Processing for "${purpose}" requires user consent`
      );
    }
    next();
  };
}

// Usage
@Get('recommendations')
@UseGuards(requireConsent('personalization'))
async getRecommendations(@Req() req: AuthenticatedRequest) {
  return this.recommendationService.getForUser(req.user.sub);
}

模式 3:数据自动过期

// TTL-based data retention
const RETENTION_POLICIES = {
  supportTickets: { days: 1095, action: 'anonymize' },    // 3 years
  recruitmentData: { days: 730, action: 'delete' },        // 2 years
  analyticsEvents: { days: 365, action: 'aggregate' },     // 1 year
  sessionLogs: { days: 90, action: 'delete' },             // 90 days
  tempUploads: { days: 7, action: 'delete' },              // 7 days
};

第三方集成中的隐私

每个第三方集成都存在潜在的隐私风险。当您的应用程序将用户数据发送到外部服务时,您需要负责该服务如何处理它。

集成隐私评估

在集成任何处理用户数据的第三方服务之前:

评估问题如果是,则采取行动
该服务是否接收 PII?需要 DPA,评估数据处理
数据会离开欧洲经济区吗?实施转移机制(SCC)
该服务是否经过 SOC2 / ISO 27001 认证?验证认证是否有效
该服务可以访问明文数据吗?考虑客户端加密
该服务是否将数据用于其自身目的?确保 DPA 禁止这样做

常见集成隐私风险

分析:Google Analytics、Mixpanel 和类似服务接收用户行为数据。使用服务器端分析或无 cookie 的替代方案(Plausible、Fathom)来最大程度地减少数据暴露。

支付处理:Stripe、PayPal 和类似服务处理财务数据。使用其托管支付表单(Stripe Elements)来避免 PCI-DSS 范围扩展。切勿记录完整的信用卡号码。

电子邮件服务:SendGrid、Mailgun 和类似服务处理电子邮件地址和消息内容。确保电子邮件服务提供商拥有已签署的 DPA,并且不会将您的收件人数据用于广告目的。

客户支持:Zendesk、Intercom 和类似服务存储可能包含 PII 的客户对话。在支持平台中配置数据保留并确保 DPA 涵盖所有数据类型。


开发人员清单

对于每个涉及用户数据的功能

  • 此功能收集哪些个人数据? (记录下来)
  • 征收的法律依据是什么? (同意、合同、合法权益)
  • 这是所需的最少数据吗? (数据最小化)
  • 我们会保留它多久? (保留政策)
  • 谁有权访问? (最小权限)
  • 静态和传输过程中是否加密? (安全)
  • 用户可以访问、导出和删除其数据吗? (权利)
  • 是否出于审计目的而记录? (问责制)
  • 是否跨越国界? (转移机制)
  • 如果风险较高,是否已完成 DPIA? (评估)

常见问题

隐私设计仅适用于 GDPR?

不会。虽然 GDPR 使其成为一项法律要求(第 25 条),但通过设计保护隐私是全球公认的最佳实践。加利福尼亚州的 CPRA、巴西的 LPD 和印度的 DPDP 都包含将隐私嵌入系统设计的类似要求。实施隐私设计以实现 GDPR 合规性会自动满足大多数其他司法管辖区的要求。

我们如何将隐私改进到现有应用程序中?

优先考虑:(1) 审核您拥有的个人数据及其所在位置,(2) 实施数据主体请求工作流程(访问、删除、导出),(3) 为静态敏感数据添加加密,(4) 实施保留策略和自动删除,(5) 在缺失的地方添加同意管理。这并不理想,但首先解决了最高风险的差距。

隐私设计是否意味着我们不能使用分析?

不。这意味着负责任地使用分析。汇总数据而不是单独跟踪。使用无 cookie 的分析(Plausible、Fathom)来获取网站指标。对于产品分析,收集没有 PII 的事件或假名标识符。对于 A/B 测试,请使用服务器端分配,而不使用客户端跟踪 cookie。隐私和分析与深思熟虑的设计兼容。

我们如何在 Odoo 中实施隐私设计?

Odoo 提供了多种内置隐私功能:用户访问组(每个模块访问控制)、审核日志记录(记录上的聊天记录)和数据归档。通过以下方式增强这些功能:敏感数据的加密自定义字段、使用计划操作的自动保留规则、使用自定义报告的 GDPR 数据导出功能以及对联系人记录的同意跟踪。 ECOSIRE 的 Odoo 定制服务 包括隐私设计实施。


接下来会发生什么

设计隐私是一门工程学科。将其与用于生命周期管理的数据保留策略、用于网络属性的cookie同意实施以及用于内部系统的员工数据隐私配对。

联系 ECOSIRE 获取设计隐私咨询和软件架构审查。


由 ECOSIRE 发布——帮助企业将隐私融入到每一行代码中。

E

作者

ECOSIRE Research and Development Team

在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。

通过 WhatsApp 聊天