Trình tạo Hash SHA-1
Tạo hash SHA-1 từ bất kỳ văn bản nào
Văn bản nhập
Hash SHA-1
Hash SHA-1 sẽ xuất hiện ở đây…
SHA-1 Hashing Là Gì?
SHA-1 (Secure Hash Algorithm 1) là một hàm băm mật mã tạo ra giá trị băm cố định 160-bit (20 byte) từ bất kỳ đầu vào nào. Được NSA công bố và NIST chuẩn hóa vào năm 1995 theo FIPS PUB 180-1, sau đó được ghi lại trong RFC 3174, SHA-1 được thiết kế là người kế nhiệm mạnh mẽ hơn của SHA-0 và MD5. Thuật toán xử lý đầu vào theo từng khối 512-bit qua 80 vòng phép toán bitwise, tạo ra dấu vân tay thập lục phân 40 ký tự — nền tảng của SSL/TLS, PGP, SSH và IPsec trong hơn một thập kỷ.
Như mọi hàm băm mật mã, SHA-1 là phép biến đổi một chiều: tính toán giá trị băm từ đầu vào rất nhanh, nhưng khôi phục đầu vào từ giá trị băm là không khả thi về mặt tính toán. Thay đổi một bit trong đầu vào tạo ra giá trị băm 160-bit hoàn toàn khác — đặc tính này gọi là hiệu ứng thác đổ. SHA-1 ánh xạ không gian đầu vào tùy ý lớn vào đầu ra 160-bit cố định, điều này có nghĩa là va chạm (hai đầu vào khác nhau tạo ra cùng giá trị băm) phải tồn tại về mặt toán học. Yêu cầu bảo mật của một hàm băm là việc tìm ra các va chạm như vậy cần khoảng 2^80 phép tính — bằng một nửa độ dài bit đầu ra.
Năm 2017, Google và CWI Amsterdam công bố cuộc tấn công SHAttered, chứng minh va chạm SHA-1 thực tế đầu tiên bằng cách tạo ra hai tệp PDF khác nhau có cùng giá trị băm. Cuộc tấn công yêu cầu khoảng 2^63.1 phép tính SHA-1 — thấp hơn nhiều so với ngưỡng lý thuyết 2^80. Năm 2020, Gaetan Leurent và Thomas Peyrin tiếp tục giảm chi phí với cuộc tấn công va chạm tiền tố được chọn chỉ cần khoảng 2^63.4 phép tính. Kết quả là, tất cả các trình duyệt lớn, tổ chức chứng nhận và cơ quan tiêu chuẩn đã loại bỏ SHA-1 cho chữ ký số và chứng chỉ TLS. Tuy nhiên, SHA-1 vẫn được sử dụng tích cực cho các mục đích phi bảo mật: ID đối tượng Git (dù Git đang chuyển sang SHA-256), các cấu trúc HMAC cũ, và kiểm tra tính toàn vẹn tệp khi khả năng chống va chạm từ đối thủ không được yêu cầu.
Tại Sao Dùng Công Cụ Tạo SHA-1 Này?
Tạo giá trị băm SHA-1 ngay lập tức mà không cần cài đặt gì hay viết code. Dán văn bản của bạn và nhận giá trị băm hex 40 ký tự theo thời gian thực — hữu ích để xác minh checksum cũ, gỡ lỗi nội bộ Git, hoặc kiểm tra quy trình dựa trên băm.
Các Trường Hợp Sử Dụng SHA-1
SHA-1 So Với Các Thuật Toán Băm Khác
SHA-1 tạo ra giá trị băm 160-bit — dài hơn MD5 (128 bit) nhưng ngắn hơn đáng kể so với các thuật toán trong họ SHA-2. Bảng dưới đây so sánh kích thước giá trị băm, tiêu chuẩn và các trường hợp sử dụng phù hợp cho từng thuật toán.
| Thuật Toán | Kích Thước Giá Trị Băm | Độ Dài Hex | Tiêu Chuẩn | Phù Hợp Nhất Cho |
|---|---|---|---|---|
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Deprecated — legacy git commits, old TLS |
| SHA-256 | 256 bits | 64 hex chars | 2001 / FIPS 180-4 | TLS certificates, blockchain, JWTs |
| SHA-384 | 384 bits | 96 hex chars | 2001 / FIPS 180-4 | Government systems, higher security margin |
| SHA-512 | 512 bits | 128 hex chars | 2001 / FIPS 180-4 | Digital signatures, HMAC with large keys |
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums only — broken since 2004 |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, alternative to SHA-2 |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-performance checksums, Merkle trees |
SHA-1 Hoạt Động Như Thế Nào?
SHA-1 tuân theo cấu trúc Merkle-Damgard: thông điệp được đệm, chia thành các khối 512-bit, và mỗi khối được xử lý qua 80 vòng phép toán bitwise trộn đầu vào với lịch trình thông điệp được rút ra từ khối. Năm từ trạng thái 32-bit (H0 đến H4) mang trạng thái băm đang chạy, và việc nối các từ này lại tạo ra giá trị băm 160-bit cuối cùng.
SHA-1: 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
(160 bits = 20 bytes = 40 hex characters)
| Bước | Mô Tả |
|---|---|
| Padding | Append a 1-bit, then zeros, until message length is 448 mod 512. Append the original length as a 64-bit big-endian integer. |
| Block splitting | Divide the padded message into 512-bit (64-byte) blocks. |
| Expansion | Expand each 16-word block into 80 words using a left-rotate-by-1 XOR feedback schedule. |
| Compression | Process 80 rounds per block using four nonlinear functions (Ch, Parity, Maj, Parity) across rounds 0-19, 20-39, 40-59, and 60-79. |
| Output | Concatenate the five 32-bit state words (H0-H4) into a 160-bit (20-byte) digest, rendered as 40 hexadecimal characters. |
Sự khác biệt chính giữa SHA-1 và MD5 là số lượng từ trạng thái (5 so với 4), số vòng mỗi khối (80 so với 64), và việc sử dụng lịch trình thông điệp với phản hồi xoay trái. Những khác biệt này cho SHA-1 đầu ra lớn hơn (160 so với 128 bit) và ban đầu cung cấp biên độ bảo mật cao hơn, mặc dù cả hai thuật toán hiện được coi là đã bị phá vỡ về khả năng chống va chạm.
Ví Dụ Code
Cách tạo giá trị băm SHA-1 trong các ngôn ngữ và môi trường phổ biến. Khác với MD5, SHA-1 có sẵn trong Web Crypto API của trình duyệt, cho phép sử dụng mà không cần thư viện bên ngoài trong cả trình duyệt và môi trường Node.js.
// SHA-1 is available in the Web Crypto API
async function sha1(text) {
const data = new TextEncoder().encode(text)
const hashBuffer = await crypto.subtle.digest('SHA-1', data)
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
await sha1('hello world')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha1').update('hello world').digest('hex')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"import hashlib
# Basic SHA-1 hash
result = hashlib.sha1(b'hello world').hexdigest()
print(result) # → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a string (encode to bytes first)
text = 'hello world'
hashlib.sha1(text.encode('utf-8')).hexdigest()
# → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a file in chunks
with open('file.bin', 'rb') as f:
sha1 = hashlib.sha1()
for chunk in iter(lambda: f.read(8192), b''):
sha1.update(chunk)
print(sha1.hexdigest())package main
import (
"crypto/sha1"
"fmt"
)
func main() {
data := []byte("hello world")
hash := sha1.Sum(data)
fmt.Printf("%x\n", hash)
// → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
}# Using sha1sum (Linux) or shasum (macOS) echo -n "hello world" | sha1sum # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # macOS echo -n "hello world" | shasum -a 1 # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # Hash a file sha1sum package.json # → a1b2c3d4e5f6... package.json # Using openssl (cross-platform) echo -n "hello world" | openssl sha1 # → SHA1(stdin)= 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed