본문 바로가기

VBA/기타

[VBA] SHA-256 Encrypt

반응형

SHA-256


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

 

 

특징


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

 

단방향 알고리즘단방향

(One-Way) 암호화는 평문을 암호화했을 때 다시 평문으로 복호화할 수 없는 암호화이다. 대표적으로 많이 사용되는 알고리즘이 SHA-256 암호화 알고리즘이다. SHA-256은 임의의 길이 메시지를 256 비트(bits)의 축약된 메시지로 만들어내는 해시 알고리즘이다. 데이터의 수정과 변화를 검출 할 수 있으나 인증은 불가능하다. 인증에 사용하기 위해 메시지 인증 코드와 디지털 서명이 요구된다.

 

안정성

SHA-1은 구글 클라우드 서버를 기반으로 수행된 연구 사례에서 약 900경의 해시 연산을 통해 충돌이 발견된 경험이 있다. 이것을 바탕으로 근본적인 차이가 많이 없는 SHA-256의 안정성이 얼마나 높고 유지될 수 있다고 언급하기에는 어려움이 있다. 하지만 실질적으로 해시 취약점을 대상으로 하는 양자 컴퓨터가 출시되지 않는 이상 최소 근 10년가량은 안전하다는 판단을 할 수 있다. SHA-256의해 제공되는 해시 알고리즘은 일정한 컴퓨터 연산 속도의 향상을 염두에 둔 가정에도 산술적으로 매우 강력하다는 결론에 도달하게 된다. 혹여 미래에 SHA-256의 취약점이 발견되더라도 블록체인에는 하드포크(Hard Fork)와 같은 알고리즘 개선 기법들이 존재하기 때문에 취약점을 제거할 수 있다.

 

특성

해시값의 크기 256
내부 상태 크기 256
블록 크기 512
길이 한계 64
워드 크기 32
과정 수 64
사용되는 연산 +, and, or, xor, shr, rotr
충돌 여부 발견되지 않음

 

단점
SHA-2에 대한 공격은 2008년부터 발생하기 시작했고, SHA-1의 경우와 마찬가지로 SHA-2에 대한 공격 역시 점점 더 박차를 가하며 SHA-2마저 약화하고 있다. 일부 공격은 SHA-2의 유효 보호 수준을 237비트까지 낮췄고 2016년에 발표된 일부 최근 공격을 보면 SHA-2 공격은 이미 "실용" 단계에 있다고 할 수 있다. 따라서 추후 방법을 찾아야 한다는 것이다.

 

 

VBA Code


Function SHA256Encrypt(text As String, Optional secretKey As String = vbNullString) As Byte() 
     
    Dim asc As Object, enc As Object 
    Dim bText() As Byte, bKey() As Byte, bytes() As Byte 
     
    Set asc = CreateObject("System.Text.UTF8Encoding") 
     
    If secretKey <> vbNullString Then 
        Set enc = CreateObject("System.Security.Cryptography.HMACSHA256") 
        bText = asc.Getbytes_4(text) 
        bKey = asc.Getbytes_4(secretKey) 
        enc.Key = bKey 
        bytes = enc.ComputeHash_2(bText) 
    Else 
        Set enc = CreateObject("System.Security.Cryptography.SHA256Managed") 
        bText = asc.Getbytes_4(text) 
        bytes = enc.ComputeHash_2((bText)) 
    End If 
     
    SHA256Encrypt = bytes 
     
    Set asc = Nothing 
    Set enc = Nothing 
     
End Function
반응형

'VBA > 기타' 카테고리의 다른 글

[VBA] Base64 Encoding/Decoding  (0) 2019.09.30