중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

오렌지보드-SHA 암호화 알고리즘

2018-05-02 15:38:00

사물인터넷이 급속하게 발달함에 따라 해킹에 대한 여러 위험요소도 증가하게 되었습니다. 그렇기 때문에 IoT 보안은 사물인터넷 시대에서 매우 중요한 이슈 중에 하나가 되었습니다.

 

 

다양한 보안 문제를 해결하기 위해 다양한 보안 기술이 있는데 그 중에 네트워크 통신 시 사용되는 암호화에 대해 알아보겠습니다.

 

일반 네트워크 통신 시에 비밀번호나 고객 정보와 같이 중요한 데이터를 해킹 당할 경우 큰 손해가 되기 때문에 암호화를 사용해서 통신을 합니다.

 

암호화는 허가된 사용자 이 외에 다른사람은 읽을 수 없도록 정보를 부호화 하는 것을 말하고. 데이터를 부호화 하는 알고리즘을 암호화 알고리즘이라고 합니다.

 

 

이 컨텐츠에서는 오렌지 보드에서 암호화 알고리즘 중 하나인 SHA(Secure Hash Standard)를 이용하여 일반 데이터를 부호화 해보겠습니다.

(* 정확히는 SHA-256 함수를 이용해보겠습니다.)

 

SHA는 1993년 미국 NSA가 제작하고 NIST에서 표준으로 제작한 해시 암호 알고리즘입니다. 

 

SHA의 경우 복호화가 불가능하기 때문에 고객정보나 비밀번호 암호화 등에 자주 사용되는 암호화 알고리즘입니다. 

 

 

 

필요 부품

 

No 부품명 수량 상세 설명
1 오렌지 보드 1 아두이노 UNO 호환 보드

 

오렌지 보드

 

이 컨텐츠에서는 따로 회로 구성없이 오렌지 보드만 연결하시고 사용하시면 됩니다.

 

 

 

소프트웨어 코딩

오렌지보드에서 SHA 암호화를 적용하기 위해서는 아래 라이브러리를 추가해야 합니다.

(아래 링크에서 ZIP파일을 받으신 후 압축 파일 안에 sha 폴더만 라이브러리로 추가해주시면 됩니다.)

 

Cryptosuite2 라이브러리 : https://github.com/daknuett/cryptosuite2

 

라이브러리추가 방법 : https://kocoafab.cc/tutorial/view/40

 
 
//외부라이브러리 사용
#include <sha256.h> // SHA256 알고리즘 사용

char USERID[100];
String sha_result = "";

void setup() {
  Serial.begin(9600);
  Serial.println(" << SHA256 Start >> ");
  Serial.println();
}

void loop() {
  if (Serial.available()) {
    Serial.readBytes(USERID, 100);  // 시리얼 모니터에서 입력된 데이터 저장

    uint8_t *hash;
    Sha256.init();
    Sha256.print(USERID); // 암호화 할 입력값 넣기
    hash = Sha256.result(); // 암호화 실행

    // 암호화 된 결과값을 HEX값으로 출력
    // 한자리일 경우 앞에 0 추가
    for (int i = 0; i < 32; i++) {
      if (hash[i] < 16) {
        Serial.print('0');
      }
      Serial.print(hash[i], HEX);
    }

    Serial.println();
    Serial.println();
    Serial.println(" << SHA256 END >> ");
    Serial.println();

    memset(USERID, NULL, sizeof(USERID));  // USERID 초기화
    sha_result = "";  // sha_result 초기화
  }
}

 

 

사용 방법

    Sha256.print(USERID); // SHA256알고리즘에 KEY값 넣기
    hash = Sha256.result(); // 암호화 실행

Sha256.print에 USERID부분에 입력값을 넣어주고, Sha256.result() 함수를 이용해서 결과값을 받습니다.

 

    // 암호화 된 결과값을 HEX값으로 출력
    // 한자리일 경우 앞에 0 추가
    for (int i = 0; i < 32; i++) {
      if (hash[i] < 16) {
        Serial.print('0');
      }
      Serial.print(hash[i], HEX);
    }

 

Sha256.result() 함수의 경우 return 타입이 uint_8 * 이기 때문에 결과값을 출력하기 위해 Serial.print 에서 HEX값으로 출력했고,

 

이렇게 출력할 경우 두자리에서 앞자리가 0이면 출력을 안하기 때문에 앞자리가 0일 경우는 강제로 0을 출력하도록 하였습니다.

(16진수로 출력하기 때문에 두자리가 나올려면 데이터가 16이상이 되어야 합니다. 그렇기 때문에 값이 16 미만이면 앞에 0을 출력하도록 하였습니다. 0x10 = 16)

 

결과 확인

임의의 값을 입력하면 결과값이 나오게 됩니다. (밑에 결과는 KocoaFAB, Kocoa, KocoaFAB 을 순서대로 입력하였습니다.)

 

출력 2줄중에 위에 값이 입력값(KocoaFAB), 아래 줄이 결과값(8823.....) 입니다.

 

 

SHA는 입력 값이 약간만 바뀌어도 값이 천차만별로 바뀌기 때문에 결과물에서 유사성을 찾아보기 힘듭니다. 

 

그대신 같은 입력값을 넣으면 결과 값이 같이 나오기 때문에 이를 이용해서 로그인 시 입력한 개인 정보나 비밀번호를 암호화하여 값을 비교합니다.

 

 

단순하게 오렌지보드를 이용한 프로젝트를 사용시에는 별로 크게 사용할 필요가 없지만 나중에 와이파이나 블루투스와 같이 통신 기능을 사용한 프로젝트를 하실 때 보안 관련하여 위 같은 방법을 사용해 보시면 좋을 것 같습니다.

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

SHA, Secure Hash Algorithm, 아두이노, 오렌지보드