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

AeroNyx7분 읽기

AeroNyx VPN 바우처가 노드로 하여금 결제한 계정을 알지 못한 채 결제를 검증하게 하는 방식, reject_invalid 롤아웃 모드가 아직 허용하는 것, 노드와 백엔드가 여전히 볼 수 있는 것, 그리고 Blind Vault 입장이 구현되었지만 배포되지 않은 이유를 설명합니다.

AeroNyx는 블라인드 서명 바우처를 사용하여, VPN 노드가 어떤 계정이 결제했는지 알지 못한 채 연결 비용이 지불되었는지 확인할 수 있도록 합니다. 이 기능은 현재 VPN에서 운영 중이며, 바우처 없는 연결도 여전히 수락하는 호환 모드로 동작합니다. 두 번째 자격 증명 경로인 Blind Vault 입장은 노드 소프트웨어에 존재하지만, 배포되지 않았고 공식 앱에서도 사용하지 않습니다.

두 가지 자격 증명 경로

자격 증명 경로상태사용 모델
VPN 핸드셰이크 바우처운영 중. reject_invalid 호환 모드로 실행노드가 서명을 확인합니다. 일회성 사용 여부는 추적하지 않습니다
Blind Vault V2 입장노드에 구현됨. 배포되지 않았으며 공식 앱에서 사용하지 않음임대 생성과 함께 일회성 사용이 원자적으로 기록됩니다
Blind Vault V1 입장같은 비활성화된 구성 요소 안에서 호환용으로만 존재일회성 사용이지만, 발급과 사용이 연결될 수 있습니다

VPN 바우처가 발급되는 방식

  1. 앱은 32바이트 무작위 토큰을 생성하고, RSA 블라인드 서명(RSABSSA-SHA384-PSS-Randomized, RFC 9474)을 사용해 로컬에서 블라인드 처리합니다.
  2. 앱은 블라인드 처리된 메시지만 /api/voucher/issue/의 AeroNyx 백엔드로 보냅니다. 백엔드는 로그인한 계정에 자격이 있는지 확인하고, 블라인드 처리된 메시지에 서명한 뒤 서명을 반환합니다. 백엔드는 토큰을 절대 보지 않습니다.
  3. 앱은 로컬에서 서명을 완성합니다. 완성된 바우처(토큰, 서명, 메시지 랜더마이저, 키 에포크)는 발급 요청과 연결되지 않는 무기명 자격 증명입니다.

에포크별로 묶인 공개 발급자 키는 다음에서 공개됩니다.

text
GET https://api.aeronyx.network/api/voucher/issuer/keys/

노드가 바우처를 확인하는 방식

앱은 VPN ClientHello에 바우처 확장을 덧붙입니다.

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

노드는 이 필드만 파싱합니다. 위의 엔드포인트에서 해당 에포크의 발급자 공개 키를 가져와 1시간 동안 캐시하고, 무작위화된 SHA-384 RSA-PSS 서명을 검증합니다. 지갑이나 계정 식별자는 필요하지 않습니다.

롤아웃 모드: reject_invalid

  • 형식이 잘못되었거나 암호학적으로 유효하지 않은 바우처는 핸드셰이크가 수락되기 전에 거부됩니다.
  • 이전 클라이언트가 계속 작동하도록 바우처가 전혀 없는 연결도 여전히 수락됩니다. 바우처 사용은 아직 필수가 아닙니다.
  • 노드는 사용된 바우처를 기록하지 않습니다. 노드는 발급자 키 에포크가 공개되어 있는 동안에는 유효한 바우처가 제시될 때마다 이를 수락합니다. 공유, 재사용, 할당량 제한은 노드가 아니라 백엔드가 시행합니다.

노드는 집계된 결과만 보고합니다.

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

노드가 사용자에 대해 알게 되는 것

"노드는 사용자의 지갑 신원을 절대 알지 못한다"는 보장은 바우처 연결에만 해당합니다.

  • 바우처 연결(공식 앱): 앱은 바우처와 새로 만든 임시 핸드셰이크 키로 연결합니다. 노드는 결제를 검증할 수 있지만, 세션을 사용자의 지갑이나 P2P 신원과 연결할 수 없습니다.
  • 레거시 연결: 바우처 대신 신원 키로 인증하는 클라이언트는 핸드셰이크에서 그 키를 보냅니다.

두 경우 모두 노드는 세션의 핸드셰이크 공개 키를 client_wallet이라는 필드에 담아 세션 시각 및 바이트 수와 함께 AeroNyx 백엔드에 보고합니다. 바우처 연결의 경우 그 값은 임시 키입니다. 레거시 연결의 경우 클라이언트의 신원 키입니다. 노드 운영자는 Nodeboard에서 세션별 트래픽과 이 키들을 볼 수 있습니다.

바우처가 그 밖의 모든 것을 숨겨 주지도 않습니다. 다른 VPN과 마찬가지로 노드는 여전히 사용자의 IP 주소를 보고, 출구로서 목적지와 DNS도 봅니다. 앱이 일일 연결을 예약할 때 백엔드는 해당 계정이 그 시각에 연결했다는 사실도 기록하지만, 어떤 노드를 사용했는지는 기록하지 않습니다. VPN 비교와 트러스트 센터를 참고하세요.

Blind Vault 입장(배포되지 않음)

