티스토리 뷰

블록체인에서 시그니쳐(서명)는 아주 중요한 두가지 인증을 하게 된다.

1. 지갑 주인만이 지갑에서 돈을 사용할 수 있게 한다.
2. 지갑 주인이 아닌 다른 사람이 주인이 발행한 transaction에 대해서 데이터 수정 하는 것을 막아준다.

Private(개인)키는 데이터에 사인을 추가하는 작업이고, Public(공용)키는 데이터를 검증 하는데 사용을 한다.

예:) 철수가 2개의 코인을 영철이 한테 보내려고 한다. 철수는 소프트웨어 지갑에서 이에 관련된 (장부)transaction을 작성하여 블록체인 네트워크에 등록하며,  광부들은 이 장부를 검증하여 블록체인 의 다음 불록에 추가하는 작업을 하게 된다.
그런대 이때 광부A 가 데이터를 변경하려고 시도한다. 즉 장부에 있는 수신자를 자신으로 바꾸려고 하는것이다. 하지만 철수는 다행이도 자신의 개인키를 이용하여 이 장부의 데이터에 사인을 한상태이다. 철수의 공개키를 가지고 있는 모든 사람은 공개키를 사용하여 데이터의 변경 여부를 검증할 수 있다.(다른 사람의 공개키로는 데이터의 변경여부를 검증 할 수 없다.)

개인&공기 키의 생성

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA", "BC");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1");

// Key generator 초기화 및 키생성하기
keyGen.initialize(ecSpec, random);
KeyPair keyPair = keyGen.generateKeyPair();

// 공개키와 개인키 저장
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();


개인키로 데이터에 서명 추가하기.
1. 개인키를 사용하여 서명을 초기화 한다.
2. 데이터를 업로드 한다.
3. 최종 서명을 한다.

Signature dsa = Signature.getInstance("ECDSA", "BC");
dsa.initSign(privateKey); //주어진 개인키로 서명을 초기화 한다.
byte[] strByte = input.getBytes(); //서명 하고자 하는 데이터를 바이트로 변환 시킨다.
dsa.update(strByte); //서명 하고자 하는 데이터를 업데이트 한다.
byte[] realSig = dsa.sign(); //업데이트 된 데이터에 대한 최종 서명을 한다.


공개키로 서명된 데이터 검증하기.
1. 공개키를 가지고 서명을 초기화 한다.
2. 검증하려고 하는 데이터를 업데이트 한다.
3. 서명을 가지고 최종 되이터를 검증한다. 만약 검증이 통과되면 true, 검증이 통과되지 않으면 false를 반환한다.

Signature ecdsaVerify = Signature.getInstance("ECDSA", "BC");
ecdsaVerify.initVerify(publicKey); //주어진 공개키로 서명을 초기화.
ecdsaVerify.update(data.getBytes()); //검증하려고 하는 데이터를 업데이트 한다.
ecdsaVerify.verify(signature); //주어진 서명을 가지고 데이터 검증을 한다.(금증결과 리턴)


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함