블라인드 서명 바우처와 익명 접근 자격 증명

AeroNyx2026년 6월 29일6분 읽기49회 조회

AeroNyx VPN blind voucher와 Blind Vault RFC 9474 admission의 rollout, replay, issuer, privacy boundary를 소스 기준으로 설명합니다.

AeroNyx는 서로 다른 두 authorization path에서 blind signature 기술을 사용합니다. 둘 다 identity linkage를 줄이지만 rollout과 replay guarantee는 다릅니다. 이 문서는 Rust main 구현, deployment-controlled 범위, credential에서 추론해서는 안 되는 정보를 명확히 합니다.

두 가지 자격 증명 경로

VPN은 finalized blind-signature credential로 ClientHello를 승인합니다. Blind Vault V2는 RFC 9474 credential로 random self-authenticating encrypted-storage lease를 만듭니다. V1 admission은 linkable one-time bearer compatibility이며 blind issuance가 아닙니다.

자격 증명 경로현재 상태Replay/교환 모델
VPN ClientHello voucher구현됨, reject_invalid compatibility rolloutVoucherVerifier에 one-time spend 없음
Blind Vault V2 admissionRust 구현됨, deployment/config controlledAtomic one-time spend와 idempotent exact retry
Blind Vault V1 admissionCompatibility 전용, 신규 통합은 V2 권장Atomic one-time spend지만 issuance는 linkable

개인정보 보호 불변 조건

목표는 issuance identity를 redeeming node에 노출하지 않고 권한을 확인하는 것입니다. Signer, entitlement backend, storage node, operator console은 별도 trust/data boundary여야 하며 request-level records를 결합하면 unlinkability가 깨집니다.

  • Redeeming node는 wallet/account identity 없이 권한을 검증합니다.
  • Blind signer는 blinded bytes와 public key ID만 받고 entitlement identity를 받지 않습니다.
  • Credential secret, token, randomizer, spend/lease ID, private key를 log/Nodeboard에 노출하지 않습니다.
  • Synthetic/aggregate counter를 per-user traffic과 join하지 않습니다.
  • Wallet blind-signing warning과 무관하며 읽지 못한 transaction을 승인하는 기능이 아닙니다.

VPN 핸드셰이크 바우처

Client는 bounded AVCH trailing extension을 보냅니다. Rust는 credential fields만 parse하고 configured issuer directory에서 epoch key를 받아 1시간 cache한 뒤 randomized SHA-384 RSA-PSS blind signature를 검증합니다. Wallet/account ID는 필요 없습니다.

text
ClientHello fixed frame
  + magic: AVCH
  + voucher_length: u16 little-endian
  + voucher JSON (maximum 2048 bytes)
json
{
  "token": "base64-final-credential-message",
  "signature": "base64-finalized-blind-signature",
  "msg_randomizer": "base64-32-byte-randomizer",
  "epoch": "issuer-key-epoch"
}

Client가 entitlement service보다 먼저 message를 blind해야 issuer flow가 진짜 blind입니다. Identity-linked token에 대한 일반 signature는 동일하지 않습니다. Final token, signature, randomizer, epoch는 bearer secret이므로 log하면 안 됩니다.

VPN 현재 배포 경계

VPN은 현재 reject_invalid compatibility mode입니다. Malformed/invalid voucher는 handshake 전 거부하지만 missing voucher는 old client migration을 위해 허용합니다. Mandatory enforcement라고 문서화하면 안 됩니다.

text
mode = reject_invalid
valid | invalid | missing | malformed | total
valid_ratio | invalid_ratio | missing_ratio | malformed_ratio
last_observation | last_error

VoucherVerifier는 signature와 aggregate outcome을 확인하지만 VPN token을 atomic spend하거나 one-time table에 저장하지 않습니다. Node-enforced one-time redemption은 구현되지 않았고 sharing/replay/quota/expiry는 versioned issuance contract가 필요합니다.

Blind Vault V2 admission

Blind Vault V2는 node-signed issuer epochs를 찾고 RFC 9474 message를 blind한 뒤 isolated issuer signature를 local finalize하여 /api/vault/v1/lease로 보냅니다. Blind Vault public API와 pinned issuer가 활성화된 deployment에서만 동작합니다.

http
GET  /api/vault/v1/issuers
POST /api/vault/v1/lease
POST /api/vault/v1/put
POST /api/vault/v1/pull
POST /api/vault/v1/delete
Content-Type: application/vnd.aeronyx.blind-vault-v1
text
client blinds RFC 9474 admission message
  -> entitlement backend authorizes issuance
  -> isolated blind issuer signs blinded bytes only
  -> client finalizes signature
  -> node verifies active public epoch
  -> atomic spend marker + random self-authenticating lease
  -> ciphertext storage operations use lease-scoped keys/capabilities

Issuer 격리와 키 교체

Private operation은 별도 aeronyx-blind-issuer process에 있습니다. Input은 version, public key fingerprint, bounded blinded RSA bytes뿐이며 account model, storage DB, redemption visibility가 없습니다. Software key와 향후 HSM/KMS가 같은 custody interface를 사용합니다.

