티스토리 뷰

반응형

이 폴더에는 Indy SDK로 일반적인 작업을 수행하는 방법을 보여주는 간단한 튜토리얼이 포함되어 있습니다. 최상의 결과를 얻으려면 다음을 순서대로 진행하십시오.

  1. Write a DID and Query Its Verkey(DID 작성 및 Verkey 쿼리)
  2. Rotate a Key(키 회전)
  3. Save a Schema and Cred Def(Schema 및 Cred Def 저장)
  4. Issue a Credential(Credential 발급)
  5. Negotiate a Proof(증명 협상)
  6. Send a Secure Message(보안 메시지 전송)

 

Write a DID and Query Its Verkey(DID 작성 및 Verkey 쿼리)

원본 사이트 : https://hyperledger-indy.readthedocs.io/projects/sdk/en/latest/docs/how-tos/write-did-and-query-verkey/README.html

이것은 indy에서 가장 기본적인 작업입니다. 새 DID를 설정한 다음 원장에서 해당 정보를 쿼리할 수 있음을 증명합니다. 이 방법을 수행한 후의 바람직한 단계는 "키 회전(Rotate Key)"입니다.

사용법(how-to)을 실행하는 데 문제가 있는 경우 trouble shooting 섹션을 읽으십시오.

 

Prerequisites(전제 조건)

indy 개발 가상 머신(VM)으로 워크 스테이션을 설정하십시오. prerequisites를 참조하십시오.

 

Steps(단계)

Step 1(1단계)

일반 워크스테이션 운영 시스템 (VM 아님)에서 선택한 텍스트 편집기를 열고 목록에 있는 사용 가능한 템플릿 코드 중 하나의 템플릿 코드를 새 파일에 붙여넣고 write_did.EXT로 저장한 다음 EXT를 적절한 것으로 바꿉니다 (python 예: write_did.py, nodejs 예: write_did.js 등).  이후 단계에서 이 코드를 수정할 것입니다.

[ Python template | Java template | .NET template | Node.js template | Rust template ]

이것은 작성하려는 코드를 연결하는 매우 간단한 앱 프레임워크입니다.

 

Step 2(2단계)

이제 SDK에 indy 원장을 처리하는데 필요한 컨텍스트(context)를 제공해야합니다. 이를 위해 SDK는 SDK가 어떻게 네트워크의 원장에 접촉하고 어떻게 해당 노드에 적절한 키가 있다는 것을 신뢰하게 하는지에 대해 SDK에게 알려주는 몇 가지 제네시스 트랜잭션(genesis transactions)을 제공해야합니다.

또한 identity wallet을 만들어야 SDK가 튜토리얼 진행 중에 생성된 DID 및 key 자료를 저장할 수 있습니다.

아래의 step2 파일의 내용을 Step 2 code goes here 위치 표시 주석 대신 write_did 파일로 복사하여 저장하십시오.

[ Python step2 | Java step2 | .NET step2 | Node.js step2 | Rust step2 ]

변경 사항에 대해 연구하십시오. 이와 같은 스캐폴딩(scaffolding) 코드는 indy를 사용하는 모든 곳에 나타날 수 있습니다.

 

Step 3(3단계)

이제 우리는 identity wallet에 몇 개의 DID와 key를 넣어야합니다. 아래의 step3 파일의 내용을 Step 3 code goes here 위치 표시 주석 대신 write_did 파일로 복사하여 저장하십시오.

[ Python step3 | Java step3 | .NET step3 | Node.js step3 | Rust step3 ]

변경 사항에 대해 연구하십시오.

indy의 일부 작업은 특별한 역할을 가진 identity(DID)에 의해서만 수행될 수 있습니다. 예를 들어, steward인 DID는 유효성 검사기 pool에 노드(자신이 소유한 노드)를 추가하고 trust anchor 역할로 DID를 생성할 수 있습니다. trust anchor DID는 원장에 임의의 DID를 추가할 수 있습니다.

여기에서는 하나의 steward와 하나의 trust anchor identity를 위해 DID+keypair로 신원 지갑(identity wallet)을 채우고 있습니다. steward identity는 부트스트랩 단계이지만, trust anchor DID는 나중에 쿼리할 예정입니다.

steward DID는 seed로 생성되지만 trust anchor DID는 아닙니다. steward DID와 그의 verkey는 이미 원장에 있기 때문입니다. 그것들은 우리가 SDK에게 이전 단계에서 시작하도록 지시한 제네시스 트랜잭션(genesis transaction)의 일부입니다. 그러나 DID, verkey 및 private signing key(원장이 알지 못하는)도 지갑(wallet)에 넣어야하므로 signing key를 사용하여 서명 가능한 트랜잭션을 원장에 제출할 수 있습니다. 우리는 이 steward의 signing key를 사용하여 다음 DID(trust anchor를 위한 새로운 DID)를 만들 것입니다. 이것이 steward DID를 생성할 때 하드 코딩된 seed를 사용하는 이유입니다. 이는 제네시스 트랜잭션(genesis transaction)이 예상하는 것과 동일한 DID 및 key 자료가 생성되도록 보장합니다. Sovrin "live" 네트워크와 같은 프로덕션 indy pool에서 부트스트랩된 steward identity는 seed를 알지 못했을 것입니다.

 

Step 4(4단계)

이제 준비가 완료되었으므로 마지막으로 trust anchor identity에 대한 DID 및 verkey를 원장에 작성할 수 있습니다.

아래의 step4 파일의 내용을 Step 4 code goes here 위치 표시 주석 대신 write_did 파일로 복사하여 저장하십시오.

[ Python step4 | Java step4 | .NET step4 | Node.js step4 | Rust step4 ]

 

Step 5(5단계)

원장에 identity가 작성된 뒤에는 그것을 쿼리할 수 있습니다.

아래의 step5 파일의 내용을 Step 5 code goes here 위치 표시 주석 대신 write_did 파일로 복사하여 저장하십시오.

[ Python step5 | Java step5 | .NET step5 | Node.js step5 | Rust step5 ]

우리의 목표를 위해서는 단지 몇 줄의 코드만 중요합니다. 이 블록의 나머지 부분은 주석과 상용구 정리입니다(생략해서는 안됩니다!). 이 쿼리 "트랜잭션(transaction)"과 이전의 쓰기 트랜잭션이 번들, 전송 및 대기하는 방식 사이에는 유사점이 있습니다.

 

Step 6(6단계)

완성된 데모를 실행하고 전체 시퀀스를 관찰하십시오.

[ Python complete | Java complete | .NET complete | Node.js complete | Rust complete ]

 

More experiments(더 많은 실험)

이 how-to에 존재하는 코드 대부분은 일부 전제 조건을 만족시키기 위해 존재합니다. trust anchor identity가 있으므로 코드 몇 줄만으로 원장에 여러 가지 추가적인 identity들을 쓰거나 쿼리할 수 있습니다. 몇 가지를 만들어보십시오.

"키 회전(Rotate a Key)" 방법을 시도할 수 있습니다. 이 방법은 이미 완성된 단계에서 한 단계만 더 수행하면 됩니다.

seed를 사용하지 않거나 다른 seed를 사용하여 새로운 steward identity를 생성하고 어떤 종류의 오류가 발생하는지 확인할 수도 있습니다. trustee 역할을 하는 identity만이 steward를 생성할 수 있습니다.

 

Rotate a Key(키 회전)

원본 사이트 : https://hyperledger-indy.readthedocs.io/projects/sdk/en/latest/docs/how-tos/rotate-key/README.html

이것은 원장이 DID와 관련된 verkey를 변경하는 방법을 보여줍니다. 이것은 "Write DID and Query Its Verkey(DID 작성 및 Verkey 쿼리)"를 기반으로 합니다.

사용법을 실행하는 데 문제가 있을 경우 trouble shooting 섹션을 읽어보십시오.

 

Prerequisites(전제 조건)

indy 개발용 가상 머신(VM)을 사용하여 워크스테이션을 설정하십시오. prerequisites를 참조하십시오.

 

Steps(단계)

Step 1(1단계)

일반 워크스테이션 운영 시스템(VM 아님)에서 선택한 텍스트 편집기를 열고 아래 목록에 있는 사용 가능한 템플릿 코드 중 하나를 새로운 파일에 붙여넣고 이를 rotate_key.EXT로 저장한 뒤, EXT를 적절한 파일 확장자로 교체합니다(python 예: rotate_key.py, nodejs 예: rotate_key.js 등). 우리는 나중에 이 코드를 수정할 것입니다.

[ Python template | Java template | Node.js template | Rust template ]

 

Step 2(2단계)

이 방법은 "Write a DID and Query Its Verkey(DID 작성 및 Verkey 쿼리)"의 작업을 바탕으로 진행합니다. 여기에서 해당 단계에 대한 설명을 복제하지 않고 해당 코드를 시작 지점으로 복사하기만 하면 됩니다.

아래의 step2 파일의 내용을 Step 2 code goes here 위치 표시 주석 대신 rotate_key 파일로 복사하여 저장하십시오.

[ Python step2 | Java step2 | Node.js step2 | Rust step2 ]

 

Step 3(3단계)

원장에 대한 identity가 확인되면 key pair를 회전(rotate)할 수 있습니다.

아래의 step3 파일의 내용을 Step 3 code goes here 위치 표시 주석 대신 rotate_key 파일로 복사하여 저장하십시오.

[ Python step3 | Java step3 | Node.js step3 | Rust step3 ]

여기서 로직의 대부분은 설명이 필요합니다. 그러나 짝을 이루는 함수인 replace_keys_start 및 replace_keys_apply를 설명하는 것은 가치가 있습니다. 업데이트 트랜잭션을 원장에 제출할 때 현재 signing key를 사용하여 서명해야합니다. 원장은 그것이 인식하는 verkey를 사용하여 이를 검증합니다. 그러나 트랜잭션 자체에 새로운 verkey 값을 지정해야합니다. replace_keys_start 메소드는 지갑(wallet)에 업데이트가 보류 중이며 identity에 대한 새 keypair와 이전 keypair 모두 추적해야함을 알려줍니다. replace_keys_apply는 보류 상태를 해결하여 로컬 지갑(wallet)에서 새 값이 표준 값이 되도록 합니다(원장이 이미 표준 값이 된 후).

 

Step 4(4단계)

이제 원장에 쿼리하여 identity에 기록된 verkey를 확인할 수 있습니다.

아래의 step4 파일의 내용을 Step 4 code goes here 위치 표시 주석 대신 rotate_key 파일로 복사하여 저장하십시오.

[ Python step4 | Java step4 | Node.js step4 | Rust step4 ]

우리의 목표를 위해서는 단지 몇 줄의 코드만 중요합니다. 이 블록의 나머지 부분은 주석과 상용구 정리입니다(생략해서는 안됩니다!).

 

Step 5(5단계)

완성된 데모를 실행하고 전체 시퀀스를 관찰하십시오.

[ Python complete | Java complete | Node.js complete | Rust complete ]

 

More experiments(더 많은 실험)

"Save a Schema and Cred Def(Schema 및 Cred Def 저장)" 방법을 실행할 수 있습니다.

 

Save a Schema and Cred Def(Schema 및 Cred Def 저장)

원본 사이트 : https://hyperledger-indy.readthedocs.io/projects/sdk/en/latest/docs/how-tos/save-schema-and-cred-def/README.html

여기에서는 "Issue Credential(Credential 발급)"의 전제 조건인 원장에 Schema 및 Credential Definition을 저장하는 방법을 보여줍니다.

사용법을 실행하는 데 문제가 있는 경우 trouble shooting 섹션을 읽으십시오.

 

Prerequisites(전제 조건)

indy 개발용 가상 머신(VM)을 사용하여 워크스테이션을 설정하십시오. prerequisites를 참조하십시오.

 

Steps(단계)

Step 1(1단계)

일반 워크스테이션 운영 시스템(VM 아님)에서 선택한 텍스트 편집기를 열고 아래 목록에 있는 사용 가능한 템플릿 코드 중 하나를 새 파일에 붙여넣고 save_schema_and_cred_def.EXT로 저장한 후 EXT를 적절한 확장자로 변경합니다(python 예: save_schema_and_cred_def.py, nodejs 예: save_schema_and_cred_def.js 등). 이후 단계에서 이 코드를 수정할 것입니다.

[ Python template | Java template | Rust template ]

이것은 작성하려는 코드를 연결하는 매우 간단한 앱 프레임워크입니다.

 

Step 2(2단계)

이제 SDK에 indy 원장을 처리하는 데 필요한 컨텍스트(context)를 제공해야합니다. 이를 위해 SDK는 SDK가 어떻게 네트워크의 원장에 접촉하고 어떻게 해당 노드에 적절한 키가 있다는 것을 신뢰하게 하는지에 대해 SDK에게 알려주는 몇 가지 제네시스 트랜잭션(genesis transactions)을 제공해야합니다. 또한 SDK가 우리가 사용할 DID와 key 자료를 저장할 수 있도록 지갑(wallet)을 생성해야합니다. 또한, Schame 및 Credential Definition을 생성할 권한이 있는 trust anchor identity를 만들어야합니다.

