SHA
Secure Hash Algorithm
3f57b4255732fbd8df203466ef5cd5f4c980e545
- "https://namu.wiki/w/SHA"(따옴표 제외)의 SHA-1값
a0d20951336a0e6a39da2682efff30ab31012e88ea606aea6fdae9b502012fe5
- "https://namu.wiki/w/SHA"(따옴표 제외)의 SHA-2중 SHA-256값
1e3d31e819d5c890c6d9e48498ba2945f759be742699ad8e70f4b536059e6f38b472f1eea9c0d73aae792371fe38481401b7bef4e18b4a9a1d86056138dcfda2
- "https://namu.wiki/w/SHA"(따옴표 제외)의 SHA-3값 [1]
1. 개요
1993년부터 미국 NSA가 제작하고 미국 국립표준기술연구소(NIST)에서 표준으로 채택한 암호학적 해시 함수이다.
참고로, SHA는 원본 값이 단, 한 글자, 단 1비트만 바뀌어도 값이 천차만별로 바뀔 수 있다. 보통 이를 가리켜 눈사태 효과라 부른다. [2]
2. 역사
2.1. SHA-0와 SHA-1
1993년 SHA의 표준으로 정의되어 발표되었으며 160 비트의 해시값을 사용한다. 그러나 2년 만에 바로 취약점이 발견되어 이를 개선한 SHA-1이 새로 발표되었고, 이는 널리 사용되었다. SHA-1 역시 160 비트 해시값을 사용한다. 처음 발표된 SHA는 편의상 SHA-0로 표기하여 구분한다.
그러나 2005년도에 한 중국의 대학 연구팀에 의해 해독의 가능성이 제시되었으며, 결국 2008년에 해시 충돌이 발생했으며[3] 2015년에는 주요 브라우저에서도 지원 중단을 예고하는 등 퇴출 수속을 밟고 있다. 그리고 2017년 SHA-1 '''전체'''의 해시 충돌이 구글 프로젝트 제로 팀에 의해 밝혀졌다. 구글은 아예 충돌하는 키를 '''완전히 공개'''할 예정으로, 구글 정책상 90일 뒤인 5월 말쯤 어떤 방법을 적용했는지 공개가 되면 SHA-1은 그냥 끔살될 예정. 그 이전에 다른 알고리즘으로 안 갈아타면 그대로 망하게 만들겠다는 반협박 수준의 강력한 보안 경고이다. 관련 기사
결국 구글 크롬 브라우저는 2017년 1월에 출시한 56버전부터는 SHA-1 인증서를 사용하는 사이트에 접속시 안전하지 않은 사이트라며 경고 메시지를 띄우도록 했고, 2019년부터는 SHA-1 인증서를 사용하는 사이트는 접속하지 못하도록 차단했다. 파이어폭스 등 다른 브라우저도 2017년부터 SHA-1 인증서를 사용하는 사이트에 접속시 경고 메시지를 띄우는 등의 업데이트를 하며, 2015년 기준 90%이상의 사이트가 사용하던 SHA-1은 더 이상 찾아보기 힘들게 되었다.
2.2. SHA-2
SHA-1 역시 해시 충돌을 이용한 위험성이 발견되어 차세대 버전이 나왔는데, 개선된 버전이 SHA-2 로 2001년에 발표되었다. 해시 길이에 따라서 224, 256, 384, 512 비트를 선택해서 사용할 수 있으며, 당연히 해시 길이가 길 수록 더 안전하다. 편의상 해시 길이에 따라 SHA-224, SHA-256, SHA-384, SHA-512 등으로 부른다. 일반적으로 SHA-256을 사용한다.
해시 길이가 길어졌기에 그만큼 안전하긴 하지만, 알고리즘의 기본 동작이 SHA-1과 큰 차이가 없기 때문에 완전히 안전하다(=공격 받을 가능성이 없다.)고 장담하긴 어렵다. 비둘기 집의 원리에 의해서 수학적으로는 충돌 가능성이 존재하기 때문이다. 그러나, 취약점이 발견되지 않는 한 공학적으로 그 가능성은 없다고 봐도 무방하다. 왜냐하면 SHA-256 기준으로 2^256 = 115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936 = 약 1.158*10^77가지 경우의 수가 존재하며, 이는 관측 가능한 우주에 있는 모든 원자수보다도 크다는 주장이 있다. 따라서 겹칠 가능성은 멀리 떨어진 두 원자가 갑자기 한 곳에서 만나 충돌하는 수준이다.
2.3. SHA-3
2012년 10월에 더욱더 안정성이 높은 방식으로 설계된 SHA-3이 정식 발표되었다.
SHA-2 도 위험성 문제가 제기되자, 충돌 가능성을 피하기 위해서 SHA-1과 2와 전혀 다른 알고리즘인 SHA-3의 개발이 진행되었다. 정확하게는 개발이라기보단, 여러 보안 전문가들과 컴덕후들이 만들어낸 해시 알고리즘 중 몇 개를 추려서 가장 견고한 것에 SHA-3 딱지를 붙이는 '''공모전'''에 가깝다. 고려대학교에서도 아리랑이라는 이름으로 출품했지만 탈락했다. 3차 후보까지 남은 건 BLAKE, Grøstl, JH, Keccak, Skein의 5개 알고리즘이다.
2012년 10월 2일자로 Keccak이 SHA-3로 확정되었다. #
3. 활용한 소프트웨어
3.1. SHA-1
- 비트토렌트는 파일을 BASE32로 바꾼 SHA-1을 해시로 사용한다.
- 깃(Git)은 파일이나 커밋 등 모든 오브젝트를 SHA-1으로 해시한 식별자를 통해 관리한다. SHA-1을 깬 구글이 "깃(Git) 시스템도 불안하다"고 하였으나 깃을 만든 리누스 토발즈는 "깃은 데이터를 해시하기만 하는 게 아니라, 거기에 타입과 길이 필드를 측량한다"며 동의하지 않았다. #
3.2. SHA-2
- 대한민국 인터넷뱅킹은 SHA-256을 사용하고 있다. 2011년까진 2008년에 이미 뚫린 SHA-1을 사용하고 있었다.
- 비트코인은 작업 증명에 SHA-256을 사용한다.
- TrueCrypt는 키 유도에 SHA-512를 사용할 수 있다.
- Windows Update는 파일의 디지털 서명에 SHA-256을 사용한다. 2020년 7월까지는 SHA-1도 병용했으나, 이후 서버에 등록된 모든 파일에서 SHA-1 디지털 서명을 제거하였으며, SHA-2를 지원하지 않는 구형 Windows에 대한 업데이트 파일은 아예 서버에서 삭제해버렸다.[4]
3.3. SHA-3
- 이더리움 - 이더리움은 Keccak256 을 사용하는데, Keccak 이 SHA-3 로 제안될때 일부 변경된 부분이 있고, SHA-3 는 이것이 반영되어 확정되었다. 그래서 엄밀하게 말하면 Keccak256 과 SHA-3 는 동일하진 않으며, 이더리움은 변경전의 Keccak256 을 사용하므로 정확하게 SHA-3 표준을 따른다고 할 순 없다.
[1] 이것은 엄밀히 말해서
Keccak[c=2d]
의 512-bit 해시값이다. Keccak 알고리즘은 이전의 SHA 알고리즘과는 달리 출력 길이가 제한되어 있지 않고, 알고리즘 자체에도 변경 가능한 파라미터가 있기에 어떤 파라미터를 쓰느냐에 따라 얼마든지 결과값이 달라질 수 있다.[2] 눈사태 효과가 없거나 적다면 보안에 치명적이기에, 거의 모든 암호화 알고리즘에서 기본적으로 포함되어 있다. SHA 만의 특성은 아니다. [3] 물론 이건 알려진 것이다. '''모든 암호화 알고리즘이 다 그렇지만 암호학의 지하에선 더 빨리 뚫렸을지 모른다'''.[4] 정확히는 Windows 2000, Windows XP, Windows Server 2003, Windows Server 2003 R2, Windows Vista이다. Windows 9x 계열과 Windows NT 4.0에 대한 업데이트 서버는 2012년에 이미 중단하였으며, Windows Vista를 기반으로 한 Windows Server 2008은 별도의 SHA-2 지원 패치를 배포하였다.