지갑이 생성되는 과정, 그리고 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 | { |
위 구조 중, Crypto 객체가 keystore 파일 암호화에 대한 정보이다.
pw를 이용해 pk를 암호화/복호화하여 keystore 파일을 생성하는 원리
pw 암호화
출처: pw 암호화 과정
Pk를 암호화하기 위해 pw를 사용하는데, 이 pw를 직접 암호화키로 사용하지 않고, 이 pw를 암호화하여 암호화한 값을 암호화 키로 사용해서 pk를 암호화한다. 이때, pw를 암호화하는 알고리즘은 Scrypt인데, 비밀번호는 특성상 복호화할 필요가 없기 때문에 단반향 알고리즘 중 하나인 Scrypt를 사용한다.
Keystore 파일에 들어갈 때는, kdf: ‘Scrypt’ 이런식으로 들어가는데, kdf는 암호화 알고리즘 이름을 말하고, Scrypt 알고리즘을 사용한다는 뜻이다.
참고로, kdfparams 들어가는 것 중, n은 CPU/memory 비용을 말한다. 즉, 값이 클수록 암호화 파워가 증가한다.
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 생성