이러한 모든 단계는 간단한 방법인 "Write a DID and Query Its Verkey(DID 작성 및 Verkey 쿼리)"와 유사한 단계를 거칩니다. 세부적인 사항을 다루지 않고 한 단계만 거치면 이 하우스키핑 기능을 사용할 수 있습니다.

아래의 step2 파일의 내용을 Step 2 code goes here 위치 표시 주석 대신 save_schema_and_cred_def 파일로 복사하여 저장하십시오.

[ Python step2 | Java step2 | Rust step2 ]

변경 사항에 대해 연구하십시오. 이와 같은 스캐폴딩(scaffolding) 코드는 indy를 사용하는 모든 곳에 나타날 수 있습니다.

 

Step 3(3단계)

이제 schema를 생성하고 정의해야합니다. indy의 schema는 이름과 버전을 지정하고 credential에 표시될 속성을 나열하는 매우 간단한 JSON 문서입니다. 오늘날에는 데이터 유형, 반복 규칙, 중첩 및 기타 정교한 구성을 설명하지 않습니다. 이를 더 화려하게 만드는 작업이 진행 중입니다. 자세한 내용은 Rocket.Chat의 #indy-sdk 채널을 방문하십시오.

샘플 schema는 다음과 같습니다.:

{
  "id": "1",
  "name": "gvt",
  "version": "1.0",
  "ver": "1.0",
  "attrNames": ["age", "sex", "height", "name"]
}

아래의 step3 파일의 내용을 Step 3 code goes here 위치 표시 주석 대신 save_schema_and_cred_def 파일로 복사하여 저장하십시오.

[ Python step3 | Java step3 | Rust step3 ]

이 schema가 이전에 만든 steward identity에 의해 원장에 어떻게 제출되는지 확인하십시오.

 

Step 4(4단계)

다음으로 Credential Definition을 새성합니다. 여기에서는 방금 추가한 schema를 참조하고 해당 schema로 credential을 발급할 사람(우리의 경우에는 trust anchor identity), 사용할 서명 방법 유형("CL" = "Camenisch Lysyanskya", indy에서 영지식 증명(zero-knowledge proof)을 위해 사용되는 기본 메소드), 해지 처리 방법 등을 알려줍니다.

아래의 step4 파일의 내용을 Step 4 code goes here 위치 표시 주석 대신 save_schema_and_cred_def 파일로 복사하여 저장하십시오.

[ Python step4 | Java step4 | Rust step4 ]

 

Step 5(5단계)

완성된 데모를 실행하고 전체 시퀀스를 관찰하십시오.

[ Python complete | Java complete | Rust complete ]

 

More experiments(더 많은 실험)

"Issue a Credential(Credential 발급)" 방법을 실행할 수 있습니다. 이 방법은 한 번만 수행하면 됩니다.

 

Issue a Credential(Credential 발급)

원본 사이트 : https://hyperledger-indy.readthedocs.io/projects/sdk/en/latest/docs/how-tos/issue-credential/README.html

"Save Schema and Cred Def(Schema 및 Cred Def 저장)" 방법이 끝나면 issuer가 이 워크플로우를 수행할 수 있습니다. 이 방법을 마치면 논리적인 다음 단계는 "Negotiate Proof(증명 협상)"이 될 것입니다.

사용법을 실행하는 데 문제가 있는 경우 trouble shooting 섹션을 읽으십시오.

 

Prerequisites(전제 조건)

indy 개발용 가상 머신(VM)을 사용하여 워크스테이션을 설정하십시오. prerequisites를 참조하십시오.

 

Steps(단계)

Step 1(1단계)

일반 워크스테이션 운영 시스템(VM 아님)에서 선택한 텍스트 편집기를 열고 아래 목록에 있는 사용 가능한 템플릿 코드 중 하나를 새 파일에 붙여넣고 issue_credential.EXT로 저장한 후 EXT를 적절한 확장자로 변경합니다(python 예: issue_credential.py, nodejs 예: issue_credential.js 등). 이후 단계에서 이 코드를 수정할 것입니다.

[ Python template | Java template | Rust template ]

이것은 작성하려는 코드를 연결하는 매우 간단한 앱 프레임 워크입니다.

 

Step 2(2단계)

이 방법은 "Save Schema and Cred Def(Schema 및 Cred Def 저장)"의 작업을 기반으로합니다. 여기에서 해당 단계에 대한 설명을 복제하지 않고 해당 코드를 시작 지점으로 복사하기 만하면됩니다.

아래의 step2 파일의 내용을 Step 2 code goes here 위치 표시 주석 대신 issue_credential 파일로 복사하여 저장하십시오.

