No description
- Python 99.6%
- Dockerfile 0.4%
| debian | ||
| indy | ||
| src | ||
| tests | ||
| .gitignore | ||
| Dockerfile | ||
| environment.yml | ||
| install.sh | ||
| README.md | ||
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 서버로 확장 가능