흔한 개발자의 일상
eos 노드의 wallet이 안전한 이유 본문
eos는 다른 블록체인과 다르게 키를 파일에 저장하고 필요할때 마다 데이터를 읽어 사용한다.
그렇다면 누구나 이 데이터를 읽을 수만 있다면 계정의 모든 정보를 훔칠 수 있는것 아닐까??
eos의 wallet에서 키를 저장 하는 방식은 간단하게 요약하자면 아래 항목과 같다.
- cleos 프로그램으로 개인키를 생성한다.
- 생성된 개인키를 wallet 에 저장한다.
- 프로그램은 자동적으로 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 에서 제공되는 함수이며 이를 사용하고 있음을 아래 링크에서 알 수 있다.