BZIP2 압축파일 (.bz2)
Bzip2 표준Bzip2(BZ2)는 Julian Seward가 개발한 고전적인 특허 없는 Unix 압축 유틸리티 및 파일 형식으로, Burrows-Wheeler 변환을 활용하여 고전적인 Gzip보다 훨씬 더 높은 압축률을 달성합니다.
검사 및 메타데이터
운영 체제와 파일 분석기는 파일 선두의 바이너리 바이트 시퀀스를 검사하여 BZ2 파일을 식별합니다:
바이트 단위 헤더 시그니처 (매직 바이트)
운영 체제와 파일 분석기는 파일 선두의 바이너리 바이트 시퀀스를 검사하여 BZ2 파일을 식별합니다:
16진수 시그니처 (오프셋 0):
42 5A 68ASCII 표현: BZh
표준화: Bzip2 Open Source Standard
기술 사양
| 컨테이너 아키텍처 | 스트림 헤더(“BZh”와 블록 크기 숫자 1~9), 압축 데이터 블록 및 32비트 CRC로 구성 |
| 압축 | Burrows-Wheeler 변환(BWT), Move-to-Front 변환(MTF) 및 허프만 코딩 |
| 바이트 엔디안 | 빅 엔디안 비트스트림 프레이밍 |
| 색 공간 | 해당 없음(바이트 압축 스트림) |
| 채널 및 구조 | 단일 파일의 압축 바이트 스트림 |
| 최대 크기 | 길이 제한 없는 스트림(임의 크기의 파일 지원) |
| 투명도 | 데이터를 비트 단위로 정확하게 보존하는 100% 무손실 압축 |
| 스트리밍 및 프로그레시브 | 블록별 독립 32비트 CRC 체크섬을 사용하는 순차 블록 스트리밍 |
기술 비교 매트릭스: BZ2 대 경쟁사
| 기술적 속성 | BZ2 (현재) | GZ | XZ | ZSTD |
|---|---|---|---|---|
| 코어 알고리즘 | Burrows-Wheeler 변환(BWT) | Deflate (LZ77 + 허프만) | LZMA / LZMA2 | 유한 상태 엔트로피 + LZ77 |
| Gzip 대비 압축률 | Gzip보다 10~20% 작음 | 기본 표준 | Gzip보다 20~30% 작음 | Gzip보다 10~20% 작음 |
| 압축 해제 속도 | 느림(약 30-50 MB/s) | 빠름(약 300 MB/s) | 보통(약 100 MB/s) | 매우 빠름(1.5 GB/s 초과) |
| 블록 체크섬 | 블록당 32비트 CRC | 단일 스트림 CRC32 | 스트림 CRC64 | 스트림 xxHash64 |
일반적인 손상 모드 및 헥스 복구 가이드
'bzip2: Data integrity error when decompressing' 오류와 함께 추출이 중단됩니다.
근본 원인: 압축 블록의 비트가 뒤집혀 BWT 역변환 행렬이 CRC32 검증에 실패했습니다.
복구: bzip2recover 유틸리티를 사용해 손상된 섹터 주변의 정상 블록을 복구하십시오.
보안 분석 및 파서 공격 벡터
Bzip2 구현에는 과거에 정수 오버플로 결함이 발생했던 복잡한 비트스트림 정렬 및 허프만 테이블 구문 분석이 포함됩니다.
알려진 공격 벡터
- BWT 정렬 배열 할당에서의 정수 오버플로 (예: CVE-2016-3189).
- 허프만 디코딩 테이블 어셈블리 중 범위를 벗어난 쓰기(Out-of-bounds write).
- 최악의 경우 이차(quadratic) BWT 정렬 시간을 유발하는 병리학적 입력 패턴을 통한 서비스 거부(DoS) 공격.
방어적 모범 사례: 강제 적용된 메모리 경계가 있는 메모리 안전 WASM 디코더를 사용하여 BZ2 파일을 디코딩하십시오.
역사적 배경 및 주요 이력
주요 장점
- 소스 코드 아카이브(tarball), 시스템 로그 및 텍스트 데이터베이스에서 기존 Gzip보다 일관되게 10~20% 높은 압축률을 보입니다.
- 독립적인 블록 아키텍처(100k~900k)는 강력한 무결성 검사를 위해 블록별 32비트 CRC 체크섬을 포함합니다.
- 많은 Linux, BSD, macOS 명령줄 배포판에서 기본 제공되며, 포함 여부는 배포판마다 다릅니다.
기술적 제한 사항 및 단점
- Zstandard와 같은 최신 알고리즘에 비해 압축 및 압축 해제 속도가 눈에 띄게 느립니다.
- 여러 파일이나 디렉터리를 묶으려면 단일 파일만 압축하는 bzip2를 TAR(.tar.bz2)와 함께 사용해야 합니다.
- Gzip이나 Zstd에 비해 압축 해제 시 CPU 사용량이 더 높습니다.
흥미로운 기술적 상식
- 'BZh' 매직 바이트는 'Burrows-Wheeler Zip Huffman'을 의미하며, 그 뒤에 백 킬로바이트 단위의 블록 크기를 나타내는 숫자('1'에서 '9')가 옵니다(예: 'BZh9' = 900 KB).
- Linux 커널 소스 코드는 .xz로 마이그레이션하기 전 10년 넘게 .tar.bz2 형식으로만 배포되었습니다.
- Burrows-Wheeler 변환은 데이터를 직접 압축하지 않고 문자의 순서를 치환하여 동일한 글자끼리 뭉치게 하므로, 허프만 코딩을 통해 쉽게 압축할 수 있게 됩니다.
자주 묻는 기술 질문
.gz와 .bz2는 어떻게 다릅니까?
.bz2는 버로즈-휠러 변환(Burrows-Wheeler transform)을 사용하여 .gz보다 더 작은 파일 크기를 구현하지만, 압축 및 압축 해제에 더 오랜 시간이 걸립니다.
bzip2에 bzip2recover 명령이 있는 이유는 무엇입니까?
bzip2는 데이터를 각각 고유한 CRC가 포함된 독립적인 900 KB 블록으로 압축하므로, 파일의 일부가 손상되더라도 bzip2recover를 통해 손상되지 않은 블록을 추출할 수 있습니다.
.tar.bz2 파일을 어떻게 추출할 수 있습니까?
명령줄 도구를 실행할 필요 없이, 웹 브라우저에서 File2File.app을 사용하여 .tar.bz2 파일을 직접 압축 해제할 수 있습니다.