블라인드 서명 바우처와 익명 접근 자격 증명
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 rollout | VoucherVerifier에 one-time spend 없음 |
| Blind Vault V2 admission | Rust 구현됨, deployment/config controlled | Atomic one-time spend와 idempotent exact retry |
| Blind Vault V1 admission | Compatibility 전용, 신규 통합은 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는 필요 없습니다.
ClientHello fixed frame
+ magic: AVCH
+ voucher_length: u16 little-endian
+ voucher JSON (maximum 2048 bytes)
{
"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라고 문서화하면 안 됩니다.
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에서만 동작합니다.
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
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_observation과 last_error에 token, wallet, lease, request, per-user dimension을 추가해서는 안 됩니다.
허용되는 집계 증거:
- VPN
valid/invalid/missing/malformedtotals와 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 verifier | crates/aeronyx-server/src/voucher_verifier.rs | AVCH parse, epoch key discovery, final voucher verify, aggregate rollout metrics. |
| Blind signer | crates/aeronyx-blind-issuer/src/signer.rs | Identity-free RSA blind-signing policy와 custody abstraction. |
| Issuer API | crates/aeronyx-blind-issuer/src/api.rs | Authenticated bounded signing, public epochs, pressure control, aggregate health. |
| Wire contracts | crates/aeronyx-core/src/protocol/blind_vault.rs | RFC 9474 admission, key epoch, spend ID, frame, signature contracts. |
| Blind Vault service | crates/aeronyx-server/src/services/blind_vault.rs | V1/V2 admission과 atomic spend+lease. |
| Blind Vault API | crates/aeronyx-server/src/api/blind_vault.rs | Issuers/lease/put/pull/delete routes와 coarse errors. |
| Blind Vault config | crates/aeronyx-server/src/config_blind_vault.rs | Issuer/update authority pin, TTL bound, monotonic rotation validation. |
| Health/reporting | crates/aeronyx-server/src/api/vpn_health.rs and management/reporter.rs | Voucher secret/wallet traffic 없는 aggregate status. |
개발 규칙
Crypto semantics, rollout policy, one-time spend, observability, tests, 모든 언어 docs가 일치해야 완료입니다. 서로 다른 credential system을 하나의 marketing promise로 합치지 말고 좁고 정확한 claim을 사용합니다.
- VPN과 Blind Vault semantics를 name/code/telemetry/docs에서 분리합니다.
- Missing을 허용하는 동안 mandatory VPN voucher라고 주장하지 않습니다.
- Atomic spend contract 없이 VPN one-time redemption을 주장하지 않습니다.
- Blind signer에 account/wallet/lease/node/redemption context를 넣지 않습니다.
- Epoch continuity, fail-closed authority, transaction atomicity를 유지합니다.
- Aggregate health만 공개하고 credential/identity dimension을 기록하지 않습니다.
- Semantic change 시 tests, Nodeboard contracts, 모든 번역을 갱신합니다.