흔한 개발자의 일상

eos 노드의 wallet이 안전한 이유 본문

개발자 블록체인/EOS

eos 노드의 wallet이 안전한 이유

memory_captain 2020. 2. 13. 17:45

 

eos는 다른 블록체인과 다르게 키를 파일에 저장하고 필요할때 마다 데이터를 읽어 사용한다.

 

그렇다면 누구나 이 데이터를 읽을 수만 있다면 계정의 모든 정보를 훔칠 수 있는것 아닐까??

 

eos의 wallet에서 키를 저장 하는 방식은 간단하게 요약하자면 아래 항목과 같다.

 

  1. cleos 프로그램으로 개인키를 생성한다.
  2. 생성된 개인키를 wallet 에 저장한다.
  3. 프로그램은 자동적으로 AES 방식으로 키를 저장하게 되어 오직 개인키로만 지갑안에 저장된 키를 알수 있다.

 

흔히 AES 암호화 방식은 일종의 토글과도 같은데

 

0b11100 ^ 0b11 = 0b11111
// 원상 복귀
0b11111 ^ 0b11 = 0b11100

위와 같이 비트연산을 통해 원하는 데이터를 복호화 한다.

 

실제로 AES를 사용하는지 소스 코드를 통해 보자.

// wallet_plugin/wallet.cpp
... Line 67
void encrypt_keys()
   {
      if( !is_locked() )
      {
         plain_keys data;
         data.keys = _keys;
         data.checksum = _checksum;
         auto plain_txt = fc::raw::pack(data);
         _wallet.cipher_keys = fc::aes_encrypt( data.checksum, plain_txt );
      }
   }

fc::aes_encrypt 함수를 타고가면 OpenSSL에서 제공하는 함수를 사용해 AES로 암호화 하는 것을 아래와 같이 알 수 있다.

std::vector<char> aes_encrypt( const fc::sha512& key, const std::vector<char>& plain_text  )
{
    std::vector<char> cipher_text(plain_text.size()+16);
    auto cipher_len = aes_encrypt( (unsigned char*)plain_text.data(), (int)plain_text.size(),  
                                   (unsigned char*)&key, ((unsigned char*)&key)+32,
                                   (unsigned char*)cipher_text.data() );
    FC_ASSERT( cipher_len <= cipher_text.size() );
    cipher_text.resize(cipher_len);
    return cipher_text;

}

 

aes_encrypt 함수가 OpenSSL 에서 제공되는 함수이며 이를 사용하고 있음을 아래 링크에서 알 수 있다.

 

https://wiki.openssl.org/index.php/AES