Utilo

MD5 대 SHA-256: 차이점, 보안 및 각각을 사용할 때

MD5, SHA-1, SHA-256 및 SHA-3를 비교하십시오. 해시 함수가 어떻게 작동하는지, MD5가 왜 깨졌는지, 속도, 체크섬, HMAC 및 패스워드를 해시하는 올바른 방법.

· 5분 분량

해시 함수는 소프트웨어에서 가장 널리 사용되는 빌딩 블록 중 하나입니다. 그들은 다운로드를 확인하고, 파일을 제거하고, API 요청을 서명하고, Git과 블록 체인을 작동시키고, 저장된 암호를 보호합니다. MD5와 SHA-256은 개발자들이 가장 자주 접하는 두 개의 이름이고, "나는 여전히 MD5를 사용할 수 있을까?"라는 질문이 끊임없이 떠오릅니다. 짧은 답은 보안과 관련된 모든 것에 대해서는 그렇지 않습니다. 우연한 부패를 탐지하는 데는 여전히 효과가 있습니다. 더 긴 답은 왜, 그리고 대신 무엇을 사용해야 하는지 설명합니다.

암호 해시 함수가 하는 일

해시 함수는 모든 길이의 입력값을 받아 다이제스트라고 불리는 고정 길이의 출력을 생성합니다. MD5는 128비트 (32개의 헥사스 문자) 를 생성하고, SHA-256은 256비트 (64개의 헥사스 문자) 를 생성한다.

MD5("hello world")     = 5eb63bbbe01eeed093cb22bb8f5acdc3
SHA-256("hello world") = b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

좋은 암호 해시는 세 가지 보안 특성을 가지고 있습니다.

  1. **프리 이미지 저항: ** 다이제스트를 감안하면 그것을 생성하는 입력값을 찾는 것은 불가능합니다.
  2. ** 두 번째 전사진 저항:** 입력값을 감안하면 동일한 다이제스트로 다른 입력값을 찾는 것은 불가능합니다.
  3. ** 충돌 저항:** 같은 소화로 두 가지 다른 입력을 찾는 것은 불가능합니다.

