No description
This repository has been archived on 2025-10-21. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
  • Python 99.6%
  • Dockerfile 0.4%
Find a file
2025-04-01 13:33:56 +09:00
debian 소스 추가 2025-04-01 13:33:56 +09:00
indy 소스 추가 2025-04-01 13:33:56 +09:00
src 소스 추가 2025-04-01 13:33:56 +09:00
tests 소스 추가 2025-04-01 13:33:56 +09:00
.gitignore Initial commit 2025-03-31 14:45:51 +09:00
Dockerfile sample add 2025-04-01 11:05:35 +09:00
environment.yml indy-sdk add 2025-03-31 15:41:44 +09:00
install.sh 소스 추가 2025-04-01 13:33:56 +09:00
README.md 소스 추가 2025-04-01 13:33:56 +09:00

Hyperledger Indy SDK

Python Anaconda

Indy AnonCreds 시스템 개요

이 프로젝트는 Hyperledger Indy 기반의 탈중앙 신원 인증(DID) 시스템을 구축하고, 다음의 기능을 포함합니다:

  • DID 생성 및 Ledger 등록
  • Credential Schema 및 Definition 생성
  • 증명 발급 및 저장
  • 얼굴 이미지 URL을 주민번호 해시와 함께 블록체인에 저장
  • 저장된 얼굴 이미지 정보를 주민번호로 검색
  • Revocation을 통한 증명 취소
  • DID 기반의 암호화 및 인증

주요 구성 파일

파일명 역할
anoncreds.py 기본적인 credential 발급 및 저장, 얼굴 이미지 블록체인 저장
load.py 주민번호로 얼굴 이미지 정보를 조회
anoncreds_revocation.py Revocation 가능한 credential 발급 및 검증
crypto.py DID 간 메시지 서명 및 검증
ledger.py NYM 및 ATTRIB 트랜잭션 실습
endorser.py 엔도서 승인 기반 트랜잭션 처리 실습
txn_author_agreement.py Transaction Author Agreement 설정 및 확인
getting_started.py 다양한 기관/인물에 대한 schema 및 credential 발급 시나리오
main.py 전체 데모 실행 엔트리 포인트
utils.py 공통 유틸리티 함수들 (지갑 경로, 해시, 프로토콜 등)

anoncreds.py 주요 동작 흐름

graph TD
    A[Pool 및 지갑 초기화] --> B[DID 생성 및 NYM 등록]
    B --> C[Credential Schema 및 Definition 생성]
    C --> D[얼굴 이미지 + 주민번호 해시 블록체인 저장]
    D --> E[Credential 발급 및 저장]
    E --> F[증명 요청 생성]
    F --> G[Credential 검색 및 선택]
    G --> H[증명 생성 및 검증]

코드 흐름 예시

# 지갑 생성 및 열기
await wallet.create_wallet(config, credentials)
wallet_handle = await wallet.open_wallet(config, credentials)

# DID 생성
issuer_did, issuer_verkey = await did.create_and_store_my_did(wallet_handle, '{}')

# NYM 트랜잭션으로 DID 등록
nym_request = await ledger.build_nym_request(steward_did, issuer_did, issuer_verkey, None, 'TRUST_ANCHOR')
await ledger.sign_and_submit_request(pool_handle, wallet_handle, steward_did, nym_request)

# 얼굴 이미지와 주민번호 해시를 ATTRIB으로 저장
await store_face_hash_attr(issuer_did, wallet_handle, pool_handle, ssn, image_url)

# Credential 생성 요청 및 발급
cred_req, cred_req_metadata = await anoncreds.prover_create_credential_req(...)
cred_json, _, _ = await anoncreds.issuer_create_credential(...)

# Credential 저장 및 증명 생성
stored_cred_id = await anoncreds.prover_store_credential(...)
proof = await anoncreds.prover_create_proof(...)

load.py: 얼굴 이미지 조회 기능

python -m src.load <주민번호> <issuer_did>

코드 흐름 예시

# ATTRIB 요청 생성 및 제출
get_attr_req = await ledger.build_get_attrib_request(did, did, 'face_image', None, None)
get_attr_resp = await ledger.submit_request(pool_handle, get_attr_req)

# 주민번호 해시 비교
data = json.loads(json.loads(get_attr_resp)['result']['data'])
if data['face_image']['ssn_hash'] == hash_ssn(ssn):
    print("✅ 해시 일치")
else:
    print("❌ 불일치")

