기본 콘텐츠로 건너뛰기

11월, 2024의 게시물 표시

JWT 토큰 생성과 유효성 확인 과정

JWT 토큰 생성과 유효성 확인 과정 API 서비스를 개발하고 이에 대한 접근 권한을 제어하기 위하여 JSON Web Token(JWT)을 활용할 수 있습니다. 이 문서에서는 JWT 토큰의 생성과 유효성 확인 과정을 그림과 Python 코드를 사용하여 설명합니다. 전자서명 알고리즘으로는 HS256을 사용 하였습니다. HS256(HMAC-SHA256) 대칭키 암호화 방식 HMAC(Hash-based Message Authentication Code) 해시 함수를 기반으로 메시지 인증 코드를 생성하는 알고리즘 다음은 토큰 생성과 유효성 확인 과정에서 사용하게 될 Base64 인코딩/디코딩 함수입니다. import base64 import hashlib import hmac def base64_encode ( input_as_bytes ) : b = base64 . urlsafe_b64encode ( input_as_bytes ) . decode ( 'utf-8' ) return b . rstrip ( '=' ) def base64_decode ( input_as_string ) : padding = 4 - len ( input_as_string ) % 4 input_as_string = input_as_string + '=' * padding return base64 . urlsafe_b64decode ( input_as_string . encode ( 'utf-8' ) ) . decode ( 'utf-8' ) 1. 토큰 생성 1.1. 다이어그램 1.2. Python 구현 def create_jwt_token ( header_obj_str , payload_obj_str , secret ) : header = base64_encod...

Circom SHA256 해시 예제

Circom SHA256 해시 예제 아래 문서의 예제를 약간 변형해서 SHA256 해시 검증을 실습하였습니다. Zero-Knowledge Proof of SHA256 Hash using zkSNARK , Binod, Medium 회로 생성 프로젝트 디렉토리에서 회로 파일 program.circom 작성 pragma circom 2.0.0; include "./circomlib/circuits/sha256/sha256.circom"; template program() { signal input in[8]; signal output out[256]; component SHA = Sha256(8); SHA.in <== in; out <== SHA.out; } component main = program(); 프로젝트 디렉토리에서 Git 저장소 circomlib 복제 git clone https://github.com/iden3/circomlib.git 회로 컴파일 circom program.circom --r1cs --wasm --sym --c 신뢰 설정 - Powers of Tau 프로젝트 디렉토리에서 ‘powers of tau’ ceremony 시작 snarkjs powersoftau new bn128 15 pot15_0000.ptau -v 첫 번째 기여 snarkjs powersoftau contribute pot15_0000.ptau pot15_0001.ptau --name="First contribution" -v 신뢰 설정 - Phase 2 program_js 디렉토리에서 Phase 2 준비 (시간이 많이 걸림) snarkjs powersoftau prepare phase2 ..\pot15_0001.ptau pot15_final.ptau -v .r1cs 파...

Circom 예제로 영지식 증명 시작하기 (1)

