SHA-1 버그 수정 및 크래커 (SHA-1 Bug smash Cracker)
요약
Web Crypto API를 사용하여 브라우저에서 실행되는 SHA-1 비밀번호 크래킹 데모 프로젝트입니다. 인코딩 오류 수정과 루프 최적화를 통해 성능과 정확성을 개선했습니다.
핵심 포인트
- Web Crypto API 기반의 브라우저 내 완전 실행 데모
- UTF-8 인코딩 적용으로 해싱 정확도 및 일관성 확보
- 솔트 적용 시 조기 종료(early exit)를 통한 메모리 및 속도 최적화
- 배치 해싱과 await 양보를 통한 UI 응답성 유지
프로젝트 개요
SHA-1 비밀번호 크래커 (SHA-1 Password Cracker) — 브라우저 데모
상위 비밀번호 목록과 선택적 솔트 (salts)를 사용하여 수정 및 최적화된 SHA-1 비밀번호 크래킹 방식을 보여주는 작고 안전한 데모입니다. 이 데모는 Web Crypto API를 사용하여 브라우저에서 완전히 실행되며, Python 버전에서 구현된 것과 동일한 알고리즘 개선 사항을 제공합니다:
- 솔트 미사용 (Unsalted): 해시(hash) → 비밀번호 맵을 미리 계산하여 상수 시간(constant-time) 조회를 수행합니다.
- 솔트 사용 (Salted): 솔트를 외부 루프(outer loop)로, 비밀번호를 내부 루프(inner loop)로 반복하며, 메모리에 전체 곱집합(cross-product)을 생성하지 않도록 조기 종료(early exit)를 적용합니다.
- 사용자 정의
top-10000-passwords.txt및known-salts.txt를 로드하거나, 빠른 테스트를 위해 내장된 샘플 목록을 사용할 수 있는 친숙한 UI를 제공합니다.
버그 수정 또는 성능 개선
해결된 문제
- 일관되지 않은 인코딩(encoding)과 반복적인 해싱(hashing)으로 인해 잘못된 비교가 발생하고 CPU 사이클이 낭비되었습니다.
- 모든 솔트×비밀번호 조합을 실체화(materialized)하는 단순한 솔트 적용 방식은 과도한 메모리를 사용하고 속도가 느렸습니다.
수정 및 최적화 사항
- 정확성 (Correctness): 해싱 전 항상 문자열을 UTF-8 바이트로 인코딩하여 다이제스트(digest)가 서버 측 또는 다른 언어의 구현과 일치하도록 합니다.
- 성능 (Unsalted): 단일
hash -> password맵을 한 번 구축하고 각 쿼리에 대해 O(1) 조회를 사용합니다. - 성능 (Salted): 전체 곱집합을 구축하는 것을 피합니다. 솔트를 외부 루프, 비밀번호를 내부 루프로 반복하며, 솔트가 적용된 해시를 즉석에서 계산하고 일치하는 경우 즉시 반환합니다.
- 응답성 (Responsiveness): 과도한 작업 중에도 UI의 응답성을 유지하기 위해 배치 해싱(Batch hashing)과
await양보(yields)를 사용합니다.
코드
생성된 파일
index.html— UI 및 구조style.css— 스타일링 및 레이아웃script.js— 핵심 로직, 해싱, 캐싱 및 UI 연결
주요 구현 발췌
- 솔트 미사용 맵 빌더 (JS) — SHA-1 16진수(hex) → 비밀번호를 미리 계산합니다:
async function buildUnsaltedMap(passwords, progressCallback) {
const map = Object.create(null);
const batch = 256;
...
- 조기 종료를 포함한 솔트 사용 검색 (JS):
async function saltedSearch(target, passwords, salts, progressCallback) {
for (let s = 0; s < salts.length; s++) {
const saltBytes = new TextEncoder().encode(salts[s]);
...
전체 파일이 필요하다면, 이 제출물을 위해 생성된 세 가지 아티팩트인 index.html, style.css, script.js를 확인하세요 (전체 내용이 생성되었으며 정적 사이트에 바로 사용할 수 있는 상태입니다).
나의 개선 사항 (기술적 접근 방식)
-
결정론적 인코딩 (Deterministic encoding)
해싱(hashing) 전에는 항상
TextEncoder/ UTF-8을 사용합니다. 이는 환경과 언어 간의 불일치를 방지합니다. -
메모리 대 속도 트레이드오프 (Memory vs. speed tradeoffs)
- 솔트가 없는(unsalted) 크래킹의 경우, 단일
hash -> password맵을 사용하는 것이 가장 빠른 접근 방식이며 O(N) 메모리(N = 비밀번호 수)를 사용합니다. 이는 반복적인 조회를 수행할 때 이상적입니다. - 솔트가 있는(salted) 크래킹의 경우, 전체
salt × password맵을 구축하는 것은 O(S×N) 메모리를 소모하며 불필요합니다. 솔트를 외부 루프(outer loop)로, 비밀번호를 내부 루프(inner loop)로 반복(iterating)하면 메모리 사용량을 낮게 유지하면서 일치 시 조기 종료(early exit)가 가능합니다.
- 솔트가 없는(unsalted) 크래킹의 경우, 단일
-
UI 응답성 (UI responsiveness)
- 해싱은 배치(batched) 단위로 처리되며,
await를 통한 양보(yields)를 사용하여 브라우저 이벤트 루프가 UI를 업데이트하고 응답성을 유지할 수 있도록 합니다. - 진행 상황 업데이트는 맵 구축과 솔트 검색 과정 모두에서 보고됩니다.
- 해싱은 배치(batched) 단위로 처리되며,
-
견고한 파일 처리 (Robust file handling)
- 업로드된 파일은 공백을 제거한(trimmed) 비어 있지 않은 라인으로 파싱됩니다.
- 파일이 제공되지 않을 경우 데모는 작은 샘플 리스트를 기본값으로 사용합니다.
-
캐싱 (Caching)
- 반복적인 쿼리 속도를 높이기 위해 솔트가 없는 맵과 로드된 리스트는 세션 동안 메모리에 캐싱됩니다. "캐시 삭제(Clear cache)" 버튼이 제공됩니다.
Sentry의 최적 활용
이 제출물은 주로 집중적인 버그 수정 및 최적화 데모이며, 프로덕션 백엔드를 포함하고 있지 않습니다. 만약 이를 더 큰 애플리케이션에 통합한다면, 신뢰성과 관찰 가능성(observability)을 향상시키기 위해 Sentry를 다음과 같이 사용할 수 있습니다:
- 에러 모니터링 (Error Monitoring): 클라이언트로부터 발생하는 예외(예: 파일 파싱 에러, Web Crypto 실패)를 캡처하고, 스택 트레이스 (stack trace)별로 그룹화하여 수정 우선순위를 정합니다.
- 세션 리플레이 (Session Replay): 에러가 발생하는 사용자 세션을 기록하여 실패를 유발한 UI 상태(파일 형식, 대규모 리스트 또는 느린 기기 등)를 재현합니다.
- 성능 모니터링 / 트레이싱 (Performance Monitoring / Tracing): 무거운 작업(맵 빌드, 솔트 적용 검색)에 계측 (instrumentation)을 수행하여 CPU 시간을 측정하고, 느린 기기나 병리적인 입력 (pathological inputs)을 식별합니다.
- 로그 (Logs): 장시간 실행되는 작업(진행률 퍼센트, 배치 지속 시간)에 대해 구조화된 로그를 첨부하여 트레이스 (traces) 및 에러와 상관관계를 분석합니다.
Sentry 통합 코드 스니펫 예시 (개념적, 클라이언트 측):
Sentry.init({ dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0' });
Sentry.captureMessage('Started unsalted map build', { level: 'info', extra: { passwordCount: N } });
Google AI의 최적 활용
이 프로젝트의 핵심 수정 사항을 구현하는 데 생성형 AI (generative AI)가 필요하지는 않았습니다. 하지만 Google AI 도구들은 다음과 같은 용도로 사용될 수 있습니다:
- 자동 테스트 생성 (Automated test generation): 솔트 적용/미적용 조합에 대한 엣지 케이스 (edge-case) 테스트 입력을 생성합니다.
- 성능 분석 (Performance analysis): AI를 사용하여 프로파일링 트레이스 (profiling traces)를 분석하고, 다양한 기기 클래스에 적합한 배치 크기나 병렬성 (concurrency) 전략을 권장합니다.
- 문서화 (Documentation): 해싱 (hashing)과 솔트 (salts)에 대해 배우는 학생들을 위해 명확하고 접근하기 쉬운 설명과 대화형 튜토리얼을 제작합니다.
맺음말
- 윤리 및 안전 (Ethics & safety): 이 데모는 교육용입니다. 이는 왜 취약한 비밀번호 선택과 솔트가 없는 해시 (unsalted hashes)가 보안에 취약한지를 보여줍니다. 승인되지 않은 접근이나 악의적인 활동에 이 도구를 사용하지 마십시오.
- 다음 단계 (Next steps): 원하신다면 다음과 같은 작업을 수행할 수 있습니다:
- Python 구현에 대한 작은 PR 스타일의 diff 제공.
- 솔트 미적용 맵을 위한 캐싱 지속성 (예: IndexedDB) 추가.
- 크래킹 시도에 대한 다운로드 가능한 보고서 추가 (로컬 전용, 클라이언트 측).
Summer Bug Smash에 참여해 주셔서 감사합니다. 이번 제출물은 명확하고 테스트 가능한 데모와 함께, 작지만 영향력이 큰 정확성(correctness) 및 성능(performance) 개선에 집중하고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기