Public epoch에는 canonical DER, SHA-256 key ID, validity, max lease TTL이 있습니다. Update는 별도 pinned authority, monotonic generation, active epoch continuity, atomic persistence를 요구하며 rollback과 still-valid epoch 제거는 fail closed입니다.

Atomic spend, 멱등성, replay

V2는 finalized credential verification, domain-separated spend ID, lease creation을 하나의 immediate SQLite transaction으로 commit합니다. Spent credential은 두 번째 lease를 만들 수 없고 같은 기존 lease에 대한 exact retry는 idempotent입니다.

V1/V2는 one-time spend table을 공유하지만 scheme-separated입니다. V1 raw ticket은 linkable이고 V2 spend ID는 unlinkable입니다. 이 replay protection은 Blind Vault 전용이며 VPN VoucherVerifier에 적용되지 않습니다.

관측성과 Nodeboard

Operator UI는 aggregate validity, capacity, signer health, coarse failure bucket만 표시할 수 있습니다. last_observationlast_error에 token, wallet, lease, request, per-user dimension을 추가해서는 안 됩니다.

허용되는 집계 증거:

  • VPN valid/invalid/missing/malformed totals와 ratios
  • Issuer active-key, key-count, reload, capacity, rate, timeout, circuit-breaker counters
  • Blind Vault aggregate lease, live-object, ciphertext-byte, expiry, cleanup health
  • Coarse mode, epoch availability, last observation, privacy-boundary status

노출 금지:

  • raw voucher token, signature, randomizer, blinded message, spend ID
  • wallet/account/payment/membership/social identity
  • per-user redemption history, lease/object/capability/request ID
  • client public IP, destination, DNS, route, message, browsing metadata
  • issuer private key, provider error, ciphertext, plaintext, wallet-level traffic

위협 모델과 제한

Blind signature는 issuance/redemption linkage만 줄입니다. Timing, region, capacity, client compromise, issuer collection, credential theft, collusion, traffic correlation에는 blind relay, encryption, bounded logs, route diversity, deployment separation이 필요합니다.

  • issuer collection과 redemption timing 상관
  • credential theft/sharing/resale/client storage compromise
  • versioned redemption policy 전 VPN voucher replay
  • malicious/colluding issuer, backend, node, operator
  • timing/region/capacity/traffic correlation
  • key rotation rollback, inactive epoch, broken continuity
  • aggregate telemetry가 per-user history로 확장되는 위험

소스 맵

Source는 VPN verification, isolated signing, wire contract, Blind Vault admission/API/config, health reporting으로 의도적으로 분리됩니다. Code review에서도 ownership boundary를 유지해야 합니다.

계층저장소 경로역할
VPN verifiercrates/aeronyx-server/src/voucher_verifier.rsAVCH parse, epoch key discovery, final voucher verify, aggregate rollout metrics.
Blind signercrates/aeronyx-blind-issuer/src/signer.rsIdentity-free RSA blind-signing policy와 custody abstraction.
Issuer APIcrates/aeronyx-blind-issuer/src/api.rsAuthenticated bounded signing, public epochs, pressure control, aggregate health.
Wire contractscrates/aeronyx-core/src/protocol/blind_vault.rsRFC 9474 admission, key epoch, spend ID, frame, signature contracts.
Blind Vault servicecrates/aeronyx-server/src/services/blind_vault.rsV1/V2 admission과 atomic spend+lease.
Blind Vault APIcrates/aeronyx-server/src/api/blind_vault.rsIssuers/lease/put/pull/delete routes와 coarse errors.
Blind Vault configcrates/aeronyx-server/src/config_blind_vault.rsIssuer/update authority pin, TTL bound, monotonic rotation validation.
Health/reportingcrates/aeronyx-server/src/api/vpn_health.rs and management/reporter.rsVoucher secret/wallet traffic 없는 aggregate status.

개발 규칙

Crypto semantics, rollout policy, one-time spend, observability, tests, 모든 언어 docs가 일치해야 완료입니다. 서로 다른 credential system을 하나의 marketing promise로 합치지 말고 좁고 정확한 claim을 사용합니다.

  1. VPN과 Blind Vault semantics를 name/code/telemetry/docs에서 분리합니다.
  2. Missing을 허용하는 동안 mandatory VPN voucher라고 주장하지 않습니다.
  3. Atomic spend contract 없이 VPN one-time redemption을 주장하지 않습니다.
  4. Blind signer에 account/wallet/lease/node/redemption context를 넣지 않습니다.
  5. Epoch continuity, fail-closed authority, transaction atomicity를 유지합니다.
  6. Aggregate health만 공개하고 credential/identity dimension을 기록하지 않습니다.
  7. Semantic change 시 tests, Nodeboard contracts, 모든 번역을 갱신합니다.

Blind Vault 암호화 연락처와 선택적 메시지 아카이브