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.
Code
Clone this repository
Search code…
Latest commit message
Hyperledger Indy SDK
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 서버로 확장 가능