Blind Vault는 익명 임대 아래 클라이언트가 암호화한 객체를 저장하기 위한 노드 구성 요소입니다. MemChain과 Blind Vault에 설명되어 있습니다. 입장 설계는 다음과 같습니다.

  • V2: 클라이언트가 RFC 9474 입장 메시지를 블라인드 처리합니다. 자격 서비스가 발급을 승인하고, 별도의 서명자 프로세스(aeronyx-blind-issuer)가 블라인드 처리된 바이트에만 서명합니다. 이 프로세스에는 계정 데이터베이스, 저장소, 사용 내역에 대한 가시성이 없습니다. 노드는 완성된 자격 증명을 고정된 공개 키 에포크로 검증하고, 하나의 SQLite 트랜잭션 안에서 사용 표시를 기록하고 무작위의 자체 인증 임대를 생성합니다. 사용된 자격 증명으로는 두 번째 임대를 만들 수 없습니다. 정확히 같은 요청을 재시도하면 같은 임대가 반환됩니다.
  • V1: 같은 일회성 사용 테이블을 사용하는 무기명 티켓입니다. 노드가 티켓의 식별 정보를 저장하므로, 사용과 발급이 연결될 수 있습니다. 호환성을 위해서만 유지됩니다.

노드는 Blind Vault와 그 공개 API가 모두 활성화된 경우에만 이 라우트를 노출합니다. 둘 다 기본값은 꺼짐입니다.

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

현재 상태: Blind Vault는 프로덕션 노드에 배포되지 않았고, 공식 앱은 이 라우트를 호출하지 않으며, AeroNyx 백엔드에는 Blind Vault 자격 엔드포인트가 없습니다. Blind Vault는 백업, 아카이브 또는 스토리지 제품이 아니며, 그러한 제품은 제공되지 않습니다.

관측 가능성

운영자 화면에는 집계된 자격 증명 상태만 표시됩니다.

  • VPN의 valid, invalid, missing, malformed 합계와 비율, 그리고 롤아웃 모드
  • 발급자 키 가용성과 대략적인 실패 구간

바우처 토큰, 서명, 랜더마이저, 블라인드 처리된 메시지, 사용 ID는 절대 표시되지 않습니다. 세션 수준의 트래픽과 핸드셰이크 키는 위에서 설명한 별도의 운영자 화면에 표시됩니다.

위협 모델과 한계

블라인드 서명은 발급 요청과 바우처 사이의 연결을 끊습니다. 다음 위험은 제거하지 못합니다.

  • 백엔드의 발급 또는 연결 예약 기록과 노드의 세션 기록 사이의 타이밍 상관관계. 특히 한쪽이 둘 다 볼 수 있는 경우에 더욱 그렇습니다
  • 노드가 사용자의 IP 주소, 목적지, DNS를 보는 것
  • 노드가 일회성 사용을 시행하지 않으므로, 키 에포크가 공개되어 있는 동안 발생할 수 있는 바우처 도용, 공유 또는 재판매
  • reject_invalid 모드에서 여전히 수락되는 바우처 없는 연결
  • 발급자 키 교체 오류 또는 손상된 클라이언트

소스 맵

계층노드 저장소의 경로역할
VPN 검증기crates/aeronyx-server/src/voucher_verifier.rsAVCH를 파싱하고, 에포크 키를 가져오고, 바우처를 검증하며, 집계 결과를 기록합니다
블라인드 서명자crates/aeronyx-blind-issuer/src/signer.rs, api.rsBlind Vault V2를 위한 신원 정보 없는 RSA 블라인드 서명
와이어 계약crates/aeronyx-core/src/protocol/blind_vault.rsRFC 9474 입장 메시지, 키 에포크, 사용 ID
Blind Vault 서비스와 APIcrates/aeronyx-server/src/services/blind_vault.rs, api/blind_vault.rs입장, 원자적 사용과 임대, 객체 라우트
Blind Vault 설정crates/aeronyx-server/src/config_blind_vault.rs기본값 꺼짐. 발급자 고정 및 교체 규칙

노드 소프트웨어는 AGPL-3.0에 따라 github.com/AeroNyxNetwork/AeroNyx에 오픈소스로 공개되어 있습니다. 앱은 오픈소스가 아닙니다.

<!-- faq:start -->

자주 묻는 질문

AeroNyx VPN 노드는 내가 어떤 지갑으로 결제했는지 알고 있나요?

공식 앱이 사용하는 바우처 연결에서는 알지 못합니다. 노드는 블라인드 서명 바우처와 임시 핸드셰이크 키를 검증하며, 둘 다 사용자의 지갑과 연결되어 있지 않습니다. 신원 키로 연결하는 레거시 클라이언트는 그 키를 노드에 드러냅니다.

바우처를 여러 번 사용할 수 있나요?

예. 노드는 바우처 에포크에 대해 공개된 키로 서명을 검증하지만, 사용된 바우처 목록은 보관하지 않습니다. 할당량은 백엔드가 시행합니다.

연결하려면 바우처가 필요한가요?

아직은 아닙니다. 노드는 형식이 잘못되었거나 유효하지 않은 바우처는 거부하지만, 이전 클라이언트가 계속 작동하도록 바우처가 전혀 없는 연결은 여전히 수락합니다.

바우처 발급자 키는 어디에 공개되나요?

https://api.aeronyx.network/api/voucher/issuer/keys/에 에포크별로 묶여 공개됩니다. 노드는 이 키를 1시간 동안 캐시합니다.

앱에서 Blind Vault를 사용할 수 있나요?

아니요. Blind Vault 입장은 노드 소프트웨어에 구현되어 있지만 기본적으로 비활성화되어 있고, 배포되지 않았으며, 공식 앱에서 사용하지 않습니다. AeroNyx는 백업이나 스토리지 제품을 제공하지 않습니다.

<!-- faq:end -->