그것은 또한 ** 계곡 효과 **를 보여주어야합니다: 입력의 단일 비트 변경은 출력 비트의 절반 정도를 변화시킵니다. 그래서 유사한 입력들은 완전히 연관되지 않은 소화들을 가지고 있습니다. [하시 생성기] ((/tools/hash) 에서 시도해보세요: "hello world"와 "hello world!"는 공통점이 없는 소화기를 생성합니다.

MD5의 짧은 역사

론 리베스트는 1991년에 MD5를 설계했습니다. 빠르게 퍼져나갔고 모든 곳에 퍼져나갔습니다. 파일 체크섬, 비밀번호 저장, 디지털 인증서 몇 년 만에 약점이 나타났고 2004년 연구자들은 실제적인 충돌을 입증했습니다. 2008년, 한 팀이 MD5 충돌을 이용해서 악성 인증서 인증서를 만들었고, 2012년 플레임 악성코드는 MD5 충돌을 이용해 마이크로소프트 코드 서명 인증서를 위조했습니다. 오늘날, MD5 충돌을 생성하는 데는 노트북에서 몇 초가 걸립니다.

MD5에 대한 프리메이지 공격은 이론적으로 남아 있지만 충돌 저항은 완전히 깨지고 있습니다. 공격자가 관여할 수 있는 서명, 인증서 및 무결성 검사에서 이를 배제하기에 충분합니다.

SHA-1: 또한 은퇴

SHA-1은 160비트 출력으로 비슷한 경로를 따라갔습니다. 이론적 약점은 2005년에 발표되었고, 2017년에 구글과 CWI 암스테르담은 첫 번째 실제 충돌 ("SHAttered") 을 발생시켰습니다. 같은 SHA-1 해시를 가진 두 개의 다른 PDF 파일입니다. 브라우저들은 SHA-1 인증서를 받아들이지 않고 Git는 SHA-256으로 마이그레이션하고 있습니다. SHA-1을 MD5처럼 취급하세요.

SHA-256과 SHA-2 가족

2001년 NIST에서 발표한 SHA-2에는 SHA-224, SHA-256, SHA-384 및 SHA-512이 포함되어 있습니다. SHA-256은 가장 널리 배포되어 있습니다: TLS 인증서, 코드 서명, 비트코인, 패키지 관리자, 하위 자원의 무결성, JWT 서명 (HS256 및 RS256) 그리고 훨씬 더 많은. 20여 년의 분석 후, 충돌이나 이미지의 저항성에 대한 실질적인 공격은 없습니다.

SHA-512는 64비트 동작을 사용하며 하드웨어 가속 없이 64비트 CPU에서 SHA-256보다 빠르다. SHA-384는 줄인 SHA-512이며 또한 길이 확장 공격에 저항합니다.

SHA-3

2015년에 표준화된 SHA-3 (Keccak) 는 완전히 다른 내부 디자인을 사용하므로 SHA-2에 대한 돌파구가 자동적으로 영향을 미치지 않습니다. SHA-2를 대체하는 것이 아니라 다른 특성을 가진 백업입니다. 사양이 요구하는 경우에 사용하세요. 그렇지 않으면 SHA-256은 실용적인 기본값으로 남아 있습니다.

나란히 비교

알고리즘 출력 크기 충돌 저항성 상태
MD5 128 비트 부러진 (초) 보안을 위해서가 아니라
SHA-1 160비트 브로켄 (2017) 보안을 위해서가 아니라
SHA-256 256 비트 안전 권장 기본값
SHA-512 512 비트 안전 추천
SHA3-256 / SHA3-512 256 / 512 비트 안전 권장 대안
BLAKE3 256비트 (확장 가능) 안전 매우 빠른, 증가하는 채택

속도

MD5는 순수한 소프트웨어에서 SHA-256보다 빠르지만, 그 차이는 사람들이 생각하는 것보다 덜 중요합니다. 현대적인 x86과 ARM 프로세서는 SHA-256 하드웨어 명령어를 포함하고 있으며, 이는 SHA-256을 초당 기가바이트로 실행하도록합니다. 실제로는, 디스크나 네트워크에서 파일을 읽는 것이 보통 병목이고, 해싱이 아닙니다. 비보안용 용도로 원료 속도가 중요하다면, BLAKE3 또는 xxHash와 같은 비 암호 해시가 둘 다 이길 수 있습니다.

MD5가 여전히 받아들여질 때

MD5의 충돌 약점은 누군가가 의도적으로 입력값을 만들 수 있을 때만 중요합니다. 다음의 경우에도 허용됩니다.

  • ** 공격자가 관여하지 않은 상태에서 전송이나 저장에서 우연한 부패를 탐지합니다.
  • ** 캐시 키 및 신뢰 데이터의 중복화 **, 예를 들어 자신의 파일을 버킷.
  • ** 레거시 호환성**, 예를 들어 MD5 체크섬만 게시하는 시스템이나 그것을 요구하는 프로토콜.

이러한 경우에도 SHA-256을 선택하는 것은 비용이 적게 들며 공격자가 관여할 수 없다는 주장의 필요성을 제거합니다. 많은 사건들은 "부패만을 위한" 체크섬으로 시작되었고, 나중에 보안을 위해 사용되었습니다.

다운로드를 올바르게 확인

프로젝트가 SHA-256 체크섬을 게시할 때 다운로드 해시를 계산하고 각 문자를 비교합니다.

sha256sum ubuntu.iso          # Linux
shasum -a 256 ubuntu.iso      # macOS
Get-FileHash ubuntu.iso       # Windows PowerShell

일치하는 체크섬은 파일이 출판자가 해시한 것과 일치한다는 것을 증명합니다. 그것은 출판사가 합법적이라는 것을 증명하지 않습니다. 공격자가 웹사이트를 통제한다면 파일과 체크섬을 모두 대체할 수 있습니다. 서명된 체크섬 (GPG 또는 Sigstore) 은 그 격차를 메우죠.

HMAC: 키로 해시

단순한 해시는 무결성을 증명하지만 진실성을 증명하지 않습니다. 누구나 계산할 수 있습니다. HMAC는 비밀 키를 메시지와 결합합니다. 그래서 열쇠를 가진 당사자만이 결과를 생성하거나 확인할 수 있습니다. 스트라이프, 깃허브 및 슬랙의 웹후크는 HMAC-SHA256 서명을 사용하며 [JWT는 HS256로 서명되었습니다.

secret + message을 연결하고 해시하여 자신의 키 hash을 만들지 마십시오. MD5, SHA-1 및 SHA-256의 경우, 이것은 길이 확장 공격에 취약합니다. 모든 언어에서 제공하는 표준 HMAC 구조를 사용하세요. 서명을 비교할 때, 시간 공격을 피하기 위해 일정한 시간 비교 함수를 사용하세요.

비밀번호는 완전히 다른 도구가 필요합니다.

MD5나 SHA-256는 비밀번호를 직접 저장하는 데 사용해서는 안 됩니다. 빠른 해시는 단점입니다. 현대 GPU는 초당 수십억 개의 SHA-256 해시를 계산합니다. 그래서 데이터베이스를 훔친 공격자는 엄청난 암호 목록을 빠르게 테스트할 수 있습니다. 염분이 없는 해시는 더 나쁘습니다. 왜냐하면 사전 계산된 테이블이 일반적인 암호를 즉시 해독하기 때문입니다.

느리고 메모리가 어렵게 설계된 암호 해시 함수를 사용하세요:

  • Argon2id 패스워드 해싱 경쟁의 우승자이자 현재 1위입니다.
  • 스크립트 메모리 하드 및 널리 사용 가능합니다.
  • bcrypt 더 오래지만 여전히 받아들일 수 있으며, 72바이트 입력 제한이 있습니다.
  • PBKDF2 높은 반복 을 가진 NIST가 승인된 원시자를 필요로 하는 경우

이 기능들은 비밀번호마다 고유한 소금을 추가하고 하드웨어가 빨라질수록 커질 수 있는 구성 가능한 비용 요인을 제공합니다. 도서관은 세부사항을 처리합니다. hash(password)과 verify(password, stored)를 호출합니다.

코딩 다이제스트

다이제스트는 원시 바이트로, 보통 헥사데시멀 (바이트당 2자) 또는 베이스64 (더 컴팩트) 로 표시됩니다. 같은 SHA-256 다이제스트는 64개의 스 문자 또는 44개의 베이스64 문자입니다. 하위 자원의 무결성 속성은 Base64 (sha384-...) 를 사용하지만 체크섬 파일은 hex를 사용합니다. 코딩 측면에 대한 자세한 내용은 [Base64 설명] (blog/base64-explained) 를 참조하십시오.

결정 가이드

  • 결실성 검사, 서명, 인증서, 보안 관련 모든 것: SHA-256 (또는 SHA-512, SHA-3, BLAKE3)
  • ** 공유된 비밀로 메시지를 인증합니다:** HMAC-SHA256.
  • ** 비밀번호 저장:** Argon2id, scrypt 또는 bcrypt 결코 단순한 해시.
  • 비대립 체크섬이나 캐시 키: MD5는 작동하지만 SHA-256은 더 안전한 습관입니다.
  • 고속 비 보안 해시 (해시 테이블, 셔딩): xx해시 또는 유사한 비 암호 해시.

요약

MD5와 SHA-1는 충돌 저항성을 위해 깨져 있으며 공격자가 크래프팅 입력에서 이익을 얻을 수 있는 경우에 사용해서는 안됩니다. SHA-256은 안전하고, 하드웨어 지원이 빠르고, 완전성과 서명에 대한 기본값이 맞습니다. HMAC를 키로 인증하고 비밀번호를 Argon2id처럼 느린 기능을 사용하세요. 의심할 때 SHA-256을 선택하십시오. 그것은 결코 무결성을 위한 잘못된 답이 아닙니다. 그리고 MD5는 점점 더 그렇습니다.

이 페이지는 영어에서 자동 번역되었습니다. 오류를 발견하시면 알려 주세요.

관련 가이드