업데이트로 돌아가기
New releaseAug 20, 2026

BLAKE3 v1.8.7

PRF, MAC, KDF 및 XOF 모드를 지원하는 빠른 암호화 해시 함수입니다. Merkle 트리 구조를 통해 검증된 스트리밍, 증분 업데이트 및 병렬 해싱을 지원합니다.

공유

BLAKE3

BLAKE3는 다음과 같은 특징을 가진 암호학적 해시 함수입니다:

  • MD5, SHA-1, SHA-2, SHA-3 및 BLAKE2보다 훨씬 빠름.
  • MD5 및 SHA-1과 달리 안전함. 또한 SHA-2와 달리 길이 확장 공격에 안전함.
  • 내부적으로 Merkle 트리 구조이기 때문에 모든 스레드와 SIMD 레인에서 고도로 병렬화 가능.
  • 다시 Merkle 트리이기 때문에 검증된 스트리밍증분 업데이트 가능.
  • 일반 해시 함수뿐만 아니라 PRF, MAC, KDF 및 XOF로도 사용 가능.
  • 변형이 없는 단일 알고리즘으로, x86-64와 더 작은 아키텍처에서도 빠름.

아래 차트는 2019년 Cascade Lake-SP 8275CL 서버 CPU에서 16KiB 입력에 대한 예시 벤치마크입니다. 더 자세한 벤치마크는 BLAKE3 논문을 참조하세요.

성능 그래프

BLAKE3는 기존 해시 함수 BLAKE2의 최적화된 인스턴스와 원래 Bao 트리 모드를 기반으로 합니다. 사양 및 설계 근거는 BLAKE3 논문에서 확인할 수 있습니다. 기본 출력 크기는 256비트입니다. Bao의 현재 버전은 BLAKE3로 검증된 스트리밍을 구현합니다.

이 저장소는 BLAKE3의 공식 구현입니다. 포함 내용:

  • SSE2, SSE4.1, AVX2, AVX-512, NEON 및 WASM에 최적화된 구현과 x86에서 자동 런타임 CPU 기능 감지를 포함하는 blake3 Rust 크레이트. rayon 기능은 멀티스레딩을 제공합니다.

  • 명령줄 인터페이스를 제공하는 b3sum Rust 크레이트. 기본적으로 멀티스레딩을 사용하며, 일반 데스크톱 하드웨어에서 sha256sum보다 한 자릿수 더 빠릅니다.

  • Rust 구현과 마찬가지로 SIMD 최적화(WASM 제외), x86에서 CPU 기능 감지, 선택적 멀티스레딩을 포함하는 C 구현. c/README.md를 참조하세요.

  • BLAKE3 논문의 섹션 5.1에서 논의된 Rust 참조 구현. 이 구현은 위의 최적화된 구현보다 훨씬 작고 간단합니다. BLAKE3의 작동 방식을 이해하거나 멀티스레딩이나 SIMD 최적화가 필요하지 않은 포팅을 작성하는 경우 여기서 시작하세요. 참조 구현의 다른 언어 포트는 별도의 저장소에서 호스팅됩니다 (C, Python).

  • 확장 출력, 세 가지 모드 모두, 다양한 입력 길이를 다루는 테스트 벡터 세트.

  • Actions Status

BLAKE3는 다음 사람들이 설계했습니다:

BLAKE3의 개발은 Electric Coin Company의 후원을 받았습니다.

BLAKE3는 Community Cryptography Specification Project (C2SP)에서도 명세되어 있습니다.

참고: BLAKE3는 암호 해싱 알고리즘이 아닙니다. 빠르게 설계되었기 때문이며, 암호 해싱은 느려야 합니다. 해시 저장을 위해 비밀번호를 해싱하거나 비밀번호에서 키를 파생하는 경우 Argon2를 권장합니다.

사용법

b3sum 유틸리티

