Ethereum Wallet 및 Keystore 파일 생성 및 암호화 원리

지갑이 생성되는 과정, 그리고 Keystore 파일


지갑을 생성하게 되면, 지갑의 비밀번호(pw), private key(pk), 그리고 지갑을 백업할 수 있는 keystore 파일을 받게된다.

지갑을 import 하는 등 지갑에 대한 본인 인증을 할 때는 2가지 방법 중 하나로 한다.

  • pk를 이용하여 지갑에 대한 본인 인증을 한다.

    • 문제는 pk(64 hex 문자열)를 기억하기 쉽지 않고, 관리 이슈도 있다.
  • Keystore 파일과 pw를 이용하여 지갑에 대한 본인 인증을 한다.

    • Keystore 파일은 pk의 암호화된 버전이다.
    • pk를 pw와 암호화 알고리즘을 이용해 암호화하여 keystore 파일로 만드는 것이다.

이 방법이 더 좋은 2가지 이유가 있다.

  • 안전성:
    • 만약 사용자가 pk만 사용할 경우, 해커는 그 pk만 알아내면 사용자의 지갑은 해킹당하게 된다.
    • 그런데, keystore 파일을 사용하면 해커는 추가로 pw까지 알아야 하므로 더 안전하다.
  • 사용성:
    • 복잡한 pk 대신 사용자들에게 익숙한 pw와 파일로 쉽게 지갑을 사용할 수 있다.


keystore 파일 데이터 구조


keystore 파일의 데이터 구조는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"version": 3,
"id": "4c07993f-ded2-405a-b83d-3b627eebe5cd",
"address": "e449efddf8c9b174bbd40a0e0e1902d6eee72068",
"Crypto": {
"cipher": "aes-128-ctr",
"cipherparams": {
"iv": "7d416faf14c88bb124486f6cd851fa88"
},
"ciphertext":"e99f6d0e37f33124ee3020fad01363d9d7500efce
913aede8a8119229b7a5f2e",
"kdf": "scrypt",
"kdfparams": {
"dklen": 32,
"salt": "c47f395c9031233453168f01b5a9999a06ec97c829
a395ecd16e1ad37102ec7f",
"n": 8192,
"r": 8,
"p": 1
},
"mac": "82078437ee94331c69125eef4001ff4b78b481e909a6
2a9ac25aa916237b70be"
}
}

위 구조 중, Crypto 객체가 keystore 파일 암호화에 대한 정보이다.


pw를 이용해 pk를 암호화/복호화하여 keystore 파일을 생성하는 원리


pw 암호화


pw 암호화 과정
출처: pw 암호화 과정

Pk를 암호화하기 위해 pw를 사용하는데, 이 pw를 직접 암호화키로 사용하지 않고, 이 pw를 암호화하여 암호화한 값을 암호화 키로 사용해서 pk를 암호화한다. 이때, pw를 암호화하는 알고리즘은 Scrypt인데, 비밀번호는 특성상 복호화할 필요가 없기 때문에 단반향 알고리즘 중 하나인 Scrypt를 사용한다.

Keystore 파일에 들어갈 때는, kdf: ‘Scrypt’ 이런식으로 들어가는데, kdf는 암호화 알고리즘 이름을 말하고, Scrypt 알고리즘을 사용한다는 뜻이다.

참고로, kdfparams 들어가는 것 중, n은 CPU/memory 비용을 말한다. 즉, 값이 클수록 암호화 파워가 증가한다.


pk 암호화


pk 암호화 과정
출처: pk 암호화 과정

Pk를 암호화하기 위해서는 좀 전에 pw를 암호화한 값을 암호화키로 사용하고, AES 알고리즘을 사용해서 pk를 암호화한다. pk는 복호화할 필요가 있으므로(pk는 거래를 할 때, 사용되므로) 양방향 알고리즘인 AES를 사용한다.

Keystore 파일에 들어갈 때는, cipher: ‘aes-128-ctr’ 이런식으로 들어가는데, cipher는 암호화 알고리즘의 이름이고 aes-128-ctr 알고리즘을 사용한다는 뜻이다.


Mac


Mac은 keystone 파일을 사용할 때, 사용자가 입력한 pw의 일치여부를 확인하고, pk를 복호화해도 되는지 확인 용도로 사용한다.

*참고로, 이더리움 wallet 만들어지는 순서

  • Pk로 public key 생성
  • Public key로 address 생성