[ Python step2 | Java step2 | Rust step2 ]

 

Step 3(3단계)

지금까지 credential을 발급하는 데 사용할 수 있는 identity를 만들었습니다. 이제 우리는 credential이 발급되면 이를 보유하는 데 사용할 수 있는 또 다른 identity가 필요합니다.

아래의 step3 파일의 내용을 Step 3 code goes here 위치 표시 주석 대신 issue_credential 파일로 복사하여 저장하십시오.

[ Python step3 | Java step3 | Rust step3 ]

이 identity는 link secret(이전에는 master secret으로 불렸는데, 이 이전 용어는 더 이상 사용되지 않습니다)을 작성합니다. link secret은 빌급 시 credential에 맹목적인 형태로 삽입되는 특별한 데이터입니다. 이것은 credential이 다른 사람이 아닌 특정 holder의 소유임을 증명하는 데 사용됩니다. Alice의 credential에는 link secret이 포함되어 있기 때문에 Alice 본인만 사용할 수 있습니다.

 

Step 4(4단계)

이 시점에서 issuer와 credential을 받는 사람(holder라고 함)은 대화형 프로토콜을 사용하여 참여합니다.

먼저, issuer는 credential을 제공합니다. 이 단계는 선택 사항입니다. 우리는 완전성을 위해 이것을 포함합니다. 그런 다음 holder는 그것을 묶기 위해 보이지 않는 link secret을 제공하는 credential을 요청합니다. 마지막으로 issuer는 credential을 생성하여 holder에게 제공합니다.

이 세 단계는 많은 indy 상호 작용(예: 증명)에서 사용되는 협상 패턴을 구현합니다. 어느 쪽이든 시작할 수 있습니다. 상대방은 이를 승인하고 수락하거나 반대 제안을 합니다. 반대 제안의 경우 새로운 협상 사이클이 시작됩니다. 간단한 경우 협상이 성공적으로 완료됩니다. credential 발급 중에 credential의 변경(예: 오타를 수정하거나 issuer에게 처음에 제안하지 않은 데이터를 포함하거나 생략하도록 요청)을 협상하기 위해 협상(negotiation)이 사용될 수 있습니다. 그러나 여기서는 이러한 고급 워크플로우를 다루지 않습니다.

또 다른 참고 사항: 이 단계의 샘플 코드는 "credential" 정보를 기대할 수 있는 위치에서 "claim"이라는 단어를 사용합니다. 이 두 단어는 동의어였지만 Indy SDK가 구축된 이후 W3C에서 사용법을 발전시켰습니다. "Credential"은 최신 단어이며 "claims"를 참조하는 기능 및 매개 변수 이름은 더 이상 사용되지 않습니다. 결국, 모든 사용에는 "credential"으로 표시됩니다.

아래의 step4 파일의 내용을 Step 4 code goes here 위치 표시 주석 대신 issue_credential 파일로 복사하여 저장하십시오.

[ Python step4 | Java step4 | Rust step4 ]

 

Step 5(5단계)

완성된 데모를 실행하고 전체 시퀀스를 관찰하십시오.

[ Python complete | Java complete | Rust complete ]

 

More experiments(더 많은 실험)

"Negotiate Proof(증명 협상)" 방법을 실행할 수 있습니다. 이 방법은 한 번만 수행하면 됩니다.

 

Negotiate a Proof(증명 협상)

원본 사이트 : https://hyperledger-indy.readthedocs.io/projects/sdk/en/latest/docs/how-tos/negotiate-proof/README.html

issuer가 "Save Schema and Cred Def(Schema 및 Cred Def 저장)""Issue Credential(Credential 발급)" 방법을 완료한 후 Credential을 기반으로 영지식 증명(zero-knowledge proof)을 생성하기 위해 credential holder와 신뢰 당사자(verifier)에 대한 모든 컨텍스트(context)를 가지게 됩니다.

사용법을 실행하는 데 문제가 있는 경우, trouble shooting 섹션을 읽으십시오.

 

Prerequisites(전제 조건)

indy 개발용 가상 머신(VM)을 사용하여 워크스테이션을 설정하십시오. prerequisites를 참조하십시오.

 

Steps(단계)

Step 1(1단계)

일반 워크스테이션 운영 시스템(VM 아님)에서 선택한 텍스트 편집기를 열고 아래 목록에 있는 사용 가능한 템플릿 코드 중 하나를 새 파일에 붙여넣고 negotiate_proof.EXT로 저장한 후 EXT를 적절한 확장자로 변경합니다(python 예: negotiate_proof.py, nodejs 예: negotiate_proof.js 등). 이후 단계에서 이 코드를 수정할 것입니다.