b3sum 명령줄 유틸리티는 파일 또는 표준 입력의 BLAKE3 해시를 출력합니다. 미리 빌드된 바이너리는 릴리스 페이지에서 Linux, Windows 및 macOS(미확인 개발자 우회 필요](https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unidentified-developer-mh40616/mac))에서 사용할 수 있습니다. Rust 및 Cargo를 설치했다면, b3sum을 직접 빌드할 수도 있습니다:

cargo install b3sum

rustupPATH를 자동으로 구성하지 않은 경우, 설치된 바이너리를 ~/.cargo/bin 등에서 찾아야 할 수도 있습니다. 다음 예시와 같이 큰 파일을 만들고 해싱하여 BLAKE3의 속도를 테스트할 수 있습니다:

# 1 GB 파일 생성.
head -c 1000000000 /dev/zero > /tmp/bigfile
# SHA-256으로 해싱.
time openssl sha256 /tmp/bigfile
# BLAKE3로 해싱.
time b3sum /tmp/bigfile

blake3 크레이트 docs.rs

Rust 코드에서 BLAKE3를 사용하려면 Cargo.tomlblake3 크레이트 종속성을 추가하세요. 다음은 일부 입력 바이트를 해싱하는 예시입니다:

// 한 번에 전체 입력 해싱.
let hash1 = blake3::hash(b"foobarbaz");

// 입력을 증분 방식으로 해싱.
let mut hasher = blake3::Hasher::new();
hasher.update(b"foo");
hasher.update(b"bar");
hasher.update(b"baz");
let hash2 = hasher.finalize();
assert_eq!(hash1, hash2);

// 확장 출력. OutputReader는 Read 및 Seek도 구현합니다.
let mut output = [0; 1000];
let mut output_reader = hasher.finalize_xof();
output_reader.fill(&mut output);
assert_eq!(hash1, output[..32]);

// 해시를 16진수로 출력.
println!("{}", hash1);

hash 외에도 BLAKE3는 keyed_hashderive_key 두 가지 모드를 제공합니다. keyed_hash 모드는 256비트 키를 사용합니다:

// 한 번에 전체 입력에 대한 MAC.
let example_key = [42u8; 32];
let mac1 = blake3::keyed_hash(&example_key, b"example input");

// 증분 방식으로 MAC.
let mut hasher = blake3::Hasher::new_keyed(&example_key);
hasher.update(b"example input");
let mac2 = hasher.finalize();
assert_eq!(mac1, mac2);

derive_key 모드는 컨텍스트 문자열과 일부 키 자료(비밀번호가 아님)를 사용합니다. 컨텍스트 문자열은 하드코딩되어야 하며, 전역적으로 고유하고 애플리케이션별로 지정되어야 합니다. 컨텍스트 문자열의 좋은 기본 형식은 "[application] [commit timestamp] [purpose]"입니다:

// 다른 목적을 위한 서브키 파생.
const EMAIL_CONTEXT: &str = "BLAKE3 example 2020-01-07 17:10:44 email key";
const API_CONTEXT: &str = "BLAKE3 example 2020-01-07 17:11:21 API key";
let input_key_material = b"usually at least 32 random bytes, not a password";
let email_key = blake3::derive_key(EMAIL_CONTEXT, input_key_material);
let api_key = blake3::derive_key(API_CONTEXT, input_key_material);
assert_ne!(email_key, api_key);

C 구현

c/README.md를 참조하세요.

기타 구현

모든 구현을 추적하기에는 너무 많지만, 몇 가지 주요 구현으로는 최적화된 Go 구현, Node.js 및 브라우저용 Wasm 바인딩, Python용 바이너리 휠, .NET 바인딩, 순수 Java 구현 등이 있습니다.

기여

CONTRIBUTING.md를 참조하세요.

라이선스

이 작업은 CC0 1.0에 따라 퍼블릭 도메인으로 공개됩니다. 또는 다음 라이선스 중 하나에 따라 사용할 수 있습니다:

채택 및 배포

기타

  • @veorq@oconnor663은 Cryptography FM과의 인터뷰를 진행했습니다.
  • @oconnor663은 Saito와의 인터뷰를 진행했습니다.

카테고리