Hash Identifier

길이와 형식으로 해시 유형 식별 — MD5, SHA-1, SHA-256 등

해시 문자열

로컬에서 실행 · 시크릿 붙여넣기 안전

해시 식별이란 무엇입니까?

해시 식별은 주어진 다이제스트를 생성한 암호화 해시 알고리즘을 판별하는 과정입니다. MD5, SHA-1, SHA-256과 같은 암호화 해시 함수는 각각 고정 길이의 출력을 생성하며, 출력 길이는 알 수 없는 해시를 식별하는 데 사용되는 주요 신호입니다. 데이터베이스 덤프, 설정 파일, 또는 API 응답에서 16진수 문자열을 접할 때, 해시 식별 도구는 어떤 알고리즘이 이를 생성했는지 알려줍니다.

모든 해시 알고리즘은 임의의 입력 데이터를 다이제스트라고 하는 고정 크기의 출력으로 변환합니다. MD5는 항상 128비트(32개의 16진수 문자)를 생성하고, SHA-1은 항상 160비트(40개의 16진수 문자)를 생성하며, SHA-256은 항상 256비트(64개의 16진수 문자)를 생성합니다. 이 결정론적 출력 길이 덕분에 원본 입력이나 해싱 코드에 접근하지 않고도 알고리즘 식별이 가능합니다.

길이만으로는 항상 확정적으로 식별할 수 없습니다. 여러 알고리즘이 동일한 출력 크기를 공유하는 경우가 있습니다. 예를 들어, SHA-256과 SHA3-256은 모두 64자리 16진수 다이제스트를 생성합니다. 이러한 경우, 해시 식별기는 발생 빈도에 따라 순위가 매겨진 후보 알고리즘 목록을 제공합니다. 소스 시스템, 인코딩 형식(hex 대 Base64), 알고리즘 접두사(bcrypt의 경우 '$2b$'와 같은) 등의 맥락 단서로 가능성을 더욱 좁힐 수 있습니다.

해시 식별기를 사용하는 이유

알 수 없는 해시는 보안 감사, 데이터베이스 마이그레이션, 포렌식 분석 과정에서 자주 등장합니다. 해시 식별기는 추측의 필요성을 없애고 수초 내에 올바른 알고리즘을 알려줍니다.

즉각적인 감지
해시를 붙여넣으면 즉시 후보 알고리즘을 확인할 수 있습니다. 문자를 수동으로 세거나 참조 표를 조회할 필요 없이, 도구가 16진수 길이를 모든 일치하는 알고리즘에 자동으로 매핑합니다.
🔒
개인 정보 우선 분석
모든 식별 작업은 JavaScript를 사용하여 브라우저 내에서 완전히 실행됩니다. 해시 값은 장치 외부로 전송되지 않으므로, 비밀번호 해시, 인증 토큰, 또는 민감한 포렌식 증거를 분석할 때 안전합니다.
📋
완전한 알고리즘 지원 범위
MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 및 해당 SHA-3 대응 알고리즘을 감지합니다. 참조 표는 전체 SHA-2 및 SHA-3 계열과 RIPEMD-160, BLAKE2 같은 일반적인 대안들을 포함합니다.
🚫
계정 또는 설치 불필요
모든 최신 브라우저에서 즉시 작동합니다. 회원 가입, API 키, CLI 도구 설치가 필요 없습니다. 북마크해 두고 알 수 없는 해시를 접할 때마다, 어떤 OS와 기기에서든 사용하십시오.

해시 식별기 활용 사례

보안 감사
침투 테스트 중 유출된 데이터베이스에서 비밀번호 해시 알고리즘을 식별하면 크래킹 방법을 결정할 수 있습니다. MD5와 SHA-1 해시는 취약한 보호를 나타내므로 우선적으로 보완 조치를 취할 수 있습니다.
데이터베이스 마이그레이션
시스템 간에 사용자 레코드를 마이그레이션할 때, 새로운 인증 레이어를 올바르게 구성하려면 저장된 비밀번호 해시 알고리즘을 알아야 합니다. 알고리즘을 잘못 식별하면 모든 로그인이 실패합니다.
DevOps 및 CI/CD
빌드 파이프라인에는 아티팩트 검증을 위한 체크섬이 포함되는 경우가 많습니다. 체크섬이 SHA-256인지 SHA-512인지 식별하면 배포 스크립트에서 올바른 검증 명령을 사용할 수 있습니다.
디지털 포렌식
포렌식 검사관은 파일 무결성 로그, 블록체인 레코드, 증거 메타데이터에서 해시 다이제스트를 접합니다. 알고리즘을 식별하는 것은 증거의 보관 연속성을 검증하기 위한 전제 조건입니다.
API 통합
서드파티 API는 알고리즘을 문서화하지 않은 채 해시 값을 반환하는 경우가 있습니다. 응답에서 해시 유형을 식별하면 웹훅 서명 검증이나 체크섬 유효성 검사를 올바르게 구성할 수 있습니다.
암호학 학습
암호학 과정을 수강하는 학생들은 서로 다른 알고리즘으로 생성된 해시를 붙여넣어 알고리즘 선택, 출력 길이, 보안 속성 간의 관계를 즉시 확인할 수 있습니다.

해시 알고리즘 길이 참조표

아래 표는 각 주요 해시 알고리즘의 출력 크기를 비트, 16진수 문자 수, 원시 바이트로 매핑합니다. 이것은 해시 식별 도구에서 사용하는 기본 조회 표입니다. 여러 알고리즘이 동일한 16진수 길이를 공유하는 경우, 이를 구별하기 위한 추가적인 맥락이 필요합니다.

알고리즘비트16진수 문자 수바이트비고
MD51283216Broken — collisions trivial since 2004
SHA-11604020Deprecated — SHAttered attack (2017)
SHA-2242245628Truncated SHA-256; rarely used standalone
SHA-2562566432Current standard; TLS, Git, Bitcoin
SHA-3843849648Truncated SHA-512; CNSA Suite approved
SHA-51251212864Maximum SHA-2 output; large-data hashing
SHA3-2562566432Keccak-based; NIST alternative to SHA-2
SHA3-51251212864Keccak-based; highest SHA-3 strength
RIPEMD-1601604020Used in Bitcoin address derivation
BLAKE2s2566432Faster than SHA-256; 256-bit output

해시 길이 모호성 해소

일부 16진수 길이는 여러 알고리즘에 해당합니다. 가장 흔한 두 가지 모호한 경우는 64자리 해시(SHA-256 대 SHA3-256)와 40자리 해시(SHA-1 대 RIPEMD-160)입니다. 길이만으로는 충분하지 않을 때 이를 구별하는 방법을 설명합니다.

64개의 16진수 문자: SHA-256 대 SHA3-256
두 알고리즘 모두 256비트(64자리) 다이제스트를 생성합니다. SHA-256은 실제로 압도적으로 더 일반적입니다. Git 커밋, TLS 인증서, 비트코인 블록, 대부분의 API 서명에 SHA-256이 사용됩니다. SHA3-256은 일반적으로 NIST SP 800-185 준수 또는 Keccak 기반 구조를 명시적으로 요구하는 시스템에서만 발견됩니다. 확인하려면 소스 시스템의 문서를 참조하십시오.
40개의 16진수 문자: SHA-1 대 RIPEMD-160
SHA-1은 훨씬 더 널리 사용되는 160비트 해시로, 역사적으로 Git(SHA-256 전환 이전), TLS, 코드 서명에 사용되었습니다. RIPEMD-160은 주로 비트코인 주소 생성(HASH160 = SHA-256에 이어 RIPEMD-160)에서 나타납니다. 해시가 암호화폐 맥락에서 나온 경우 RIPEMD-160을 고려하고, 그렇지 않으면 SHA-1이 유력한 후보입니다.

코드 예제

아래는 네 가지 언어로 작성된 16진수 길이 기반 해시 식별의 실제 구현 예제입니다. 각 함수는 16진수 인코딩을 검증하고, 문자 수를 조회하여 일치하는 모든 알고리즘을 반환합니다.

