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

SHA256

위키원
wjddn843 (토론 | 기여)님의 2019년 8월 2일 (금) 14:46 판
이동: 둘러보기, 검색

SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. SHA-256은 미국의 국립표준기술연구소(NIST; National Institute of Standards and Technology)에 의해 공표된 표준 해시 알고리즘인 SHA-2 계열 중 하나이며 블록체인에서 가장 많이 채택하여 사용하고 있다. 이름에 내포되어 있듯 2의 256제곱만큼 경우의 수를 만들수 있다. 개인용 컴퓨터로 무차별 대입을 수행해 해시 충돌 사례를 찾으려고 할 때 많은 시간이 소요될 정도로 큰 숫자이므로 충돌로부터 비교적 안전하다고 평가된다.[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]
  • 파이썬(Python)
해시값
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 문서는 암호 알고리즘에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.