SHA256 편집하기

이동: 둘러보기, 검색

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 아이디(ID)으로 기록되고, 다른 장점도 있습니다.

편집을 되돌릴 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 당신의 편집
1번째 줄: 1번째 줄:
'''[[SHA-256]]'''SHA(Secure Hash Algorithm)<!--sha256, sha-256, 샤256, 샤-256, Secure Hash Algorithm 256, SecureHashAlgorithm256--> [[알고리즘]]의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. SHA-256은 미국의 [[국립표준기술연구소]](NIST; National Institute of Standards and Technology)에 의해 공표된 표준 해시 알고리즘인 [[SHA-2]] 계열 중 하나이며 블록체인에서 가장 많이 채택하여 사용하고 있다. 이름에 내포되어 있듯 <math>2^{256}</math>만큼 경우의 수를 만들수 있다. 개인용 컴퓨터로 무차별 대입을 수행해 해시 충돌 사례를 찾으려고 할 때 많은 시간이 소요될 정도로 큰 숫자이므로 충돌로부터 비교적 안전하다고 평가된다.<ref name="우재">우재, 〈[https://m.post.naver.com/viewer/postView.nhn volumeNo=15843055&memberNo=3270008 SHA256 이란?]〉, 《네이버 포스트》, 2018-05-28</ref>  
+
'''[[SHA-256]]'''SHA(Secure Hash Algorithm) [[알고리즘]]의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. SHA-256은 미국의 [[국립표준기술연구소]](NIST; National Institute of Standards and Technology)에 의해 공표된 표준 해시 알고리즘인 [[SHA-2]] 계열 중 하나이며 블록체인에서 가장 많이 채택하여 사용하고 있다. 이름에 내포되어 있듯 2의 256제곱만큼 경우의 수를 만들수 있다. 개인용 컴퓨터로 무차별 대입을 수행해 해시 충돌 사례를 찾으려고 할 때 많은 시간이 소요될 정도로 큰 숫자이므로 충돌로부터 비교적 안전하다고 보여진다.<ref name="우재">우재, 〈[https://m.post.naver.com/viewer/postView.nhn volumeNo=15843055&memberNo=3270008 SHA256 이란?]〉, 《네이버 포스트》, 2018-05-28</ref>  
  
 
== 개요 ==
 
== 개요 ==
SHA-256 해시 함수는 어떤 길이의 값을 입력하더라도 256비트의 고정된 결과값을 출력한다.<ref>토큰포스트, 〈[https://tokenpost.kr/terms/14091 SHA-256 해시 함수]〉, 《토큰포스트》
+
SHA-256 해시 함수는 어떤 길이의 값을 입력하더라도 256비트의 고정된 결과 값을 출력한다.<ref>토큰포스트, 〈[https://tokenpost.kr/terms/14091 SHA-256 해시 함수]〉, 《토큰포스트》
</ref> 일반적으로 입력값이 조금만 변동하여도 출력값이 완전히 달라지기 때문에 출력값을 토대로 입력값을 유추하는 것은 거의 불가능하다. 아주 작은 확률로 입력값이 다름에도 불구하고 출력값이 같은 경우가 발생하는데 이것을 충돌이라고 한다. 이러한 충돌의 발생 확률이 낮을수록 좋은 함수라고 평가된다.  
+
</ref> 일반적으로 입력 값이 조금만 변동하여도 출력 값이 완전히 달라지기 때문에 출력 값을 토대로 입력 값을 유추하는 것은 거의 불가능하다. 아주 작은 확률로 입력 값이 다름에도 불구하고 출력 값이 같은 경우가 발생하는데 이것을 충돌이라고 한다. 이러한 충돌의 발생 확률이 작을수록 좋은 함수라고 평가된다.  
  
 
== 등장 배경 ==
 
== 등장 배경 ==
1993년 미국 국가안보국(NSA)의 설계를 시작으로 SHA 함수 군에 속하는 최초의 함수는 공시적으로 SHA라고 불렸지만 나중에 설계된 함수들과 구별하기 위하여 [[SHA-0]]이라고 불리고 있다. 가장 처음으로 발표된 SHA-0을 기점으로 [[SHA-1]]과 [[SHA-2]] 계열이 있으며 가장 나중에 [[SHA-3]] [[알고리즘]]이 공개되었다. 2년 후인 1995년 SHA-0의 변형인 SHA-1이 나왔으며, 이 후 변형을 통해 4종류가 추가로 공개되었다. 통칭 SHA-2로 불리는 변형 4종에는 [[SHA-224]], SHA-256, [[SHA-384]], [[SHA-512]]가 있다.<ref name="나눔팁">나눔팁, 〈[https://www.nanumtip.com/qa/221123/ SHA256 이란? 무엇인가!]〉, 《블로그》, 2018-08-20</ref>
+
1993년 '''미국 국가안보국'''(NSA)의 설계를 시작으로 SHA 함수군에 속하는 최초의 함수는 공시적으로 '''SHA'''라고 불렸지만 나중에 설계된 함수들과 구별하기 위하여 '''[[SHA-0]]'''이라고 불리고 있다. 가장 처음으로 발표된 SHA-0을 기점으로 '''[[SHA-1]]''''''[[SHA-2]]''' 계열이 있으며 가장 나중에 '''[[SHA-3]]''' [[알고리즘]]이 공개되었다. 2년 후인 1995년 SHA-0의 변형인 SHA-1이 나왔으며, 이 후 변형을 통해 4종류가 추가적으로 공개되었다. 통칭 SHA-2로 불리는 변형 4종에는 SHA-224,SHA-256,SHA-384,SHA-512가 있다.<ref>나눔팁, 〈[https://www.nanumtip.com/qa/221123/ SHA256 이란? 무엇인가!]〉, 《블로그》, 2018-08-20</ref>  
  
 
== 특징 ==
 
== 특징 ==
SHA-256은 현재 [[블록체인]]에서 가장 많이 채택하여 사용되고 있는 [[암호]] 방식이다. 출력 속도가 빠르다는 장점을 갖고 있다. 또한 단방향성의 성질을 띄고 있는 [[암호화]] 방법으로 [[복호화]]가 불가능하다. SHA-384, 512, [[SHA-3]]보다는 유효 보호 수준이 낮을 지는 모르지만, 현재까지 안정성 문제에서도 큰 단점이 발견되지 않았고, 속도가 빠르기 때문에 [[인증서]], [[블록체인]] 등 많이 사용되고있으며, [[SHA-2]]라고 하면 SHA-256이라고 말할 정도로 상용화가 잘 되어있다.<ref name="SHA-2 속도">Lyudmil Latinov, "[https://automationrhapsody.com/md5-sha-1-sha-256-sha-512-speed-performance/ MD5, SHA-1, SHA-256 and SHA-512 speed performance]", ''Automation Rhapsody'', 2018-05-03</ref>
+
=== 단방향 알고리즘 ===
 +
단방향(One-Way) 암호화는 평문을 암호화 했을 때 다시 평문으로 [[복호화]] 할 수 없는 암호화이다. 대표적으로 많이 사용되는 [[알고리즘]]이 SHA-256 암호화 알고리즘이다. SHA-256은 임의의 길이 메시지를 256 비트(bits)의 축약된 메시지로 만들어내는 [[해시]] 알고리즘이다. [[데이터]]의 수정과 변경을 검출 할 수 있으나 인증은 불가능한다. 인증에 사용하기 위해 메시지 인증코드와 디지털 서명이 요구된다.<ref>chodahi, [https://blog.naver.com/chodahi/221409516745 단방향 알고리즘(SHA256) 과 양방향 알고리즘(AES256)], 《네이버 블로그》, 2018-11-30</ref>
  
* 단방향 알고리즘
+
=== 안정성 ===
[[파일:해시함수의_개념.PNG |썸네일|450픽셀|'''해시함수'''의 개념]]
+
'''[[SHA-1]]'''은 구글 [[클라우드]] 서버를 기반으로 수행된 연구 사례에서 약 900경의 해시 연산을 통해 충돌이 발견된 경험을 가지고 있다. 이것을 바탕으로 근본적인 차이가 많이 없는 SHA-256의 안정성이 얼마나 높고 유지될 수 있다고 언급하기에는 어려움이 있다. 하지만 실질적으로 해시 취약점을 대상으로 하는 양자 컴퓨터가 출시되지 않는 이상 최소 근 10년 가량은 안전하다는 판단을 할 수 있다. SHA-256의해 제공되는 [[해시]] [알고리즘]]은 일정한 컴퓨터 연산 속도의 향상을 염두한 가정에도 산술적으로 매우 강력하다는 결론에 도달하게 된다. 혹여 미래에 SHA-256의 취약점이 발견되더라도 블록체인에는 [[하드포크]](Hard Fork)와 같은 알고리즘 개선 기법들이 존재하기 때문에 취약점을 제거할 수 있다.<ref name="우재"></ref>  
: 단방향(One-Way) 암호화는 평문을 암호화했을 때 다시 평문으로 [[복호화]]할 수 없는 암호화이다. 대표적으로 많이 사용되는 [[알고리즘]]이 SHA-256 암호화 알고리즘이다. SHA-256은 임의의 길이 메시지를 256 비트(bits)의 축약된 메시지로 만들어내는 [[해시]] 알고리즘이다. [[데이터]]의 수정과 변경을 검출 할 수 있으나 인증은 불가능하다. 인증에 사용하기 위해 메시지 인증 코드와 디지털 서명이 요구된다.<ref>chodahi, 〈[https://blog.naver.com/chodahi/221409516745 단방향 알고리즘(SHA256) 과 양방향 알고리즘(AES256)]〉, 《네이버 블로그》, 2018-11-30</ref>
 
 
 
* 안정성
 
: [[SHA-1]]은 구글 [[클라우드]] 서버를 기반으로 수행된 연구 사례에서 약 900경의 해시 연산을 통해 충돌이 발견된 경험이 있다. 이것을 바탕으로 근본적인 차이가 많이 없는 SHA-256의 안정성이 얼마나 높고 유지될 수 있다고 언급하기에는 어려움이 있다. 하지만 실질적으로 해시 취약점을 대상으로 하는 양자 컴퓨터가 출시되지 않는 이상 최소 근 10년가량은 안전하다는 판단을 할 수 있다. SHA-256의해 제공되는 [[해시]] [[알고리즘]]은 일정한 컴퓨터 연산 속도의 향상을 염두에 둔 가정에도 산술적으로 매우 강력하다는 결론에 도달하게 된다. 혹여 미래에 SHA-256의 취약점이 발견되더라도 블록체인에는 [[하드포크]](Hard Fork)와 같은 알고리즘 개선 기법들이 존재하기 때문에 취약점을 제거할 수 있다.<ref name="우재"></ref>
 
 
 
* 특성
 
: {| class="wikitable" width=400 style="color:balck; text-align: center; background-color:#F8F9FA;"
 
! 해시값의 크기
 
| 256
 
|-
 
! 내부 상태 크기
 
| 256
 
|-
 
! 블록 크기
 
| 512
 
|-
 
! 길이 한계
 
| 64
 
|-
 
! 워드 크기
 
| 32
 
|-
 
! 과정 수
 
| 64
 
|-
 
! 사용되는 연산
 
| +, and, or, xor, shr, rotr
 
|-
 
! 충돌 여부
 
| 발견되지 않음
 
|-
 
|}<ref name="나눔팁"></ref>
 
 
 
* 단점
 
: [[SHA-2]]에 대한 공격은 2008년부터 발생하기 시작했고, [[SHA-1]]의 경우와 마찬가지로 [[SHA-2]]에 대한 공격 역시 점점 더 박차를 가하며 [[SHA-2]]마저 약화하고 있다. 일부 공격은 [[SHA-2]]의 유효 보호 수준을 237비트까지 낮췄고 2016년에 발표된 일부 최근 공격을 보면 [[SHA-2]] 공격은 이미 "실용" 단계에 있다고 할 수 있다. 따라서 추후 방법을 찾아야 한다는 것이다.<ref name="SHA 상용화">*Roger A. Grimes|CSO, 〈[http://www.itworld.co.kr/opinion/108321%20sha-2 왜 SHA-3을 사용하지 않는가]〉, 《ITWORLD》, 2018-02-23</ref>
 
 
 
==예제==
 
* [[C]]
 
<font color=#006699>#include</font> <font color=#ff6600>"KISA_SHA256.h"</font>
 
 
 
<font color=#006699>#include</font> <font color=#FF1493><</font>stdio.h<font color=#FF1493>></font>
 
<font color=#006699>#include</font> <font color=#FF1493><</font>stdlib.h<font color=#FF1493>></font>
 
<font color=#006699>#include</font> <font color=#FF1493><</font>tchar.h<font color=#FF1493>></font>
 
 
 
<font color=#006699>int</font> main(<font color=#006699>int</font> argc, <font color=#006699>char</font><font color=#FF1493>**</font> argv)
 
{
 
 
 
    ''<font color=green>//변수 초기화.</font>''
 
    FILE <font color=#FF1493>*</font>fp <font color=#FF1493>=</font> <font color=#006699>NULL</font>;
 
    <font color=#FF1493>unsigned</font> <font color=#006699>char</font> buffer[<font color=blue>2048</font>] <font color=#FF1493>=</font> { <font color=blue>0</font>, };
 
    <font color=#FF1493>unsigned</font> <font color=#006699>char</font> result[<font color=blue>32</font>] <font color=#FF1493>=</font> { <font color=blue>0</font>, };
 
    <font color=#006699>int</font> read <font color=#FF1493>=</font> <font color=blue>0</font>;
 
    <font color=#006699>int</font> loop_number <font color=#FF1493>=</font> <font color=blue>0</font>;
 
 
 
    ''<font color=green>//SHA256 변수 초기화.</font>''
 
    SHA256_INFO sha256_info;
 
 
 
    SHA256_Init(<font color=#FF1493>&</font>sha256_info);
 
 
 
    ''<font color=green>//파일 읽기.</font>''
 
    ''<font color=green>//fp = fopen("Test.txt", "rb"); Visual Studio 옛버전을 사용할 경우, 이 구문 사용. Visual Studio에서 안전성 문제로 인한 함수 개선</font>''
 
    fopen_s(<font color=#FF1493>&</font>fp, <font color=#ff6600>"Text.txt"</font>, <font color=#ff6600>"rb"</font>);
 
 
 
    <font color=#FF1493>if</font> (fp <font color=#FF1493>==</font> <font color=#006699>NULL</font>)
 
    {
 
        <font color=#006699>printf</font>(<font color=#ff6600>"Error : File not find.\n"</font>);
 
        system(<font color=#ff6600>"pause"</font>);
 
        <font color=#FF1493>return -</font><font color=blue>1</font>;
 
    }
 
 
 
    <font color=#FF1493>while</font> ((read <font color=#FF1493>=</font> fread(buffer, <font color=blue>2048</font>, <font color=blue>1</font>, fp)) <font color=#FF1493>!=</font> <font color=blue>0</font>)
 
    {
 
        SHA256_Process(<font color=#FF1493>&</font>sha256_info, buffer, read);
 
    }
 
 
 
    SHA256_Close(<font color=#FF1493>&</font>sha256_info, result);
 
 
 
    <font color=#FF1493>for</font> (loop_number <font color=#FF1493>=</font> <font color=blue>0</font>; loop_number <font color=#FF1493><</font> <font color=blue>32</font>; loop_number<font color=#FF1493>++</font>)
 
    {
 
        <font color=#006699>printf</font>(<font color=#ff6600>"%02x"</font>, result[loop_number]);
 
    }
 
 
 
    system(<font color=#ff6600>"pause"</font>);
 
    <font color=#FF1493>return</font> <font color=blue>0</font>; 
 
}<ref>방사성 폐기장, 〈[https://jihadw.tistory.com/223 (Java) SHA256-KISA 라이브러리 사용하기]〉, 《티스토리》, 2017-01-15</ref>
 
 
 
* [[자바]](JAVA)
 
<font color=#FF1493>package</font> com.tistory.needjarvis;
 
 
 
<font color=#FF1493>import</font> java.security.MessageDigest;
 
<font color=#FF1493>import</font> java.security.NoSuchAlgorithmException;
 
 
 
<font color=#FF1493>public class</font> main {
 
    <font color=#FF1493>public static void</font> main(<font color=#006699>String</font>[] args) <font color=#FF1493>throws</font> Exception {
 
        <font color=#006699>System</font>.<font color=#006699>out</font>.<font color=#006699>println</font>(sha256(<font color=blue>"needjarvis"</font>));       
 
    }
 
 
 
    ''<font color=green>/**''
 
      ''* SHA-256으로 해싱하는 메소드''
 
      ''* ''
 
      ''* @param bytes''
 
      ''* @return''
 
      ''* @throws NoSuchAlgorithmException ''
 
      ''*/</font>''
 
    <font color=#FF1493>public static</font> <font color=#006699>String</font> sha256(<font color=#006699>String</font> msg) <font color=#FF1493>throws</font> NoSuchAlgorithmException {
 
        MessageDigest md <font color=#FF1493>=</font> MessageDigest.getInstance(<font color=blue>"SHA-256"</font>);
 
        md.update(msg.getBytes());
 
       
 
        <font color=#FF1493>return</font> bytesToHex1(md.digest());
 
    }
 
   
 
    ''<font color=green>/**''
 
      ''* 바이트를 헥스값으로 변환한다.''
 
      ''* ''
 
      ''* @param bytes''
 
      ''* @return''
 
      ''*/</font>''
 
    <font color=#FF1493>public static</font> <font color=#006699>String</font> bytesToHex(<font color=#006699>byte</font>[] bytes) {
 
        StringBuilder builder <font color=#FF1493>= new</font> StringBuilder();
 
        <font color=#FF1493>for</font> (<font color=#006699>byte</font> b: bytes) {
 
          builder.append(<font color=#006699>String</font>.<font color=#006699>format</font>(<font color=blue>"%02x"</font>, b));
 
        }
 
        <font color=#FF1493>return</font> builder.<font color=#006699>toString</font>();
 
    }
 
}<ref>자비스가 필요해, 〈[https://needjarvis.tistory.com/251 (Java) SHA-256 해싱(Hashing) 알고리즘 사용법]〉, 《티스토리》, 2018-08-07</ref>
 
 
 
* [[파이썬]](Python)
 
: SHA-256 해시값을 구하는 코드
 
<font color=#FF1493>import</font> hashlib
 
 
 
string <font color=#FF1493>=</font> <font color=#006699>raw_input</font>()
 
sha <font color=#FF1493>=</font> hashlib.new(<font color=#ff6600>'sha256'</font>)
 
 
 
sha.update(string)
 
<font color=#006699>print</font> sha.hexdigest()
 
<ref>Crocus, 〈[https://www.crocus.co.kr/990 파이썬 sha, md5 해시값 구하는 방법]〉, 《티스토리》, 2017-08-24</ref>
 
  
 
{{각주}}
 
{{각주}}
158번째 줄: 23번째 줄:
 
* 나눔팁, 〈[https://www.nanumtip.com/qa/221123/ SHA256 이란? 무엇인가!]〉, 《블로그》, 2018-08-20
 
* 나눔팁, 〈[https://www.nanumtip.com/qa/221123/ SHA256 이란? 무엇인가!]〉, 《블로그》, 2018-08-20
 
* chodahi, 〈[https://blog.naver.com/chodahi/221409516745 단방향 알고리즘(SHA256) 과 양방향 알고리즘(AES256)]〉, 《네이버 블로그》, 2018-11-30
 
* chodahi, 〈[https://blog.naver.com/chodahi/221409516745 단방향 알고리즘(SHA256) 과 양방향 알고리즘(AES256)]〉, 《네이버 블로그》, 2018-11-30
* Lyudmil Latinov, "[https://automationrhapsody.com/md5-sha-1-sha-256-sha-512-speed-performance/ MD5, SHA-1, SHA-256 and SHA-512 speed performance]", ''Automation Rhapsody'', 2018-05-03
 
* Roger A. Grimes|CSO, 〈[http://www.itworld.co.kr/opinion/108321%20sha-2 왜 SHA-3을 사용하지 않는가]〉, 《ITWORLD》, 2018-02-23
 
* 자비스가 필요해, 〈[https://needjarvis.tistory.com/251 (Java) SHA-256 해싱(Hashing) 알고리즘 사용법]〉, 《티스토리》, 2018-08-07
 
* 방사성 폐기장, 〈[https://jihadw.tistory.com/223 (Java) SHA256-KISA 라이브러리 사용하기]〉, 《티스토리》, 2017-01-15
 
* Crocus, 〈[https://www.crocus.co.kr/990 파이썬 sha, md5 해시값 구하는 방법]〉, 《티스토리》, 2017-08-24
 
  
 
== 같이 보기 ==
 
== 같이 보기 ==
 
* [[블록체인]]
 
* [[블록체인]]
 
* [[SHA]]
 
* [[SHA]]
* [[국립표준기술연구소]](NIST)
 
* [[SHA-224]]
 
* [[SHA-384]]
 
* [[SHA-512]]
 
* [[SHA-2]]
 
* [[자바]]
 
* [[C]]
 
* [[MD5]]
 
* [[MD2]]
 
* [[클라우드]]
 
* [[파이썬]]
 
  
{{암호 알고리즘|검토 필요}}
+
{{알고리즘|토막글}}

해시넷에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 해시넷:저작권 문서를 보세요). 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 | 편집 도움말 (새 창에서 열림)