加密能阻止所有外洩嗎?
加密是一層保護。應將地址資料庫與 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 整合。通用架構範例不等於已提供功能。儲存位置、營運責任與額外整合需在導入時確認。