anoncreds_revocation.py: 취소 가능한 증명 흐름

python -m src.main anoncreds_revocation

코드 흐름 예시

# Revocation registry 생성
rev_reg_id, rev_reg_def = await create_revocation_registry(...)

# Credential 발급 시 revocation 정보 포함
cred_json, _, _, _ = await anoncreds.issuer_create_credential(...)

# 증명 요청에서 non_revoked 필드 포함
proof_request = {
  "nonce": "123456",
  "name": "proof_req",
  "version": "0.1",
  "requested_attributes": {...},
  "requested_predicates": {...},
  "non_revoked": {"from": 0, "to": int(time.time())}
}

crypto.py: DID 기반 서명 및 검증

python -m src.main crypto

코드 흐름 예시

# DID 생성
sender_did, sender_vk = await did.create_and_store_my_did(wallet, '{}')
receiver_did, receiver_vk = await did.create_and_store_my_did(wallet, '{}')

# 메시지 암호화 및 복호화
message = b"Hello"
enc_message = await crypto.auth_crypt(wallet, sender_vk, receiver_vk, message)
from_vk, decrypted = await crypto.auth_decrypt(wallet, receiver_vk, enc_message)

txn_author_agreement.py

python -m src.main txn_author_agreement

코드 흐름 예시

# TAA 및 AML 조회
taa = await ledger.get_txn_author_agreement(pool_handle, None)
aml = await ledger.get_acceptance_mechanisms(pool_handle, None, None)

# 트랜잭션에 TAA 수락 정보 포함
request = await ledger.build_schema_request(issuer_did, schema_data)
request_with_acceptance = await ledger.append_txn_author_agreement_acceptance_to_request(
    request, taa['text'], taa['version'], taa['digest'], "service_agreement", int(time.time())
)

용어 설명

용어 설명
DID (Decentralized Identifier) 탈중앙화된 고유 식별자. 기존 주민번호처럼 개인을 식별하지만 중앙기관 없이 생성됨. 공개키 기반으로 생성됨.
Ledger 블록체인 원장. 트랜잭션을 저장하는 분산 데이터베이스.
NYM 트랜잭션 DID를 블록체인에 등록하는 트랜잭션. DID와 verkey를 등록함.
ATTRIB 트랜잭션 DID에 속성(attribute)을 부여하는 트랜잭션. 예: 얼굴 이미지, 해시값 등.
Credential 증명서. 예: 나이, 이름, 성별 등의 속성들이 포함된 디지털 문서.
Credential Definition (CredDef) 특정 스키마(Schema)에 따라 발급되는 증명서의 정의. 어떤 기관이 어떤 정보를 어떤 방식으로 발급하는지 설정.
Proof Verifier에게 제시할 수 있는 증거. 저장된 Credential에서 요청된 항목만 추려서 제시 가능.
Revocation 발급된 Credential을 나중에 무효화할 수 있는 기능. 예: 졸업 취소, 인증 만료 등.
Tails 파일 Revocation 처리 시 사용되는 파일. 증명서의 상태 정보를 저장.
TAA (Transaction Author Agreement) 블록체인 트랜잭션을 작성하는 주체가 계약에 동의했다는 것을 기록하는 메커니즘.
Verkey (Verification Key) 공개키. DID에 연결된 키쌍의 공개키 역할. 메시지 서명 및 검증에 사용.
auth_crypt / auth_decrypt DID 기반 비밀 메시지 암호화/복호화 함수. 상대방 DID로 암호화하고, 송신자 DID로 서명함.

실행 환경

샘플 실행 방식

python -m src.<파일명 (확장자 없이)>

예시:

python -m src.anoncreds

전체 샘플 순차 실행:

python -m src.main

Validator 노드 요구

  • ledger.py, getting_started.py, main.py 등은 블록체인 노드가 필요합니다.
  • 노드는 127.0.0.1 또는 TEST_POOL_IP 환경변수로 설정된 IP에 실행되어야 합니다.
  • Docker 기반 validator 풀은 doc/getting-started/docker-compose.yml에 있으며 기본 IP는 10.0.0.2입니다.

TODO 또는 개선 포인트

  • 얼굴 이미지의 실제 저장이 아닌 URL 기반 → IPFS 또는 온체인 저장 방식으로 확장 가능
  • DID와 DID 간의 관계 연결 (예: 발급자-소유자-검증자)
  • Web UI 또는 API 서버로 확장 가능