Circom 예제로 영지식 증명 시작하기 (1) Circom 2 Getting started 문서를 따라하면서 작성한 문서입니다. 실습 환경: Windows 11 Node.js v20.18.0 circom compiler 2.1.9 snarkjs@0.7.5 1. 소프트웨어 설치 Downloads 페이지에서 circom Windows binary 를 클릭하고 파일 circom-windows-amd64.exe 를 원하는 디렉토리에 저장합니다. 파일 크기는 약 10MB입니다. 여기서는 파일 이름을 circom.exe 로 바꾸고 아래 경로에 저장합니다. C:\DevTools\circom.exe snarkjs 를 설치합니다. npm install -g snarkjs 2. 회로 생성하기 아래 내용을 multiplier2.circom 에 저장합니다. pragma circom 2.0.0; /*This circuit template checks that c is the multiplication of a and b.*/ template Multiplier2 () { // Declaration of signals. signal input a; signal input b; signal output c; // Constraints. c <== a * b; } component main = Multiplier2(); 3. 회로 컴파일하기 multiplier2.circom 파일을 컴파일합니다. circom multiplier2.circom --r1cs --wasm --sym --c 컴파일 결과 다음과 같은 파일들이 생성됩니다. multiplier2.r1cs multiplier2.sym multiplier2_cpp\ calcwit.cpp calcwit.hpp circom.hpp fr.asm fr.cpp ...

snarkjs 예제로 영지식 증명 시작하기 (2)

snarkjs 예제로 영지식 증명 시작하기 (2) snarkjs 예제로 영지식 증명 시작하기 (1) 에서 작성한 회로의 제한 조건 개수를 1000에서 1로 변경하여 다음 두 가지 예시를 보여 줍니다. 증명 성공 예시 a*a + b의 결과가 20인 두 수를 제공할 수 있음 증명 실패 예시 a*a + b의 결과가 21인 두 수를 제공할 수 있음 1. 회로 생성 제한 조건 개수 변경하여 circuit2.circom 파일로 저장 pragma circom 2.0.0; template Multiplier(n) { signal input a; signal input b; signal output c; signal int[n]; int[0] <== a*a + b; for (var i=1; i<n; i++) { int[i] <== int[i-1]*int[i-1] + b; } c <== int[n-1]; } component main = Multiplier(1); 컴파일 circom --r1cs --wasm --c --sym --inspect circuit2.circom 2. 신뢰 설정 - Phase 2 snarkjs 예제로 영지식 증명 시작하기 (1) 의 중간 결과물을 활용하면서 새로 생성하는 파일들이 기존 파일들을 덮어쓰는 것을 피하기 위하여 circuit2_js 디렉토리로 이동하여 다음 작업들을 수행합니다. Phase 2 준비 snarkjs powersoftau prepare phase2 ..\pot14_beacon.ptau pot14_final.ptau -v 마지막 ptau 검증 snarkjs powersoftau verify pot14_final.ptau .r1cs 파일과 연관된 .zkey 파일 생성 snarkjs groth16 setup ..\circuit2.r...

Circom 예제로 영지식 증명 시작하기 (2)

Circom 예제로 영지식 증명 시작하기 (2) Circom 예제로 영지식 증명 시작하기 (1) 에서 작성한 회로를 사용하여 다음 두 가지 예시를 보여 줍니다. 증명 성공 예시 곱셈의 결과가 34인 두 수를 제공할 수 있음 증명 실패 예시 곱셈의 결과가 33인 두 수를 제공할 수 있음 곱셈의 결과가 34인 두 수를 제공할 수 있음 1. witness 계산하기 입력 값, 중간 신호, 출력 값을 witness 라고 합니다. multiplier2_js 디렉토리로 이동합니다. cd multiplier2_js 아래 내용을 input2.json 파일에 저장합니다. {"a": "2", "b": "17"} witness를 계산하여 witness2.wtns 파일에 저장합니다. node generate_witness.js multiplier2.wasm input2.json witness2.wtns 2. 증명 성공 예시 2.1. 증명 생성 회로 및 witness와 연관된 증명을 생성합니다. snarkjs groth16 prove multiplier2_0001.zkey witness2.wtns proof2.json public2.json 위 명령은 다음 두 파일을 생성합니다. proof2.json : 증명 포함 { "pi_a": [ "14743280952072949668948706550574899717145559551048017963794441189237494636481", "14298005267871599183835964858782397954547197261581693679006469198474879205631", "1" ], "pi_b": [ [ "362627714403151142...

snarkjs 예제로 영지식 증명 시작하기 (1)

snarkjs 예제로 영지식 증명 시작하기 (1) snarkjs README.md 문서를 따라하면서 작성한 문서입니다. 실습 환경: Windows 11 Node.js v20.18.0 circom compiler 2.1.9 snarkjs@0.7.5 1. 소프트웨어 설치 Downloads 페이지에서 circom Windows binary 를 클릭하고 파일 circom-windows-amd64.exe 를 원하는 디렉토리에 저장합니다. 파일 크기는 약 10MB입니다. 여기서는 파일 이름을 circom.exe 로 바꾸고 아래 경로에 저장합니다. C:\DevTools\circom.exe snarkjs 를 설치합니다. npm install -g snarkjs 2. 신뢰 설정 - Powers of Tau “powers of tau” ceremony 시작 snarkjs powersoftau new bn128 14 pot14_0000.ptau -v 첫 번째 기여 snarkjs powersoftau contribute pot14_0000.ptau pot14_0001.ptau --name="First contribution" -v 두 번째 기여 snarkjs powersoftau contribute pot14_0001.ptau pot14_0002.ptau --name="Second contribution" -v -e="some random text" 세 번째 기여 snarkjs powersoftau export challenge pot14_0002.ptau challenge_0003 snarkjs powersoftau challenge contribute bn128 challenge_0003 response_0003 -e="some random text" snarkjs powersoftau import respon...