검수요청.png검수요청.png

SHA256

위키원
이동: 둘러보기, 검색

SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. SHA-256은 미국의 국립표준기술연구소(NIST; National Institute of Standards and Technology)에 의해 공표된 표준 해시 알고리즘인 SHA-2 계열 중 하나이며 블록체인에서 가장 많이 채택하여 사용하고 있다. 이름에 내포되어 있듯 만큼 경우의 수를 만들수 있다. 개인용 컴퓨터로 무차별 대입을 수행해 해시 충돌 사례를 찾으려고 할 때 많은 시간이 소요될 정도로 큰 숫자이므로 충돌로부터 비교적 안전하다고 평가된다.[1]

개요

SHA-256 해시 함수는 어떤 길이의 값을 입력하더라도 256비트의 고정된 결과값을 출력한다.[2] 일반적으로 입력값이 조금만 변동하여도 출력값이 완전히 달라지기 때문에 출력값을 토대로 입력값을 유추하는 것은 거의 불가능하다. 아주 작은 확률로 입력값이 다름에도 불구하고 출력값이 같은 경우가 발생하는데 이것을 충돌이라고 한다. 이러한 충돌의 발생 확률이 낮을수록 좋은 함수라고 평가된다.

등장 배경

1993년 미국 국가안보국(NSA)의 설계를 시작으로 SHA 함수 군에 속하는 최초의 함수는 공시적으로 SHA라고 불렸지만 나중에 설계된 함수들과 구별하기 위하여 SHA-0이라고 불리고 있다. 가장 처음으로 발표된 SHA-0을 기점으로 SHA-1SHA-2 계열이 있으며 가장 나중에 SHA-3 알고리즘이 공개되었다. 2년 후인 1995년 SHA-0의 변형인 SHA-1이 나왔으며, 이 후 변형을 통해 4종류가 추가로 공개되었다. 통칭 SHA-2로 불리는 변형 4종에는 SHA-224, SHA-256, SHA-384, SHA-512가 있다.[3]

특징

SHA-256은 현재 블록체인에서 가장 많이 채택하여 사용되고 있는 암호 방식이다. 출력 속도가 빠르다는 장점을 갖고 있다. 또한 단방향성의 성질을 띄고 있는 암호화 방법으로 복호화가 불가능하다. SHA-384, 512, SHA-3보다는 유효 보호 수준이 낮을 지는 모르지만, 현재까지 안정성 문제에서도 큰 단점이 발견되지 않았고, 속도가 빠르기 때문에 인증서, 블록체인 등 많이 사용되고있으며, SHA-2라고 하면 SHA-256이라고 말할 정도로 상용화가 잘 되어있다.[4]

  • 단방향 알고리즘
해시함수의 개념
단방향(One-Way) 암호화는 평문을 암호화했을 때 다시 평문으로 복호화할 수 없는 암호화이다. 대표적으로 많이 사용되는 알고리즘이 SHA-256 암호화 알고리즘이다. SHA-256은 임의의 길이 메시지를 256 비트(bits)의 축약된 메시지로 만들어내는 해시 알고리즘이다. 데이터의 수정과 변경을 검출 할 수 있으나 인증은 불가능하다. 인증에 사용하기 위해 메시지 인증 코드와 디지털 서명이 요구된다.[5]
  • 안정성
SHA-1은 구글 클라우드 서버를 기반으로 수행된 연구 사례에서 약 900경의 해시 연산을 통해 충돌이 발견된 경험이 있다. 이것을 바탕으로 근본적인 차이가 많이 없는 SHA-256의 안정성이 얼마나 높고 유지될 수 있다고 언급하기에는 어려움이 있다. 하지만 실질적으로 해시 취약점을 대상으로 하는 양자 컴퓨터가 출시되지 않는 이상 최소 근 10년가량은 안전하다는 판단을 할 수 있다. SHA-256의해 제공되는 해시 알고리즘은 일정한 컴퓨터 연산 속도의 향상을 염두에 둔 가정에도 산술적으로 매우 강력하다는 결론에 도달하게 된다. 혹여 미래에 SHA-256의 취약점이 발견되더라도 블록체인에는 하드포크(Hard Fork)와 같은 알고리즘 개선 기법들이 존재하기 때문에 취약점을 제거할 수 있다.[1]
  • 특성
해시값의 크기 256
내부 상태 크기 256
블록 크기 512
길이 한계 64
워드 크기 32
과정 수 64
사용되는 연산 +, and, or, xor, shr, rotr
충돌 여부 발견되지 않음
[3]
  • 단점
SHA-2에 대한 공격은 2008년부터 발생하기 시작했고, SHA-1의 경우와 마찬가지로 SHA-2에 대한 공격 역시 점점 더 박차를 가하며 SHA-2마저 약화하고 있다. 일부 공격은 SHA-2의 유효 보호 수준을 237비트까지 낮췄고 2016년에 발표된 일부 최근 공격을 보면 SHA-2 공격은 이미 "실용" 단계에 있다고 할 수 있다. 따라서 추후 방법을 찾아야 한다는 것이다.[6]

예제

#include "KISA_SHA256.h"
 
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
 
int main(int argc, char** argv)
{
 
    //변수 초기화.
    FILE *fp = NULL;
    unsigned char buffer[2048] = { 0, };
    unsigned char result[32] = { 0, };
    int read = 0;
    int loop_number = 0;
 
    //SHA256 변수 초기화.
    SHA256_INFO sha256_info;
 
    SHA256_Init(&sha256_info);
 
    //파일 읽기.
    //fp = fopen("Test.txt", "rb"); Visual Studio 옛버전을 사용할 경우, 이 구문 사용. Visual Studio에서 안전성 문제로 인한 함수 개선
    fopen_s(&fp, "Text.txt", "rb");
 
    if (fp == NULL)
    {
        printf("Error : File not find.\n");
        system("pause");
        return -1;
    }
 
    while ((read = fread(buffer, 2048, 1, fp)) != 0)
    {
        SHA256_Process(&sha256_info, buffer, read);
    }
 
    SHA256_Close(&sha256_info, result);
 
    for (loop_number = 0; loop_number < 32; loop_number++)
    {
        printf("%02x", result[loop_number]);
    }
 
    system("pause");
    return 0;  
}[7]
package com.tistory.needjarvis;
 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class main {
    public static void main(String[] args) throws Exception {
        System.out.println(sha256("needjarvis"));        
    }
  
    /**
     * SHA-256으로 해싱하는 메소드
     * 
     * @param bytes
     * @return
     * @throws NoSuchAlgorithmException 
     */
    public static String sha256(String msg) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(msg.getBytes());
        
        return bytesToHex1(md.digest());
    }
   
    /**
     * 바이트를 헥스값으로 변환한다.
     * 
     * @param bytes
     * @return
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder builder = new StringBuilder();
        for (byte b: bytes) {
          builder.append(String.format("%02x", b));
        }
        return builder.toString();
    }
}[8]
SHA-256 해시값을 구하는 코드
import hashlib
 
string = raw_input()
sha = hashlib.new('sha256')
 
sha.update(string)
print sha.hexdigest()

[9]

각주

  1. 1.0 1.1 우재, 〈volumeNo=15843055&memberNo=3270008 SHA256 이란?〉, 《네이버 포스트》, 2018-05-28
  2. 토큰포스트, 〈SHA-256 해시 함수〉, 《토큰포스트》
  3. 3.0 3.1 나눔팁, 〈SHA256 이란? 무엇인가!〉, 《블로그》, 2018-08-20
  4. Lyudmil Latinov, "MD5, SHA-1, SHA-256 and SHA-512 speed performance", Automation Rhapsody, 2018-05-03
  5. chodahi, 〈단방향 알고리즘(SHA256) 과 양방향 알고리즘(AES256)〉, 《네이버 블로그》, 2018-11-30
  6. *Roger A. Grimes|CSO, 〈왜 SHA-3을 사용하지 않는가〉, 《ITWORLD》, 2018-02-23
  7. 방사성 폐기장, 〈(Java) SHA256-KISA 라이브러리 사용하기〉, 《티스토리》, 2017-01-15
  8. 자비스가 필요해, 〈(Java) SHA-256 해싱(Hashing) 알고리즘 사용법〉, 《티스토리》, 2018-08-07
  9. Crocus, 〈파이썬 sha, md5 해시값 구하는 방법〉, 《티스토리》, 2017-08-24

참고자료

같이 보기


  검수요청.png검수요청.png 이 SHA256 문서는 암호 알고리즘에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.