JavaScript
function identifyHash(hex) {
  const len = hex.length
  const isHex = /^[0-9a-fA-F]+$/.test(hex)
  if (!isHex) return ['Not a hex-encoded hash']

  const map = {
    32:  ['MD5'],
    40:  ['SHA-1', 'RIPEMD-160'],
    56:  ['SHA-224', 'SHA3-224'],
    64:  ['SHA-256', 'SHA3-256', 'BLAKE2s'],
    96:  ['SHA-384', 'SHA3-384'],
    128: ['SHA-512', 'SHA3-512', 'BLAKE2b'],
  }
  return map[len] || [`Unknown (${len} hex chars)`]
}

identifyHash('d41d8cd98f00b204e9800998ecf8427e')
// → ["MD5"]

identifyHash('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855')
// → ["SHA-256", "SHA3-256", "BLAKE2s"]
Python
import re

HASH_LENGTHS = {
    32:  ['MD5'],
    40:  ['SHA-1', 'RIPEMD-160'],
    56:  ['SHA-224', 'SHA3-224'],
    64:  ['SHA-256', 'SHA3-256', 'BLAKE2s'],
    96:  ['SHA-384', 'SHA3-384'],
    128: ['SHA-512', 'SHA3-512', 'BLAKE2b'],
}

def identify_hash(hex_string: str) -> list[str]:
    hex_string = hex_string.strip()
    if not re.fullmatch(r'[0-9a-fA-F]+', hex_string):
        return ['Not a hex-encoded hash']
    return HASH_LENGTHS.get(len(hex_string), [f'Unknown ({len(hex_string)} hex chars)'])

identify_hash('da39a3ee5e6b4b0d3255bfef95601890afd80709')
# → ['SHA-1', 'RIPEMD-160']

identify_hash('a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a')
# → ['SHA-256', 'SHA3-256', 'BLAKE2s']
Go
package main

import (
	"fmt"
	"regexp"
)

var hexPattern = regexp.MustCompile("^[0-9a-fA-F]+$")

var hashLengths = map[int][]string{
	32:  {"MD5"},
	40:  {"SHA-1", "RIPEMD-160"},
	56:  {"SHA-224", "SHA3-224"},
	64:  {"SHA-256", "SHA3-256", "BLAKE2s"},
	96:  {"SHA-384", "SHA3-384"},
	128: {"SHA-512", "SHA3-512", "BLAKE2b"},
}

func identifyHash(hex string) []string {
	if !hexPattern.MatchString(hex) {
		return []string{"Not a hex-encoded hash"}
	}
	if algos, ok := hashLengths[len(hex)]; ok {
		return algos
	}
	return []string{fmt.Sprintf("Unknown (%d hex chars)", len(hex))}
}

func main() {
	fmt.Println(identifyHash("d41d8cd98f00b204e9800998ecf8427e"))
	// → [MD5]
}
CLI (Bash)
#!/bin/bash
# Identify a hash from the command line by character count
hash="$1"

if [[ ! "$hash" =~ ^[0-9a-fA-F]+$ ]]; then
  echo "Not a hex-encoded hash"
  exit 1
fi

len=${#hash}
case $len in
  32)  echo "MD5 (128-bit)" ;;
  40)  echo "SHA-1 or RIPEMD-160 (160-bit)" ;;
  56)  echo "SHA-224 or SHA3-224 (224-bit)" ;;
  64)  echo "SHA-256 or SHA3-256 (256-bit)" ;;
  96)  echo "SHA-384 or SHA3-384 (384-bit)" ;;
  128) echo "SHA-512 or SHA3-512 (512-bit)" ;;
  *)   echo "Unknown hash length: $len chars" ;;
esac

# Usage: ./identify.sh d41d8cd98f00b204e9800998ecf8427e
# → MD5 (128-bit)

자주 묻는 질문

해시 식별은 어떻게 작동합니까?
해시 식별은 주로 16진수로 인코딩된 다이제스트의 길이에 의존합니다. 각 해시 알고리즘은 고정된 수의 출력 비트를 생성합니다. MD5는 128비트(32개의 16진수 문자), SHA-1은 160비트(40개의 16진수 문자), SHA-256은 256비트(64개의 16진수 문자)를 출력하는 식입니다. 식별기는 문자열 길이를 측정하고, 16진수 문자만 포함하는지 확인한 후, 알려진 알고리즘 출력 크기에 매핑합니다.
해시 식별기가 정확한 알고리즘을 확실하게 판별할 수 있습니까?
항상 그런 것은 아닙니다. 여러 알고리즘이 동일한 출력 길이를 가질 수 있습니다. SHA-256과 SHA3-256은 모두 64개의 16진수 문자를 출력합니다. SHA-1과 RIPEMD-160은 모두 40개의 16진수 문자를 출력합니다. 이러한 경우, 도구는 모든 후보를 반환합니다. 단일 알고리즘으로 좁히려면 소스 시스템, 문서, 또는 알고리즘 접두사와 같은 맥락 정보가 필요합니다.
해시가 16진수 대신 Base64로 인코딩된 경우 어떻게 해야 합니까?
Base64로 인코딩된 해시는 다른 문자 집합(A-Z, a-z, 0-9, +, /)을 사용하며, 16진수 표현과 길이가 다릅니다. 256비트 해시는 Base64로 44자이지만 16진수로는 64자입니다. 먼저 Base64 문자열을 원시 바이트로 디코딩한 후 바이트 길이를 확인하십시오. 16바이트 = MD5, 20바이트 = SHA-1, 32바이트 = SHA-256, 48바이트 = SHA-384, 64바이트 = SHA-512.
온라인 식별기에 비밀번호 해시를 붙여넣어도 안전합니까?
이 도구는 브라우저 내에서 완전히 실행되며, 어떤 서버에도 데이터가 전송되지 않습니다. 해시는 장치 외부로 전혀 나가지 않습니다. 공식 감사 중 최대한의 운영 보안을 위해서는 브라우저 개발자 도구의 네트워크 탭을 검사하거나, 페이지 로드 후 오프라인 상태에서 도구를 사용하여 이를 직접 확인할 수 있습니다.
암호학적으로 취약한 MD5가 여전히 사용되는 이유는 무엇입니까?
MD5는 충돌 저항성이 깨졌습니다. 공격자가 동일한 해시를 생성하는 두 개의 서로 다른 입력을 만들 수 있습니다. 그러나 MD5는 비보안 맥락에서 여전히 사용됩니다. 다운로드 검증을 위한 파일 체크섬, 캐시 키, 중복 제거, HTTP의 ETag 등이 해당됩니다. 이러한 목적으로 사용할 때 우발적인 충돌은 천문학적으로 희박하고 의도적인 공격은 우려 사항이 아닙니다. MD5는 비밀번호 해싱, 디지털 서명, 또는 인증서 검증에는 사용해서는 안 됩니다.
bcrypt, scrypt, 또는 Argon2 해시를 어떻게 식별합니까?
bcrypt, scrypt, Argon2와 같은 비밀번호 해싱 함수는 원시 16진수 출력 대신 고유한 문자열 접두사를 사용합니다. bcrypt 해시는 비용 인수가 뒤따르는 '$2a$', '$2b$', 또는 '$2y$'로 시작합니다. Argon2 해시는 '$argon2id$' 또는 '$argon2i$'로 시작합니다. scrypt 해시는 일반적으로 '$scrypt$'로 시작합니다. 이것들은 원시 암호화 다이제스트가 아니므로 길이 기반 식별이 적용되지 않으며, 접두사 자체가 알고리즘을 식별합니다.
SHA-2와 SHA-3의 차이점은 무엇입니까?
SHA-2(SHA-256, SHA-384, SHA-512 포함)는 NSA가 설계하고 FIPS 180-4에서 표준화된 Merkle-Damgard 구조를 기반으로 합니다. SHA-3(SHA3-256, SHA3-384, SHA3-512)은 공개 NIST 공모전을 통해 선정되고 FIPS 202에서 표준화된 Keccak 스펀지 구조를 기반으로 합니다. 두 계열은 동일한 보안 수준에서 동일한 출력 길이를 생성하지만, 근본적으로 다른 내부 구조를 사용합니다. SHA-3은 SHA-2에서 구조적 취약점이 발견될 경우를 대비한 대안으로 설계되었으나, 현재까지 그러한 취약점은 발견되지 않았습니다.