아두이노프로세싱 프로그래밍

아두이노 EEPROM 스팀잇 비밀번호 보관 프로젝트

coding art 2018. 5. 13. 21:07
728x90
___________________________________________________________________________


스팀잇에서 항상 골칫거리가 비밀번호를 어떻게 보관하느냐는 문제일 것이다.
출력해서 오프라인 보관이 원칙이며 아울러 자신의 컴퓨터 주변에 두어 필요하면 언제든지 사용할 수 있도록 준비가 되어 있어야 할 것이다.

즉 이러한 오프라인 보관 원칙을 지키면서도 컴퓨터와 직접 연결되어 있으면서도 해킹에 대해서 안전한 수단은 없을까?


여기 아두이노 EEPROM 메모리 비밀번호 저장법을 소개하기로 하자.

우선 아두이노에서 사용되고 있는 메모리 종류와 구조 및 규격(specifications)을 살펴보자.



플레시 메모리는 업로딩된 아두이노 코드가 저장된다. 즉 실행하기 위한 코드를 저장하는 메모리 공간이다. 우리가 흔하게 사용하는 USB 메모리 타입으로보면 된다.

SRAM 은 아두이노 Atmel 칩의 CPU 내부에서 주로 고속 연산 작업을 지원하기 위한 레지스터용 메모리이다. 여타의 컴퓨터에서도 속도가 다소 늦은 DRAM에 비해서 가격이야 비싸겠지만 속도가 훨씬 빠른 특수한 메모리 SRAM을 사용한다.

한편 EEPROM(Electrically Erasable Programmable Read/Write Memory)은 말 그대로 전기적으로 쓰고 지울 수 있는 메모리이다. 즉 전기적으로 처리하기 위해서 특별한 별도의 명령어들이 제공되고 있다.

아두이노에서도 1KB (1024 Byte)가 제공된다. 이 메모리에는 hard-code에 해당하는 즉 코딩이 곤란한 정보들을 저장하게 된다. 예를 들면 주로 자동차 엔진의 튜닝 파라메타라든지 또는 드론의 setup 파라메타들을 저장하기도 한다. 자동차 엔진의 경우 전자제어 시스템이 고장 났을 경우 고장 코드를 저장해 둔다. 수리 시에 진단 스캐너를 연결해 보면 고장 코드를 읽어낼 수 가 있으며 수리 완료 시에 지울 수 있다.



일반적으로 해킹하면 남의 컴퓨터에 숨어들어와 모든 저장장치에 들어 있는 데이터를 모조리 가져가는 행위이다. 플레시 메모리를 사용하는 USB 가 연결되어 있다면 렉토리 기능으로 파일들을 다 볼 수 있으며 가져갈 수 있을 것이다. 하지만 연결된 아두이노 EEPROM 에 저장된 데이터는 디렉토리 기능으로 볼 수도 가져갈 수 도 없으며 오직 전용 읽기 코드를 실행해야만 시리얼 모니터에서 가까스로 볼 수 있다. 거기다가 마우스 오른쪽 버튼 사용이 안되므로 시리얼모니터에 뭐가 출력되면 종이에다 펜으로 써야하는데, 이런 상황이라면 해킹이란 직업도 못해 먹을 4D 업종이죠?

아울러 스팀잇 비밀 번호도 비슷한 사례가 될 수 있다. 즉 자신의 스팀잇 시스템 로그인이라든지 서브 비밀번호 생성이라든지 극히 중요한 역할을 담당하는데 문제는 컴퓨터에 넣어서 보관하다가 컴퓨터 통째로 해킹 당하게 되면 큰 낭패가 될 수 있다. 이는 USB 에 데이터를 저장하는 경우도 마찬가지이다.

어쨌든 컴퓨터에서 해킹의 염려 없이 자신의 비밀번호를 액세스할 수 있으면 좋은데  아두이노 EEPROM 메모리가 적격인 듯하다.

EEPROM 메모리 사용 시 중요 명령어는 3종류이다.
첫째 메모리를 지우는 명령이다. eeprom.clear(address) 이다. 메모리 address 는 우노의 경우 메모리 개수가 1024개 이므로 당연히 0∼1023 까지이므로 충분하다.

둘째 메모리에 써넣는 명령이다. eeprom.write(address,information) 이다. information에는 당연히 비밀번호 글자로서 문자(char)로 정의 하면 된다. 우리가 스팀잇에서 사용하는 비밀번호는 영문자와 알파베 숫자와의 조합으로 되어 있다. 이들 문자는 한편으로 ASCII 문자로서 0∼127까지의 숫자 중에 포함된다.

첫째 명령과 둘째 명령을 함께 사용하여 비밀번호를 아두이노 우노에 써넣고 저장해 두자.

셋째로 eeprom 메모리를 읽어오는 명령 즉 eeprom.read(address, information) 이다. 한 글자씩 information을 읽어서 배열로 선언해둔 ASCIIvalue 에 저장하고 이 ASCIIvalue 값을 시리얼모니터에 Serial.write(ASCIIvalue[data]) 명령으로 죽 출력한다. 시리얼 모니터에 출력된 정보는 마우스 오른쪽 버튼에 의해서 복사가 안되므로 할 수 없이 직접 보고 한글자 한글자 입력해야 한다.

보안을 위해서는 한번 작업을 통해 2∼3대의 아두이노에 스팀잇 비빌번호를 출력해 적어둔다. 아울러 비밀번호를 출력한 아두이노 코드는 당연히 삭제해야 한다. 언제든지 필요하면 스팀잇 @codingart에서 복사해서 수정하면 된다. 아울러 비빌번호를 읽어들이는 코드의 파일명은 본인만 알 수 있도록 적절히 위장해두기 바란다. 이 파일도 잃어버린 경우 @codingart에서 복사해 가서 수정하면 된다. 적어도 각 개인의 비밀번호 자랏수가 다를 수 있으므로 자릿수는 기억해 두도록 하자.

아래의 출력 결과는 아두이노에서 읽어온 비빌번호 출력 결과이다. 입력한 값과 일치함을 확인하기 바란다.



스팀잇 지갑에 대단히 큰 금액을 보관하고 있다면 eeprom 에 써넣기 전에 한 단계 encription 즉 암호화를 하는게 좋을 듯하다. 물론 다시 읽어서 암호를 푸는 방법도 스스로 고안해야 할 것이다.

//ASCII_eeprom_writing_01

#include <EEPROM.h>
char pdw[54] ={"P5Xq7vNb83PDJySwA9NEWnEN4tdZr5gQvXXBUwUenzSSKHFhPdpQlU"};//연습용 예제 비밀번호
int lngth = 53;// 비밀번호 자릿수 - 1
byte data;
void setup()  {
  for(data = 0; data <= lngth; data++)  {
    EEPROM.write(data,0);// Clear memory
    EEPROM.write(data, pdw[data]);// Save data at memory
  }
}
void loop()  {
}//끝


//ASCII_eeprom_reading_01

#include <EEPROM.h>
byte ASCIIvalue[54];
byte data;
int lngth = 53;

void setup()  {
 Serial.begin(9600);
  for(data = 0; data <= lngth; data++)  {
    ASCIIvalue[data] = EEPROM.read(data);
    Serial.write(ASCIIvalue[data]);
  }
}
void loop()  {
}//끝