안전한 해시 알고리듬
>52532fe14769afa2c1f35d35e5072b89bdc39493 > - "https://www.rigvedawiki.net/r1/wiki.php/SHA"(따옴표 제외)의 SHA-1값
>b6b16fa2109fb5865798d6aee4ed370ab60da957c757376eeccd4055a4212850 > - "https://www.rigvedawiki.net/r1/wiki.php/SHA"(따옴표 제외)의 SHA-2중 SHA-256값
>0c58a896cb964559a0f4a9ec60cafc22f1924f0245a47d3f8804785488931909 >968f639b61b6ad7001a26cba2db957e1e021234a32b211bf3c9f060d07850821 > - "https://www.rigvedawiki.net/r1/wiki.php/SHA"(따옴표 제외)의 SHA-3값 ~~길다~~ [* 이것은 엄밀히 말해서 Keccak(r=576, c=1024)의 512-bit 해시값이다. Keccak 알고리즘은 이전의 SHA 알고리즘과는 달리 출력 길이가 제한되어 있지 않고, 알고리즘 자체에도 변경 가능한 파라미터가 있기에 어떤 파라미터를 쓰느냐에 따라 얼마든지 결과값이 달라질 수 있다.]
1993년부터 미국 NSA가 제작하고 미국 국립표준기술연구소(NIST)에서 표준으로 제작한 해쉬 암호 알고리즘이다. 1993년 SHA-0을 시작으로, 현재 최신 버전은 2001년 방식이 나온 SHA-2을 사용중이고, 2012년 10월에 SHA-3이 정식 발표되었다. [#]
현재 사용중인 SHA-2는 SHA-1을 대체하는 해쉬암호로, SHA-224, SHA-256, SHA-384, SHA-512등의 종류가 있다. 2005년도엔 SHA-1에 보안 구멍이 생겼으며, 2008년 결국 해쉬 충돌이 발생해[* 아 물론 이건 알려진 것이다. 모든 암호화 알고리즘이 다 그렇지만 암호학의 지하에선 더 빨리 뚫렸을지 모른다(...)] 현재 많이 쓰이는 해쉬암호 기술이다. 그러나, 일단 기본은 SHA-1과 큰 차이가 없다(...) 현재는 SHA-1과 2와 생판다른 알고리즘인 SHA-3을 개발중이며[* 개발이라기보단, 여러 보안 전문가들과 컴덕후들이 만들어낸 해시 알고리즘 중 몇 개를 추려서 가장 견고한 것에 SHA-3 딱지를 붙이는 공모전에 가깝다. 고려대학교에서도 아리랑이라는 이름으로 출품했지만... 광탈해버렸다(...) 3차 후보까지 남은 건 BLAKE, Grøstl, JH, Keccak, Skein의 5개 알고리즘이다.], 2012년 10월 2일자로 Keccak이 SHA-3로 확정되었다. #
대한민국 인터넷뱅킹은 SHA-256을 사용하고 있으며[* 2011년 전까진 2008년에 이미 뚫린(...) SHA-1을 사용중이었다(...)], 비트토런트는 파일을 BASE32로 바꾼 SHA-1을 해쉬로 사용한다. 비트코인은 작업 증명에 SHA-256을 사용한다.
SHA는 파일 값이 약간만 바뀌어도 값이 천차 만별로 바뀔수 있다. 보통 이를 가리켜 눈사태 효과라 부른다.
개요
안전한 해시 알고리듬(SHA, Secure Hash Algorithm) 함수들은 서로 관련된 암호학적 해시 함수들의 모음이다. 이들 함수는 미국 국가안보국(NSA)이 1993년에 처음으로 설계했으며 미국 국가 표준으로 지정되었다. SHA 함수군에 속하는 최초의 함수는 공식적으로 SHA라고 불리지만, 나중에 설계된 함수들과 구별하기 위하여 SHA-0이라고도 불린다. 2년 후 SHA-0의 변형인 SHA-1이 발표되었으며, 그 후에 4종류의 변형, 즉 SHA-224, SHA-256, SHA-384, SHA-512가 더 발표되었다. 이들을 통칭해서 SHA-2라고 하기도 한다.
SHA-1은 SHA 함수들 중 가장 많이 쓰이며, TLS, SSL, PGP, SSH, IPSec 등 많은 보안 프로토콜과 프로그램에서 사용되고 있다. SHA-1은 이전에 널리 사용되던 MD5를 대신해서 쓰이기도 한다. 혹자는 좀 더 중요한 기술에는 SHA-256이나 그 이상의 알고리즘을 사용할 것을 권장한다.
SHA-0과 SHA-1에 대한 공격은 이미 발견되었다. SHA-2에 대한 공격은 아직 발견되지 않았으나, 전문가들은 SHA-2 함수들이 SHA-1과 비슷한 방법을 사용하기 때문에 공격이 발견될 가능성이 있다고 지적한다. 미국 표준 기술 연구소(NIST)는 SHA-2로 불리는 새로운 암호화 해시 알고리즘에 대한 후보를 공모하였다.
SHA 함수군
[[파일:SHA-1.svg|thumb|right|300px|SHA-1 압축 함수가 블록 하나를 처리하는 과정. A, B, C, D, E는 각각 32비트 내부 상태이고, F는 계속 변하는 비선형 함수이며, Kt는 상수이다. 왼쪽 회전n은 n비트만큼 왼쪽으로 회전하는 연산이고, 덧셈은 232 모듈로 덧셈을 나타낸다.]]
최초의 알고리즘은 1993년에 미국 표준 기술 연구소(NIST)에 의해 안전한 해시 표준(Secure Hash Standard, FIPS PUB 180)으로 출판되었으며, 다른 함수들과 구별하려 보통 SHA-0이라고 부른다. 얼마 안 있어 NSA는 이 표준을 폐기했고, 1995년에 개정된 알고리즘(FIPS PUB 180-1)을 새로 출판했으며 이를 SHA-1이라고 부른다. SHA-1은 SHA-0의 압축 함수에 비트 회전 연산을 하나 추가한 것으로, NSA에 따르면 이는 원래 알고리즘에서 암호학적 보안을 감소시키는 문제점을 고친 것이라고 하지만 실제로 어떤 문제점이 있었는지는 공개하지 않았다. 일반적으로 SHA-1은 SHA-0보다 암호학적 공격이 힘든 것으로 알려져 있으며, 따라서 NSA의 주장은 어느 정도 설득력이 있다. SHA-0과 SHA-1은 최대 264비트의 메시지로부터 160비트의 해시값을 만들어 내며, 로널드 라이베스트가 MD4 및 MD5 해시 함수에서 사용했던 것과 비슷한 방법에 기초한다.
NIST는 나중에 해시값의 길이가 더 긴 네 개의 변형을 발표했으며, 이들을 통칭하여 SHA-2라 부른다. SHA-256, SHA-384, SHA-512는 2001년에 초안으로 처음으로 발표되었으며, 2002년에 SHA-1과 함께 정식 표준(FIPS PUB 180-2)으로 지정되었다. 2004년 2월에 삼중 DES의 키 길이에 맞춰 해시값 길이를 조정한 SHA-224가 표준에 추가되었다. SHA-256과 SHA-512는 각각 32비트 및 64비트 워드를 사용하는 해시 함수이며, 몇몇 상수들이 다르긴 하지만 그 구조는 라운드의 수를 빼고는 완전히 같다. SHA-224와 SHA-384는 서로 다른 초기값을 가지고 계산한 SHA-256과 SHA-512 해시값을 최종 해시값 길이에 맞춰 잘라낸 것이다.
크기 비교
다음은 SHA 함수들의 특성을 요약한 표이다.
알고리즘 | 해시값 크기 | 내부 상태 크기 | 블록 크기 | 길이 한계 | 워드 크기 | 과정 수 | 사용되는 연산 | 충돌 |
---|---|---|---|---|---|---|---|---|
SHA-0 | 160 | 160 | 512 | 64 | 32 | 80 | +,and,or,xor,rotl | 발견됨 |
SHA-1 | 160 | 160 | 512 | 64 | 32 | 80 | +,and,or,xor,rotl | 공격법만 존재 |
SHA-256/224 | 256/224 | 256 | 512 | 64 | 32 | 64 | +,and,or,xor,shr,rotr | - |
SHA-512/384 | 512/384 | 512 | 1024 | 128 | 64 | 80 | +,and,or,xor,shr,rotr | - |
여기서 내부 상태는 데이터 블록 하나를 압축한 뒤의 "내부적인 해시값"의 크기를 나타낸다. 또한 SHA는 내부적으로 메시지 채움을 위해 데이터의 길이와 같은 추가적인 변수를 사용하며, 길이 한계는 이때 사용되는 변수의 크기를 나타낸다. 메시지 채움에 대한 자세한 설명은 머클-담고르 해시 함수를 참고하라.
예제
다음은 SHA-1 해시값의 예제이다.
SHA1("The quick brown fox jumps over the lazy dog") = 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
해시값은 눈사태 효과 때문에 메시지가 조금만 바뀌어도 완전히 바뀔 수 있다. 다음 예시는 위의 예제 끝에 마침표(.)를 찍은 것이다.
SHA1("The quick brown fox jumps over the lazy dog.") = 408d94384216f890ff7a0c3528e8bed1e0b01621
빈 문자열의 해시는 다음과 같다.
SHA1("") = da39a3ee5e6b4b0d3255bfef95601890afd80709
구현
미국과 캐나다 정부(NIST와 CSE)에서는 SHA 구현들을 검증하기 위한 프로그램을 제공한다. [1] 또한 정식 검증 절차를 거치지 않고도 사용할 수 있는 예제 테스트 데이터도 함께 제공하고 있다. 예제 데이터와 실제 검증 과정은 수만 개의 테스트가 포함되어 있으며, 몇몇 경계 조건과 자주 나타나는 구현 에러를 잡아 낼 수 있도록 설계되어 있다.
2006년 5월 초 기준으로, 적어도 463개의 검증된 SHA 구현이 존재하며 그중 7개는 바이트 단위가 아닌 임의의 이진 데이터도 처리할 수 있다. 이외에도 인터넷에는 SHA-1 표준에 있는 예제는 통과하지만 NIST 검증 페이지의 예제들은 통과하지 못하는 구현들이 몇몇 있다.