关于 Data Prism
Data Prism 是面向 Java/Spring 团队的隐私层,可在内部 API 数据交给 LLM Agent 或 MCP 客户端前进行假名化。它为同一隐私范围内的实体生成一致身份,并拒绝未分类数据;也可记录哈希链审计日志。
主要功能
- 01按隐私范围假名化个人数据
- 02跨数据源保持合成身份一致
- 03拒绝未分类数据
- 04提供两个 MCP 工具
- 05支持哈希链审计日志
适用场景
- 01在 LLM Agent 查询客户 API 前减少个人数据暴露
- 02跨系统调查时关联同一实体
- 03核验审计记录是否被编辑或删除
MCP 相关
向 MCP 客户端提供 `get_entity_context` 和 `compare_entity_sources` 两个工具,在返回数据前执行隐私控制。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e LOADER_PATH -e DATAPRISM_SECURITY_JWT_ISSUER -e DATAPRISM_SECURITY_JWT_AUDIENCE -e DATAPRISM_SECURITY_JWT_JWK_SET_URI -e DATAPRISM_SECURITY_JWT_ISSUER_DISCOVERY_URI -e DATAPRISM_SECURITY_CALLER_CLAIMS_PRINCIPAL -e DATAPRISM_SECURITY_CALLER_CLAIMS_ROLES -e DATAPRISM_SECURITY_CALLER_CLAIMS_INVESTIGATION -e DATAPRISM_SECURITY_POLICY_PURPOSES -e DATAPRISM_SECURITYPOLICY_ROLES_INVESTIGATOR -e DATAPRISM_PRIVACY_PROFILE -e DATAPRISM_PRIVACY_SCOPE_LIFETIME -e DATAPRISM_PRIVACY_HMAC_KEY_KEY_ID -e DATAPRISM_PRIVACY_HMAC_KEY_ENVIRONMENT_VARIABLE -e DATAPRISM_PRIVACY_HMAC_KEY_PROVIDER_REFERENCE -e DATAPRISM_AUDIT_SINK -e DATAPRISM_AUDIT_WRITER_ID -e DATAPRISM_AUDIT_FILE_PATH -e DATAPRISM_METRICS_SINK -e DATAPRISM_HAZELCAST_TOPOLOGY -e DATAPRISM_HAZELCAST_CLUSTERNAME -e DATAPRISM_HAZELCAST_JOIN_MODE -e DATAPRISM_HAZELCAST_JOIN_MEMBERS -e DATAPRISM_HAZELCAST_MEMBER_PORT -e DATAPRISM_OPERATOR_ENABLED -e DATAPRISM_OPERATOR_PORT -e DATAPRISM_OPERATOR_REQUIREDAUDIENCE -e DATAPRISM_OPERATOR_REQUIREDSCOPE -e DATAPRISM_SOURCES_CUSTOMER_BASE_URL -e DATAPRISM_SOURCES_CUSTOMER_TIMEOUT ghcr.io/aindriub/data-prism-server:0.7.1LOADER_PATHDirectory Spring Boot's PropertiesLauncher scans for extension jars; already set to /app/adapters by the image, but startup still fails with MISSING_SOURCE_ADAPTER until you bind-mount a reviewed DataSourceAdapter/IdentityResolver jar there (see the -v arguments above)DATAPRISM_SECURITY_JWT_ISSUEROAuth2/OIDC issuer that mints the caller's JWT; required for every protected deploymentDATAPRISM_SECURITY_JWT_AUDIENCEExpected JWT audience claim for this deployment; required for every protected deploymentDATAPRISM_SECURITY_JWT_JWK_SET_URIHTTPS JWKS location used to verify caller JWTs; exactly one of this or DATAPRISM_SECURITY_JWT_ISSUER_DISCOVERY_URI is required, never bothDATAPRISM_SECURITY_JWT_ISSUER_DISCOVERY_URIAlternative HTTPS OIDC issuer-discovery location; set this instead of DATAPRISM_SECURITY_JWT_JWK_SET_URI, never bothDATAPRISM_SECURITY_CALLER_CLAIMS_PRINCIPALJWT claim name that carries the caller's principal identifier; required, must differ from the roles and investigation claimsDATAPRISM_SECURITY_CALLER_CLAIMS_ROLESJWT claim name that carries the caller's roles; required, must differ from the principal and investigation claimsDATAPRISM_SECURITY_CALLER_CLAIMS_INVESTIGATIONJWT claim name that carries the trusted investigation/case identifier; required, must differ from the principal and roles claimsDATAPRISM_SECURITY_POLICY_PURPOSESComma-separated list of permitted purposes; at least one is requiredDATAPRISM_SECURITYPOLICY_ROLES_INVESTIGATORExample only — declare DATAPRISM_SECURITYPOLICY_ROLES_<ROLE> per operator-defined role (no underscore between SECURITY and POLICY: Spring Boot's map-key enumeration under a hyphenated dataprism.security-policy.roles.<role> segment only binds the concatenated prefix, verified by binding this property directly against Spring Boot 4.1.1), a comma-separated list of known MCP tool capabilities; at least one role-to-capability mapping is requiredDATAPRISM_PRIVACY_PROFILEName of the reviewed privacy profile implementation to apply; requiredDATAPRISM_PRIVACY_SCOPE_LIFETIMEPositive duration (e.g. 8h) a privacy scope's synthetic identities remain valid; requiredDATAPRISM_PRIVACY_HMAC_KEY_KEY_ID密钥Identifier of the pinned HMAC key used to derive synthetic identities; requiredDATAPRISM_PRIVACY_HMAC_KEY_ENVIRONMENT_VARIABLE密钥Name of the environment variable holding the HMAC key material; exactly one of this or DATAPRISM_PRIVACY_HMAC_KEY_PROVIDER_REFERENCE is required, never both, and never a literal key valueDATAPRISM_PRIVACY_HMAC_KEY_PROVIDER_REFERENCE密钥Reference to an approved secret provider holding the HMAC key material; set this instead of DATAPRISM_PRIVACY_HMAC_KEY_ENVIRONMENT_VARIABLE, never bothDATAPRISM_AUDIT_SINKAudit sink implementation: one of approved-sink, slf4j, hash-chained; required, never downgraded to no-opDATAPRISM_AUDIT_WRITER_IDWriter/instance identity recorded on every audit entry; requiredDATAPRISM_AUDIT_FILE_PATHPath to the durable, hash-chained audit log; required when DATAPRISM_AUDIT_SINK=hash-chained, refused as MISSING_AUDIT_FILE_PATH if absent for that sink, ignored otherwiseDATAPRISM_METRICS_SINKMetrics sink binding, currently only micrometer; required in production, never the framework no-opDATAPRISM_HAZELCAST_TOPOLOGYCluster read-budget topology: embedded (shared across members that have joined one cluster; set cluster name and join mode) or single-node (enforced per process); required, never defaultedDATAPRISM_HAZELCAST_CLUSTERNAMEHazelcast cluster name; required when DATAPRISM_HAZELCAST_TOPOLOGY=embedded, never dev, refused if set with single-nodeDATAPRISM_HAZELCAST_JOIN_MODEHow cluster members find each other: tcp-ip, kubernetes or none; required when DATAPRISM_HAZELCAST_TOPOLOGY=embedded (none is an explicit single member bound to 127.0.0.1), refused if set with single-nodeDATAPRISM_HAZELCAST_JOIN_MEMBERSComma-separated member addresses (host or host:port); required when DATAPRISM_HAZELCAST_JOIN_MODE=tcp-ip, otherwise unusedDATAPRISM_HAZELCAST_MEMBER_PORTHazelcast member port, default 5701, never auto-incremented; must differ from the server, management and operator ports. Member traffic is unencrypted, so keep it on a private network. OptionalDATAPRISM_OPERATOR_ENABLEDEnables the operator surface; optional, off by defaultDATAPRISM_OPERATOR_PORTPort of the operator listener; required when DATAPRISM_OPERATOR_ENABLED=true, must differ from the server, management (OPERATOR_PORT_SHARED otherwise) and member ports, and has no fixed default (publish it explicitly)DATAPRISM_OPERATOR_REQUIREDAUDIENCEJWT audience an operator token must carry; required when DATAPRISM_OPERATOR_ENABLED=trueDATAPRISM_OPERATOR_REQUIREDSCOPEJWT scope an operator token must carry; required when DATAPRISM_OPERATOR_ENABLED=trueDATAPRISM_SOURCES_CUSTOMER_BASE_URLExample only — declare DATAPRISM_SOURCES_<NAME>_BASE_URL (HTTPS) per configured source; at least one source, each with its own reviewed DataSourceAdapter bean, is requiredDATAPRISM_SOURCES_CUSTOMER_TIMEOUTExample only — declare DATAPRISM_SOURCES_<NAME>_TIMEOUT (positive duration) per configured source; required alongside its base URL本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/aindriub/data-prism-server:0.7.1Streamable HTTP工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Data Prism
默认拒绝的隐私层,为大模型 Agent 和 MCP 客户端对企业 API 数据进行假名化处理。
Data Prism 是一个开源隐私层,面向 Java/Spring 团队,帮助他们在持有客户数据的内部 API 前部署大模型 Agent 或 MCP 客户端。它按隐私范围对个人数据进行假名化处理,拒绝处理任何未分类的数据,并可保留哈希链审计记录。
它是什么。 面向企业 AI 的隐私执行层。它为大模型 Agent 提供有用且可关联的业务上下文——在一个隐私范围内,为每个实体 生成一致的合成身份——同时控制哪些个人数据可以跨越 AI 边界,以及 以何种形式跨越。
适用对象。 在持有客户数据的内部 API 前部署大模型 Agent 或 MCP 客户端的 Java/Spring 平台和后端团队。如果你运行的系统 不会向模型暴露个人数据,就不需要它。
状态:行走骨架及截至 S9a 的所有切片均已构建完成,包含 18 个
Maven 子模块(将根目录中采用 pom 打包的聚合器也计算在内,reactor 中共有 19 个 Maven 项目),测试套件全部通过。隐私引擎、关联与一致性分析结果、并行 mTLS 连接器、
内嵌式 Hazelcast 身份缓存和读取预算(仅在已加入同一集群的成员之间共享;参见多个实例)、带有基于会话推导的 PrivacyContext 的 OAuth2 资源服务器、
审计和指标都已实现,并经过端到端测试。独立服务器是主要部署方式;
Spring Boot starter 是内嵌式选项。还提供一条命令即可启动的本地
Compose 快速入门:参见下文“试用”。目前提供两个 MCP 工具:get_entity_context 和
compare_entity_sources——设计评审中提到的另外两个工具
search_entity_data 和 describe_entity_model 尚未构建(见
docs/tools.md 中的“尚未构建”)。从 0.3.0 开始提供持久化、仅追加、哈希链审计接收器和离线
AuditChainVerifier,通过
dataprism.audit.sink: hash-chained 启用;验证器可以检测写入者链中的编辑或
删除,但无法检测写入者最近记录被截断,也无法检测某次进程启动的全部记录被删除;对于已经拥有该文件写入权限的操作员或其他任何人,该审计记录也无法抵御篡改(见
docs/audit.md 中的“此机制能证明和不能证明的内容”)。尚未构建:重新识别操作界面(经决策推迟到 V1 之后,参见 docs/architecture.md#decisions-worth-knowing)以及
Elasticsearch 连接器及其搜索工具。尚待处理事项见 docs/plan/PLAN.md。
问题所在
某个组织希望让大模型调查分散在多个系统中的实时业务数据。让模型直接访问 API 不可接受:这些 API 包含个人和机密数据,每个系统对同一实体的表示方式各不相同,而且原始标识符会让下游的任何对象都能跨会话进行关联。
显而易见的解决方案——对所有敏感信息进行脱敏——会让调查失去价值。一旦三个系统中同一个人的名字都变成 [REDACTED],模型就无法判断自己看到的是一个人还是三个人。
Data Prism 的功能
它位于两者之间,并完成两件容易混淆的事:
确保身份一致。 同一主体在每个数据源中都会获得同一个合成身份,该身份由 (scope, subject, namespace, algorithm version, key) 确定性生成——绝不随机、绝不以明文存储,并且无需缓存即可重现。同一个人在三个系统中对模型来说就是同一个人。
保留数据的不一致,并明确指出。 如果这三个系统对某个姓名存在分歧,答案中就会包含一条指出这种分歧的发现。该平台绝不会把企业数据呈现得比实际情况更整洁。这个区别正是该项目的核心:
身份表示变得一致。底层数据中的不一致会变得更加明显,而非更不明显。
假名有作用域。同一个人在两项不同调查中会获得两个不同的合成身份,因此不会意外关联不同案件。
它不是什么
它不是 API 网关、ETL 平台、主数据系统、身份提供方或实体解析引擎——关联需要依赖数据源已经共享的密钥,并通过有文档说明的 SPI 提供。它不包含任何业务领域:示例应用之外不存在 Customer、Taxpayer 或 Employee 类型。
它不是匿名化。 根据 GDPR 第 4 条第 5 款,假名化数据仍属于个人数据。将 Data Prism 的输出发送给第三方模型仍然属于处理,仍然需要合法依据、DPIA,以及在提供方位于欧盟以外时使用传输机制。该平台可以降低暴露风险,但不会免除相关义务。
试用
想要快速了解真实 MCP 调用如何由真实隐私引擎响应——无需本地 JDK,无需安装 Maven,只需运行一条命令:
docker compose up
该命令会拉取已发布的 ghcr.io/aindriub/data-prism-quickstart-<name> 镜像(使用 QUICKSTART_IMAGE_TAG=0.7.0 固定版本;若要从源代码构建所有镜像,则改为运行 docker compose -f compose.yaml -f compose.build.yaml up --build),并启动独立服务、合成测试 API 和本地 HTTPS JWT 颁发方,以证明兼容 Agent 的 get_entity_context 调用会返回假名化响应。请按照
docs/quickstart.md 中的步骤操作;你可以将自己的 Agent 客户端连接到该环境,或通过
docs/agents/ 连接到真实部署。
查看演示后,可以保护自己的 API:docs/quickstart.md 以“接下来做什么”一节结尾,其中指向
docs/protect-your-own-api.md,这是一份仅使用 YAML 的操作指南,介绍如何将真实 JSON REST API 配置为可正常响应 get_entity_context 调用。
如果你是在 MCP 注册表中找到此项目
其中列出的 ghcr.io/aindriub/data-prism-server 镜像以多架构清单列表的形式发布,涵盖 linux/amd64 和 linux/arm64,每种架构都经过原生构建和验证——在 Apple Silicon 或任何其他 arm64 主机上运行 docker run 时,会直接拉取 arm64 镜像,无需模拟。
无论使用哪种架构,都无法通过一条命令完成安装。仅运行 docker run 会得到一个拒绝启动的服务:DataPrismContractValidator 要求为每个已配置的数据源提供经过审核的 DataSourceAdapter bean,而 DataPrismProperties.validate() 要求提供完整的部署配置(JWT 颁发方/受众/JWKS、调用方声明映射、安全策略、HMAC 密钥引用、审计接收器、指标接收器、Hazelcast 拓扑)。镜像中不包含这两项。服务开始处理任何内容之前,操作员必须自行提供以下两项:
- 经过审核的
DataSourceAdapter(以及IdentityResolver)jar,用于每个受保护的 API,并将其挂载到镜像的加载器路径。 - 部署配置,满足
dataprism.*配置项要求。
docs/configuration.md 是这两项内容的权威完整规范。上文的“试用”部分使用的是本地 Compose 测试环境,用于评估,并非此镜像或其配置。
文档
完整的用户文档也已发布,支持渲染和搜索,网址为: https://aindriub.github.io/data-prism/.
用户文档
每行都链接到网站页面及其源文件所在的仓库文件。
内部/项目工作文档
不会发布到网站上。
| 文档 | 内容 |
|---|---|
docs/design-review.md | 对规范的修订及其原因。权威文档 |
docs/development-plan.md | 切片顺序、规模,以及阻碍第一个切片启动的决策 |
docs/pack.md | 原始规范。已被取代,仅供历史参考;其中描述的工具从未构建 |
docs/conventions.md | 代码风格,以及 diff 必须满足的隐私规则 |
docs/workflow.md | 工作如何拆分和执行 |
docs/plan/PLAN.md | 尚未完成的事项,按优先级排列 |
docs/plan/HISTORY-INDEX.md | 已构建的内容,以及为了解情况付出的成本 |
docs/plan/PLAN.md 是当前工作队列。来自外部的事项应通过 GitHub Issues 提交——请在那里创建 Issue,而不是写入 PLAN.md。
技术栈
Java 21 字节码、Spring Boot 4.1.x、Maven 多模块、Hazelcast,以及通过官方 MCP Java SDK 实现的 Model Context Protocol。库模块要求 Java 21 或更高版本和 Spring Boot 4.1.x;发布的镜像运行 Java 25。使用 Boot 3 的用户请继续使用 0.4.x。
制品以 data-prism-<module> 的名称发布在 group io.github.aindriub 下,包根目录为 io.github.aindriub.dataprism。
构建与运行
构建需要 JDK 21 或更高版本(构建使用 --release 21 编译,因此本地 JDK 更新也没问题;CI 使用 21 和 25 构建),以及 Maven >= 3.6.3(pom.xml:343-345 会对此进行检查),前提是你使用自己的 mvn。
仓库自带 Maven Wrapper,首次使用时会下载经过校验和验证的 Maven 3.9.16,因此无需本地安装 Maven。
./mvnw -B --no-transfer-progress verify # Windows: mvnw.cmd -B --no-transfer-progress verify
这是 CI 执行的相同命令(.github/workflows/build.yml)。它会构建全部 18 个子模块和根聚合器,运行完整测试套件、ArchUnit 边界规则,以及确保类路径使用 Jackson 3 并禁止使用 Jackson 2(jackson-annotations 除外)的 enforcer 规则。
data-prism-server 是主要的可执行发行版。它的 /health 存活探针为公开接口,不包含部署细节;其配置的 MCP 路径(通常为 /mcp)需要经过验证的 bearer JWT。它特意不包含源架构、固定数据适配器或密钥。请提供 docs/configuration.md 中所述的配置,以及每个已配置数据源对应的、经过审核的适配器。获取适配器有两种方式:包含带注解响应模型的 Java 适配器扩展(通用方案——适用于嵌套对象和任意传输方式);或者,当数据源的响应是一个扁平 JSON 对象时,使用已发布的 data-prism-connectors-rest 制品——通过 -Dloader.path 加载,完全使用 YAML 配置,无需 Java。两种方案的说明,以及由配置驱动的方案在何处停止支持(它不会深入嵌套对象),请参阅 docs/extending.md。
适配器扩展是普通的 JAR,其中包含 Spring Boot 自动配置,用于声明必需的 DataSourceAdapter bean 和一个经过明确审核的 IdentityResolver(只有在每个数据源确实共用同一标识符时,才使用 PassThroughIdentityResolver)。请在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中注册该配置,然后无需重新构建服务,即可加载经过审核的扩展 JAR:
LOADER_PATH=/opt/data-prism/extensions \
java -jar data-prism-server/target/data-prism-server-0.7.0.jar \
--spring.config.additional-location=file:/etc/data-prism/application.yaml
如果缺少配置、密钥、运维绑定或与配置完全匹配的适配器集合,进程会拒绝启动。data-prism-integration-tests 是 reactor 的跨模块集成测试套件,而不是仅用于展示固定数据的示例,并且绝不会打包进可部署制品。此项目也提供容器打包和 Compose 编排,可构建真实且能在本地运行的实例——请参阅上文的“试用”和 docs/quickstart.md。
贡献
请参阅 CONTRIBUTING.md。简而言之:提交拉取请求前,请阅读 docs/conventions.md,并注意其中的隐私规则会被严格执行。
许可证
Apache License 2.0——请参阅 LICENSE 和 NOTICE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。