加密能阻止所有泄漏吗?
加密是一层保护。应将地址数据库与 Azure Key Vault 的密钥使用权限分离。获准应用遭入侵或查询后数据外泄,无法仅靠加密阻止。
ADDRESS VAULT / GETTING STARTED
OneNym Address Vault 将配送地址加密保存,业务系统通过代理 ID 引用。只有获准的应用才能获取允许的字段。
购买门户及云端 API 评估环境目前暂停。有关接入、评估或恢复使用,请联系我们。以下步骤适用于环境恢复之后。
订阅 DEV 计划,用 Microsoft 账户登录门户并关联购买,然后申请准备。确认组织、合同、Vault、应用权限与保留期限,批准并激活后用虚拟数据测试。购买不会自动创建环境或赋予数据权限。生产使用条件另行确认。
与 OneNym 确认购买合同、使用组织、Vault 租户、商家和配送应用 ID、用途、允许字段及保留期限。获取 API HTTPS origin、API application ID 和 directory tenant ID。网站和购买门户不是 API 地址。购买后仍需配置与批准。
使用 Microsoft Entra 应用 Bearer token。Azure 可用 Managed Identity,证书方式以私钥认证应用并获取令牌,并非通信层 mTLS。当前 Vault 信任一个 Entra 目录,不会自动支持其他组织。凭据只放在后端。
ONENYM_API_URL=<API HTTPS origin>
ONENYM_API_APPLICATION_ID=<API application ID>
directory tenant ID / merchant client ID / carrier client ID
Authorization: Bearer <application-access-token>
向 OneNym 获取 SDK 源码和示例包,解压到新文件夹。需要 .NET 10 SDK、PowerShell 7 及 NuGet 网络访问。下列命令无需 Azure 账户即可用虚拟数据验证 18 个操作。本地认证、SQLite 和密钥仅用于演示,不可用于绕过服务认证或合同。使用附带的 SDK 源码,不以公开 NuGet 发布为前提。
dotnet --version
pwsh --version
pwsh -NoProfile -File ./samples/OneNym.Vault.Pilot/run-local.ps1
RESULT passed=True; steps=18; elapsedMs=…; cleanup=True PASS isolated customer quickstart
通过已认证的 API 注册地址。Vault 加密保存并返回难以预测的代理 ID。还需设计输入与接入路径,避免在服务器或日志中保留副本。
订单数据库保存订单号和代理 ID。ID 既不是地址,也不是查询权限。接入不会自动删除已有副本,仍需迁移和清理。
将订单、代理 ID、接收应用、字段与到期时间绑定,并签发有次数限制的令牌。持有令牌本身并不足以访问。
认证应用并检查组织、订单、用途、字段、到期时间、次数与合同状态。允许字段以明文返回,接收方也需管理存储和日志。
POST /v1/addresses
→ proxyId: nym_…
PUT /v1/shipping-orders
proxyId + orderReference + recipientClientId + fields + expiresAt
→ orderId + version
POST /v1/shipping-orders/{orderId}/grants
orderVersion + expiresAt + maxUses
→ token: nrt_…
POST /v1/retrieval-grants/redeem
Authorization: Bearer <application-access-token>
X-OneNym-Retrieval-Token: <retrieval-token>
orderId + orderReference + purpose + fields
→ permitted fields
这些示例用于说明设计。字段名及值仅供演示,并非可执行的 API 参考。
实现会在内存中解密整个地址记录,再仅返回允许的字段,并非逐字段加密。接收方须管理取得的明文,客户也须管理注册前系统中的日志与存储。
每项操作均需应用 Bearer token 和相应权限。配送获取还需 X-OneNym-Retrieval-Token。使用 UTF-8 JSON,目的为 shipping。GET、撤销和 DELETE 不带正文。示例假设 merchant 和 carrier 已认证、persistedKey 已在注册前保存、orderReference 不含个人信息。可运行的程序请使用示例包。
| 操作 | 方法与路径 | 成功响应 |
|---|---|---|
| 注册地址 | POST /v1/addressesRegisterAsync(…) | 201 |
| 获取允许字段 | POST /v1/addresses/{proxyId}/retrieveReadAsync(…) | 200 |
| 查询订单 ID 和版本 | GET /v1/shipping-orders/by-reference/{orderReference}FindOrderAsync(…) | 200 |
| 查询当前订单绑定 | GET /v1/shipping-orders/by-reference/{orderReference}/bindingInspectOrderAsync(…) | 200 |
| 创建或更改订单绑定 | PUT /v1/shipping-ordersBindAsync(…) | 200 |
| 签发配送令牌 | POST /v1/shipping-orders/{orderId}/grantsIssueAsync(…) | 201 |
| 使用配送令牌获取 | POST /v1/retrieval-grants/redeemRedeemAsync(…) | 200 |
| 撤销单个令牌 | POST /v1/retrieval-grants/{grantId}/revokeRevokeGrantAsync(…) | 204 |
| 停用地址 | POST /v1/addresses/{proxyId}/revokeRevokeAsync(…) | 204 |
| 删除地址 | DELETE /v1/addresses/{proxyId}DeleteAsync(…) | 204 |
using OneNym.Vault.Client;
var fields = new[] { "recipientName", "postalCode", "addressLine1" };
var registration = await merchant.RegisterAsync(new CreateAddress {
Address = new AddressData {
RecipientName = "Demo Recipient", PostalCode = "000-0000",
CountryCode = "JP", AddressLine1 = "Dummy address",
Locality = "Demo city"
},
RetainUntil = DateTimeOffset.UtcNow.AddDays(1)
}, persistedKey);
var order = await merchant.BindAsync(new BindOrder(
orderReference, registration.ProxyId, carrierClientId, fields,
DateTimeOffset.UtcNow.AddHours(1)));
var grant = await merchant.IssueAsync(
order.OrderId, order.Version, DateTimeOffset.UtcNow.AddMinutes(5));
var address = await carrier.RedeemAsync(
order.OrderId, orderReference, grant.Token, fields);
支持下列七个地址字段。countryCode 为两个大写字母;JSON 正文上限为 16,384 字节。初始最长保留期限为 30 天,以部署配置为准。配送令牌不得晚于地址或订单到期,且签发后最长 15 分钟。API maxUses 为 1–5,标准 SDK 为一次。按 UTC 秒计算,到期时刻即拒绝访问。不验证地址实际存在或可配送性。
recipientName 1–200
postalCode 1–32
countryCode [A-Z]{2}
addressLine1 1–300
addressLine2 null / 0–300
locality 1–100
region null / 0–100
更正时注册新地址,而非原地修改。查询当前绑定,将其 Version 作为 expectedVersion 更改订单,再签发新版本令牌。订单版本变化会阻止所有旧版本令牌。同版本追加签发不会撤销现有令牌。删除旧地址前检查其他订单及保留要求。已取得的明文无法收回。
var current = await merchant.InspectOrderAsync(orderReference);
var changed = await merchant.BindAsync(new BindOrder(
orderReference, newRegistration.ProxyId, carrierClientId, fields,
newOrderExpiry, ExpectedVersion: current.Version));
var newGrant = await merchant.IssueAsync(
changed.OrderId, changed.Version, newGrantExpiry);
// BindOrder = complete desired binding, not a partial patch.
// Keep unknown prior outcomes for reconciliation; never blindly retry.
SDK 不自动重试。超时、取消或 503 可能发生在保存或令牌消耗之后。不能把失败响应当作未执行,应按操作核对结果。
联系支持时提供 HTTP 状态、时间及可用的 trace ID。不要发送地址正文、Bearer、证书私钥或配送令牌。
已实现注册、限定字段获取、带版本的订单变更、配送令牌签发与次数限制、撤销、删除和到期清理。通过 SDK、隔离 SQL 及真实 Azure MI、Key Vault、Azure SQL 和历史存储验证正常流程、拒绝访问、并发及故障恢复。其他组织实际购买和同意、Microsoft 实际暂停与恢复通知仍待验收。这不构成生产 SLA 或所有配置的容量保证。
加密是一层保护。应将地址数据库与 Azure Key Vault 的密钥使用权限分离。获准应用遭入侵或查询后数据外泄,无法仅靠加密阻止。
ID 引用已保存的地址。令牌为特定订单、应用和字段增加访问条件,两者都应保护。单次令牌在成功获取后消耗,不保证重放相同响应。响应丢失时,应先确认处理状态再决定是否重新签发。
撤销阻止后续获取。地址删除清除活动记录中的密文与封装数据密钥,不会立即清除接收方副本或保留中的备份。合同暂停阻止正常查询,但允许所有者清理。还需约定备份保留及恢复时重新应用删除记录。
当前 DEV 产品是 Azure 上的配送地址 API,不含邮件发送、证件图片、OCR 或 AWS KMS 集成。通用架构示例不等于已提供功能。存储地点、运营责任和额外集成需在接入时确认。