💡니모닉(Mnemonic)
니모닉이란 결정적 지갑에서 난수를 12개의 영단어로 인코딩한 영단어 그룹으로, BIP39 에서 제안되었다. 기존의 시드 키는 숫자와 문자로 구성된 난수이기 때문에 사용자가 기억하기 어려웠지만, 니모닉 코드 단어의 경우 사용자가 기억하고 사용하기 쉬운 형태고 구성되어 있다는 장점이 있다.
시드 키: 8979644bfb6b6206792bdd6a071b3a00daebfb84ac5e3d81fa8c87a8012b04be060765762d4540ff10788959a84dec51667f34b0380e66be373d0ab2c62f8f94
니모닉: endless convince patrol calm apology scene client jungle fitness blind grass pause
블록체인에서 니모닉은 지갑을 복구하기 위한 일반적인 단어들로 조합을 뜻한다. 숫자의 나열처럼 직관적인 관계가 없어 외우기 어려운 정보에 다른 정보를 연결하여 외우기 쉽도록 하는 데 쓰인다.
✓ 니모닉 Wallet
니모닉 Wallet은 니모닉을 사용하여 비밀키 관리를 용이하게 해주는 지갑이다. 유저는 비밀 키를 잃어버릴 수 있다는 위험성 때문에, 비밀키를 복구(리커버리)할 때 니모닉을 사용하게 된다. 니모닉 wallet은 암호화폐 지갑의 핵심인 비밀키 관리를 용이하게 해주고 모든 비밀 키를 니모닉으로 관리하는 지갑이다. 사실 암호화폐 지갑에 화폐 자체가 들어있는 것은 아니다. 암호화폐 지갑은 키를 관리하는 키 매니지먼트 시스템이라고 할 수 있다. 예를 들어, 내 계정에 있는 이더리움을 내 것이라고 증명할 수 있는 비밀 키를 지갑이 관리한다고 보면 된다.
✓ 니모닉이 필요한 이유
디지털 서명을 먼저 떠올려보자. 은행의 공인인증서 역할을 하는 디지털 서명을 분산 장부에서 쉽게 표현하면 다른 이가 보지 못하고, 내 행위를 증명하는 것으로 사용된다. 이 디지털 서명에 사용되는 방식 중 비대칭 키 암호 방식에는 공개 키와 비밀 키가 있다. 이 두 키의 관계를 보면, 비밀 키로는 공개 키가 계산이 되는데, 공개 키로는 비밀키 계산이 불가능하게 된다. (이론적으로는 가능하지만 현실적으로는 불가능하다.) 다시 말해, 비밀 키만 가지고 있으면 공개 키는 여기저기 공개해도 상관 없는 것이다. 그렇기 때문에 공개 키는 주로 계좌번호처럼 쓰인다.
암호화폐 지갑은 비대칭 키 암호 방식을 사용한다. 그래서 공개 키와 비밀 키가 사용이 되는데 이 비밀 키를 사람이 쓰기 편하게 만들어진 것이 바로 니모닉이다.
니모닉은 순서대로 맞춰진 단어가 암호화된 보안 비밀번호 방식으로, 문자 배열을 초기대로 하지 못하면 그 누구도 지갑을 열 수 없다. 메타마스크 지갑 만들기에서도 사용했던 것 처럼, 영단어 그룹을 사용하여 고유의 지갑 문구를 생성하며, 이 지갑 문구가 니모닉인 것이다. 니모닉은 12개 또는 24개의 랜덤한 영어 단어로 이루어져 있다. 일반적인 단어로 표현되는 니모닉 코드는 암호화폐 지갑 사용자가 난해한 기술에 대한 이해 없이도 지갑을 편리하게 사용할 수 있도록 돕는다.
✓ 니모닉 코드와 시드 생성 9단계
니모닉 코드는 해시 함수를 재귀적으로 반복하는 키 스트레칭 과정을 거쳐 마스터 시드를 생성하고, 그 마스터 시드는 HD 지갑 주소 생성의 바탕이 된다. BIP-39에 정의된 니코닉 코드와 시드 생성 9단계는 다음과 같다.
1. 128 bit 또는 256 bit 길이의 난수를 생성한다.
2. 난수를 SHA-256 알고리즘으로 해싱하고, 해시값에서 (시드 키의 길이) / 32 만큼을 떼어낸다. 가령, 난수의 길이가 128 bit 라면, 해시값에서 128 / 32인 4bit를 앞에서부터 떼어내 체크섬으로 만든다.
(*체크섬(Checksum) : 어떤 일련의 데이터에 오류가 존재하는지 확인하기 위한 검사용 데이터)
3. 체크섬을 난수의 뒤에 붙인다.
4. 체크섬을 붙인 난수를 11 bit 단위로 잘라낸다.
5. 각 11bit의 단어를 사전에 정의된 단어로 치환한다.
6. 각 11bit의 순서를 유지하여 일련의 니모닉 코드를 만든다.
위의 과정을 통해 128 ~ 256 bit 길이의 엔트로피를 표현하는 니모닉 코드가 생성되었다. 이제 이 엔트로피와 키 스트레칭 함수 PBKDF2를 사용하여 더 긴(512bit) 시드를 파생시킨다. 키 스트레칭 함수에는 니모닉 코드와 솔트라는 두 가지 파라미터를 넣는다.
7. PBKDF2 키 스트레칭 함수의 첫 번째 인자는 6단계에서 생성 된 니모닉 코드이다.
8. PBKDF2 키 스트레칭 함수의 두 번째 인자는 솔트이다. 솔트는 문자열 상수 'mnemonic'과 선택적으로 사용자가 지정한 암호문을 연결하여 구성한다.
9. PBKDF2 는 최종 출력으로 512 비트 값을 만드는 HMAC-SHA512 알고리즘으로, 2048해시 라운드를 사용하여 니모닉과 솔트 파라미터를 확장하며, 이 결과로 나온 512 비트 값이 seed 이다.
✓ 솔팅(Salting)과 스트레칭
키 스트레칭을 이해하기 위해서는 솔팅을 먼저 이해해야 한다. 우리가 데이터베이스에 로그인 정보를 저장할 때, 비밀번호를 그대로 저장하면 데이터베이스를 해커가 해킹했을 때 비밀번호가 바로 노출된다. 따라서, 일반적으로 데이터베이스에 저장할 때는 해시함수를 사용해 암호화하여 저장한다.
그러나 해시 함수는 동일한 입력에 대해서는 항상 같은 값을 출력한다. 따라서, 다른 사용자와 비밀번호가 같은 경우, 해시값도 같을 것이다. 해커들은 자주 쓰이는 비밀번호와 비밀번호의 해시값을 가지고 있다가(이를 레인보우 테이블이라고 함), 레인보우 테이블에 있는 해시값과 데이터베이스에 저장된 해싱된 비밀번호를 비교하는 레인보우 공격을 할 수도 있다. 또한 해시 함수는 연산속도가 빠르기 때문에 무차별 대입 공격을 당할 수도 있다.
따라서, 해시값을 비교해도 원본 비밀번호를 알수 없도록 해야 한다. 솔팅은 원본 데이터에 임의의 문자열인 솔트를 추가하여 해싱하는 방식이다. 솔팅 방식으로 비밀번호를 암호화하여 데이터베이스에 보관하면, 해커가 솔트가 무엇인지 알지 못하는 이상 레인보우 테이블의 해시값과 데이터베이스의 해시값을 비교해도 원본 비밀번호를 알 수가 없다.
키 스트레칭은 이러한 솔팅 방식을 여러번 반복하는 것이다. 솔팅의 결괏값을 다시 솔트 함수의 입력값으로 하여 다시 솔팅을 하고, 이 과정을 반복한다. 사용자가 입력한 비밀번호는 예측하기 쉬운 경우가 많은데, 키 스트레칭은 이러한 예측을 더욱 어렵게 해준다.
'블록체인 > 블록체인이란?' 카테고리의 다른 글
머클트리란? 머클트리의 동박방식 (0) | 2022.06.22 |
---|---|
해시 함수는 무엇일까? 블록체인에서 해싱의 역할은 무엇일까? (0) | 2022.06.21 |
테스트넷을 사용하여 이더리움 입금 & 송금, 롭스텐 테스트넷 이용 (0) | 2022.06.21 |
메타마스크(Metamask)란? 크롬 브라우저에서 메타 마스크 사용하기 (0) | 2022.06.21 |
암호화 기술 - 전자서명 (0) | 2022.06.20 |
댓글