[ Python template | Java template | Node.js template | Rust template ]

이것은 작성하려는 코드를 연결하는 매우 간단한 앱 프레임 워크입니다.

 

Step 2(2단계)

이 방법은 "Issue Credential(Credential 발급)"의 작업을 기반으로 합니다. 여기에서 해당 단계에 대한 설명을 반복하지 않고 해당 코드를 시작 지점으로 복사하기만 하면 됩니다.

아래의 step2 파일의 내용을 Step 2 code goes here 위치 표시 주석 대신 negotiate_proof 파일로 복사하여 저장하십시오.

[ Python step2 | Node.js step2 | Rust step2 ]

 

Step 3(3단계)

Proof negotiation은 일반적으로 verifier(신뢰 당사자(relying party)라고도 함)가 proof를 요청할 때 시작됩니다. (cerdential 발급과 마찬가지로 프로세스에는 세 가지 논리적 단계가 있지만 proof offer로 시작하는 경우는 거의 없습니다. 그러나 최초 proof 요청이 counter-offer로 충족되면 시퀀스의 제안 단계가 관련됩니다.)

proof request는 어떤 종류의 proof가 신뢰 당사자(relying party)를 만족시키는지를 설명하는 JSON 파일입니다.

proof request가 수신되면 credential의 holder는 identity wallet을 검색하여 요청을 충족시키는 데 사용할 수 있는 credential을 찾아야합니다. (wallet 검색은 비효율적이지만 수십 또는 수백 개의 credential에 문제가 발생하지는 않습니다. 대규모의 경우 새로운 메커니즘이 필요합니다. index-deriven 검색을 indy wallet에 추가하는 작업이 진행 중입니다. 자세한 내용은 Rocket.Chat의 #indy-sdk 채널을 방문하십시오.)

아래의 step3 파일의 내용을 Step 3 code goes here 위치 표시 주석 대신 negotiate_proof 파일로 복사하여 저장하십시오.

[ Python step3 | Node.js step3 | Rust step3 ]

 

Step 4(4단계)

이 시점에서 holder는 proof를 생성하고 제시함으로써 prover가 됩니다. 이는 prover가 요청을 만족하기 위해 사용하려는 credential(이전 단계에서 유효한 후보로 식별된 credential 중 하나)을 선택하는 일부 JSON을 빌드하여 수행됩니다. prover는 적절한 파라매터를 사용하여 prover_create_proof 함수를 호출하면 proof가 생성됩니다.

아래의 step4 파일의 내용을 Step 4 code goes here 위치 표시 주석 대신 negotiate_proof 파일로 복사하여 저장하십시오.

[ Python step4 | Node.js step4 | Rust step4 ]

 

Step 5(5단계)

마지막으로, verifier는 제시된 proof가 해당 기준을 충족하는지 확인해야합니다. 이것은 쉽습니다. verifier_verify_proof 함수를 호출하기만 하면 됩니다.

아래의 step5 파일의 내용을 Step 5 code goes here 위치 표시 주석 대신 negotiate_proof 파일로 복사하여 저장하십시오.

[ Python step5 | Node.js step5 | Rust step5 ]

 

Step 6(6단계)

완성된 데모를 실행하고 전체 시퀀스를 관찰하십시오.

[ Python complete | Node.js complete | Rust complete ]

 

More experiments(더 많은 실험)

"Send a Secure Message(보안 메시지 전송)" 방법을 실행할 수 있습니다. 이 방법은 한 번만 수행하면 됩니다.

 

Send a Secure Message(보안 메시지 전송)

원본 사이트 : https://hyperledger-indy.readthedocs.io/projects/sdk/en/latest/docs/how-tos/send-secure-msg/README.html

여기에서는 indy-sdk의 에이전트 간 통신 기능을 활용하여 보안 메시지를 주고받는 방법을 보여줍니다. 메시지의 기초 요소는 다른 사용법(how-tos)에서는 명시적으로 요구되지는 않지만 많은 상호 작용에서 중요합니다.

사용법을 실행하는 데 문제가 있는 경우, trouble shooting 섹션을 읽으십시오.

 

Prerequisites(전제 조건)

indy 개발용 가상 머신(VM)을 사용하여 워크스테이션을 설정하십시오. prerequisites를 참조하십시오.

 

Steps(단계)

Step 1(1단계)

일반 워크스테이션 운영 시스템(VM 아님)에서 선택한 텍스트 편집기를 열고 아래 목록에 있는 사용 가능한 템플릿 코드 중 하나를 새 파일에 붙여넣고 send_secure_msg.EXT로 저장한 후 EXT를 적절한 확장자로 변경합니다(python 예: send_secure_msg.py, nodejs 예: send_secure_msg.js 등). 이후 단계에서 이 코드를 수정할 것입니다.

[ Python template | Java template | Rust template ]

이것은 메시지 발신자 또는 수신자로 작동할 수 있는 매우 간단한 앱입니다. 기본 구조를 이해하는 데 약간의 시간이 소요됩니다. 입력을 요구하는 루프를 실행합니다.

read, prep, 및 quit의 세 가지 명령을 인식합니다.

 

Step 2(2단계)

워크스테이션에서 앱을 실행하십시오. 간단한 텍스트 출력이 나타납니다. 몇 가지 명령을 시도하십시오.

완료되면 quit을 입력하십시오.

 

Step 3(3단계)

이제 흥미로운 기능의 추가를 시작하겠습니다.

가장 먼저 해야할 일은 앱에 통신에 필요한 DID와 key를 제공하는 것입니다. 텍스트 편집기에서 해당 step3 파일을 열고 첫 번째 단계에서 만든 send_secure_msg 파일의 내용을 복사해 템플릿에서 init() 함수의 stub을 대체합니다. 저장한 다음 변경 사항을 연구하십시오.

[ Python step3 | Rust step3 ]

먼저 init()은 사용자에게 이름을 묻습니다. 그런 다음 indy-sdk의 create_wallet() 함수를 호출하여 가상의 pool(원장)과 연결된 wallet을 만듭니다. 이것은 wallet handle에 기록됩니다. wallet이 만들어지면 wallet을 열고 indy-sdk에게 DID와 공개 verkey + 개인 signing key 쌍을 생성하여 wallet에 모든 정보를 저장하도록 요청합니다.

마지막으로, init()은 사용자에게 메시지를 교환할 상대방의 DID와 verkey를 제공하도록 요청하고, wallet에 남아있는 비밀 signing key를 제외한 축적된 모든 정보의 tuple을 반환합니다.

 

Step 4(4단계)

개발용 VM에서 앱을 다시 실행하십시오.

이름을 묻는 메시지가 나타납니다. "Alice"라고 말합니다. 그런 다음 앱에서 생성한 DID 및 verkey를 나타내고 상대방의 DID 및 verkey를 요청해야합니다.

앱을 종료하려면 Ctrl+C를 누릅니다.

Who are you? Alice
wallet = 1
my_did and verkey = ChST7uE2KH3hscqycs5mVf 7NmnhUTnqqh1xydTSZNZCp1wTt3HAua7gA5T2odzLSTf
Other party's DID and verkey? ^C

우리는 결국 이 앱을 두 번 실행(한 창에서는 Alice로, 다른 창에서는 Bob으로)할 것입니다. 앱의 각 인스턴스는 자체 key를 생성하며 복사/붙여넣기를 사용하여 다른 창과 공유할 수 있습니다.

 

Step 5(5단계)

이제 우리는 indy crypto의 auth_crypt()를 사용하여 보안 암호화를 추가해야합니다.

해당 step5 파일의 내용을 send_secure_msg 파일에 복사하여 prep() 함수의 stub을 대체합니다. 저장한 다음 변경 사항을 연구하십시오.

[ Python step5 | Rust step5 ]

prep() 함수는 커맨드 라인에 입력된 문자열 인수로 호출되도록 설계되었습니다.

예를 들어, 사용자가 prep Hello, world를 입력하면 prep() 함수의 msg 파라매터는 "Hello, world" 값을 받습니다. prep은 이 메시지를 이진 파일로 인코딩하고 저장하여 후에 다음 단계에서 읽을 수 있도록 하여 두 에이전트 간의 통신 채널을 시뮬레이션합니다. 그런 다음 auth_crypt()를 호출하여 해당 바이트를 특정 두 identity 사이의 private channel에 대해 암호화된 버전으로 변환합니다. 수신자는 발신자가 수신자만 해석할 수 있으며, 변조되지 않은 메시지를 작성했다는 것을 알 수 있습니다.

원하는 경우 개발 VM에서 업데이트된 앱을 다시 실행하십시오. 상대방의 DID 및 verkey를 입력하라는 메시지가 표시되면 이전 실행 중에 생성된 값을 공백으로 구분하여 붙여넣고(예: ChST7uE2KH3hscqycs5mVf 7NmnhUTnqqh1xydTSZNZCp1wTt3HAua7gA5T2odzLSTf) Enter 키를 누른 다음 prep Hello, world를 입력하여 암호화된 message.dat 파일을 생성하십시오.

앱을 종료하려면 Ctrl+C를 누릅니다.

 

Step 6(6단계)

앱에 필요한 마지막 기능은 암호화된 데이터를 읽는 기능입니다. 해당 step6 파일의 내용을 send_secure_msg 파일에 복사하여 prep() 함수의 stub을 대체합니다. 저장한 다음 변경 사항을 연구하십시오.

[ Python step6 | Rust step6 ]

read 함수는 매우 간단합니다. message.dat 파일의 내용을 디스크에서 메모리로 복사한 다음 바이트 배열에서 indy crypto의 auth_decrypt() 함수를 호출합니다. 출력은 메시지가 수신자의 키에 대해 암호화된 경우 발신자의 verkey와 해독된 값을 포함하는 tuple이거나 그렇지 않은 예외 경우입니다.

 

Step 7(7단계)

이제 이 모든 것을 함께 합니다. 완성된 데모를 실행하고 전체 시퀀스를 관찰하십시오.

[ Python complete | Rust complete ]

indy 개발용 VM에서 두 개의 쉘(명령 프롬프트)을 작성하십시오. 둘 다 코드의 위치를 현재 작업 디렉터리로 가지고 있어야합니다. send_secure_msg 스크립트의 한 인스턴스를 첫 번째 창에서 실행하고 다른 인스턴스를 두 번째 창에서 실행하십시오.

첫 번째 창에서 이름을 묻는 메시지가 나타나면 "Alice"라고 말합니다. 두 번째 창에서는 "Bob"이라고 말합니다.

Alice 창에서 Alice의 DID 및 verkey를 지정하는 행이 표시됩니다. 이것은 다음과 같아야합니다.:

my_did and verkey = ChST7uE2KH3hscqycs5mVf 7NmnhUTnqqh1xydTSZNZCp1wTt3HAua7gA5T2odzLSTf

이 두 문자열("my_did and verkey = " 뒤에 있는 모든 문자열)을 클립 보드에 복사하십시오.

Bob 창으로 이동하십시오. Bob의 창에는 다른 DID와 verkey가 표시되어야하며 Alice의 정보를 묻는 메시지가 표시되어야합니다.

Alice의 정보를 Bob의 창에 붙여 넣고 Enter를 누르십시오.

Bob의 정보를 복사하여 Alice의 창에 붙여 넣습니다.

참고: 두 창 사이의 복사 및 붙여 넣기 프로세스는 Sovrin 생태계에서보다 정교한 onboarding 워크플로우를 모델링하는 간단한 방법입니다. Sovrin 생태계 내에서 당사자들은 신뢰할 수 있는 상호 소개를 받거나 상대방이 QR 코드를 스캔하거나 전화 또는 대면 정보를 교환하는 곳을 받습니다.

이제 두 창 모두 다시 프롬프트를 표시해야합니다.

Alice 창에서 prep Hi, Bob.을 입력하고 Enter를 누르십시오.

Bob 창에서 read를 입력하고 Enter를 누르십시오.

Bob의 창은 Alice에서 해독하는 tuple을 표시해야합니다. tuple의 첫 번쨰 요소는 Alice의 verkey(확인하려면 값을 체크하십시오)입니다. 두 번째는 "Hi, Bob."이라는 텍스트입니다. Alice가 Bob에게 암호화된 메시지를 보냈습니다.

 

More Experiments(더 많은 실험)

바이너리 편집기로 message.dat을 수정하십시오. 이것은 도청에 의한 변조를 시뮬레이션합니다. Bob이 메시지의 암호 해독을 시도하면 암호 해독이 실패합니다.

다른 채널을 통해 암호화된 메시지를 전송하십시오. 예를 들어, Alice가 메시지를 작성한 후 message.dat으로 전자 메일을 보내거나 네트워크를 통해 복사하거나 Skype 또난 Slack을 통해 첨부 파일로 보냅니다. 그런 다음 수신된 패키지를 이름이 message.dat인 올바른 폴더에 복사하고 Bob에게 읽도록 요청하십시오.

스크립트를 수정하여 auth_crypt() 대신 anon_crypt()를 사용하고 auth_decrypt() 대신 anon_decrypt()를 사용하십시오. 결과를 확인하십시오.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함