Nền tảng mật mã học hiện đại — từ blockchain đến chứng chỉ SSL, SHA-256 bảo vệ dữ liệu của bạn với độ an toàn 256-bit không thể bẻ gãy.
Một hàm băm mật mã học được thiết kế bởi NSA, thuộc họ SHA-2
SHA-256 (Secure Hash Algorithm 256-bit) là một hàm băm mật mã học được phát triển bởi NSA và công bố năm 2001. Đây là thành viên của họ thuật toán SHA-2, được thiết kế để thay thế SHA-1.
Thuật toán nhận đầu vào là bất kỳ dữ liệu nào và tạo ra một chuỗi 64 ký tự hexadecimal (256 bit) — gọi là hash hay digest. Kết quả này có tính duy nhất cao và không thể đảo ngược.
✦ Thay đổi 1 ký tự → Hash hoàn toàn khác
Chỉ thay đổi một ký tự nhỏ → toàn bộ hash thay đổi hoàn toàn
Quy trình xử lý từng bước của thuật toán
Dữ liệu đầu vào được đệm (padding) để có độ dài là bội số của 512 bit. Thêm bit '1', sau đó các bit '0', và cuối cùng là 64-bit biểu diễn độ dài ban đầu.
Thông điệp được chia thành các khối 512-bit. Mỗi khối gồm 16 từ 32-bit (W₀–W₁₅), sau đó mở rộng thành 64 từ.
SHA-256 dùng 8 giá trị hash ban đầu (H₀–H₇) lấy từ phần thập phân của căn bậc hai các số nguyên tố.
Mỗi vòng thực hiện các phép toán bitwise AND, OR, XOR, dịch bit vòng, phép cộng modulo 2³² và hàm Ch, Maj.
Sau 64 vòng, kết quả cộng với giá trị ban đầu (modulo 2³²). Lặp lại cho mọi khối 512-bit.
Ghép nối H₀ ∥ H₁ ∥ … ∥ H₇ tạo thành hash 256-bit (64 ký tự hex) — duy nhất, cố định và không thể đảo ngược.
Những đặc điểm làm cho SHA-256 trở nên an toàn và đáng tin cậy
Cùng một đầu vào luôn cho ra cùng một hash. Không có yếu tố ngẫu nhiên.
Biết hash, không thể tìm ngược lại dữ liệu gốc. Độ khó tìm tiền ảnh: ~2²⁵⁶ phép tính.
Cực kỳ khó để tìm hai đầu vào khác nhau có cùng hash.
Thay đổi 1 bit đầu vào làm thay đổi ~50% số bit trong hash đầu ra.
Dù đầu vào là 1 byte hay 1 TB, đầu ra luôn là 256 bit (64 ký tự hex).
Thuật toán này bảo vệ bạn mỗi ngày theo nhiều cách
Bitcoin dùng SHA-256 hai lần (double SHA-256) để tạo địa chỉ ví, xác minh giao dịch và trong Proof-of-Work. Mỗi block header được băm để tạo liên kết chuỗi.
Mọi kết nối HTTPS đều dùng SHA-256 để ký chứng chỉ số. Trình duyệt xác minh website là thật thông qua chuỗi chứng chỉ được ký bằng SHA-256.
Hệ thống lưu hash của mật khẩu kết hợp salt thay vì lưu mật khẩu gốc. Khi đăng nhập, hệ thống so sánh hash — không lộ mật khẩu.
Khi tải phần mềm, website cung cấp SHA-256 checksum. Tính hash file sau khi tải và so sánh — nếu khớp, file không bị thay đổi hay nhiễm malware.
Git dùng SHA để nhận dạng mọi commit, file và object. Mỗi commit ID là hash của toàn bộ lịch sử, đảm bảo lịch sử không thể giả mạo.
RSA và ECDSA kết hợp SHA-256 để tạo chữ ký số. Tài liệu được hash trước, sau đó hash được ký bằng khóa riêng tư và xác minh bằng khóa công khai.
Thư viện chính thức & phổ biến nhất cho từng ngôn ngữ, kèm link GitHub
Module hashlib tích hợp sẵn — không cần cài thêm thư viện.
import hashlib
h = hashlib.sha256(b'hello').hexdigest()
print(h)
Dùng crypto module (Node) hoặc SubtleCrypto (Browser). Thư viện js-sha256 phổ biến cho cả hai môi trường.
const { createHash } = require('crypto');
const hash = createHash('sha256')
.update('hello').digest('hex');
console.log(hash);
java.security.MessageDigest tích hợp sẵn trong JDK. Bouncy Castle cung cấp thêm các thuật toán nâng cao.
MessageDigest md =
MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(
"hello".getBytes());
Package crypto/sha256 là một phần của thư viện chuẩn Go, hiệu năng cao và không cần import bên ngoài.
import "crypto/sha256"
h := sha256.Sum256([]byte("hello"))
fmt.Printf("%x\n", h)
Crate sha2 (RustCrypto) là lựa chọn phổ biến nhất. ring cung cấp hiệu năng vượt trội cho production.
use sha2::{Sha256, Digest};
let hash = Sha256::digest(b"hello");
println!("{:x}", hash);
OpenSSL EVP là tiêu chuẩn công nghiệp. mbedTLS phù hợp cho embedded systems. picosha2 là header-only nhẹ nhàng.
#include <openssl/sha.h>
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256((unsigned char*)"hello",
5, hash);
Hàm hash() tích hợp sẵn trong PHP. Thư viện paragonie/sodium_compat cung cấp thêm các tính năng mật mã nâng cao.
<?php
$hash = hash('sha256', 'hello');
echo $hash;
Module Digest::SHA256 tích hợp sẵn. Gem openssl cung cấp thêm các phương thức HMAC và signing.
require 'digest'
hash = Digest::SHA256.hexdigest('hello')
puts hash
Apple CryptoKit (iOS 13+, macOS 10.15+) cung cấp SHA-256 tích hợp sẵn. swift-crypto hỗ trợ Linux.
import CryptoKit
let data = Data("hello".utf8)
let hash = SHA256.hash(data: data)
print(hash.description)
Kế thừa Java MessageDigest. Thư viện kotlinx-crypto (Multiplatform) hỗ trợ Android, iOS, JS và Native.
val hash = MessageDigest
.getInstance("SHA-256")
.digest("hello".toByteArray())
.joinToString("") { "%02x".format(it) }
noble-hashes (zero-dep, audited) là lựa chọn hiện đại nhất. crypto-js vẫn phổ biến trong các dự án cũ.
import { sha256 } from '@noble/hashes/sha256';
import { bytesToHex } from '@noble/hashes/utils';
const hash = bytesToHex(sha256('hello'));
System.Security.Cryptography.SHA256 tích hợp sẵn trong .NET. Bouncy Castle C# cung cấp thêm tính năng nâng cao.
using System.Security.Cryptography;
var hash = SHA256.HashData(
Encoding.UTF8.GetBytes("hello"));
Console.WriteLine(
Convert.ToHexString(hash));
Tại sao SHA-256 là lựa chọn hàng đầu?
| Thuật toán | Đầu ra | Tốc độ | Bảo mật | Tình trạng |
|---|---|---|---|---|
| MD5 | 128 bit | ⚡⚡⚡ Rất nhanh | ❌ Đã bị bẻ gãy | Lỗi thời |
| SHA-1 | 160 bit | ⚡⚡ Nhanh | ⚠️ Va chạm thực tế | Không khuyến nghị |
| SHA-256 ✦ | 256 bit | ⚡ Tốt | ✅ An toàn cao | Khuyến nghị |
| SHA-512 | 512 bit | ⚡ Tương đương | ✅ An toàn rất cao | Khuyến nghị |
| SHA-3 | 224–512 bit | ⚡ Chậm hơn | ✅ Thiết kế mới | Tiêu chuẩn mới |
| BLAKE3 | 256+ bit | ⚡⚡⚡ Rất nhanh | ✅ An toàn cao | Hiện đại |
Nhập văn bản và xem hash được tạo ra theo thời gian thực
Giải đáp mọi thắc mắc về SHA-256
Hiện tại, SHA-256 được coi là an toàn về mặt tính toán. Để tìm collision, cần thực hiện ~2¹²⁸ phép tính — vượt xa khả năng của mọi siêu máy tính hiện đại và ngay cả máy tính lượng tử trong tương lai gần.
Nếu máy tính lượng tử mạnh được phát triển, thuật toán Grover giảm độ khó xuống còn ~2¹²⁸, vẫn đủ an toàn. SHA-256 được dự đoán an toàn trong ít nhất vài thập kỷ tới.
MD5 tạo hash 128-bit và đã bị bẻ gãy hoàn toàn — có thể tạo collision trong vài giây. MD5 không nên dùng cho mục đích bảo mật.
SHA-256 tạo hash 256-bit, an toàn gấp 2¹²⁸ lần MD5. Về tốc độ, SHA-256 chậm hơn một chút nhưng sự đánh đổi hoàn toàn xứng đáng.
SHA-256 là hàm một chiều (one-way function) — không phải mã hóa (encryption). Không có "khóa giải mã" vì bản thân thiết kế không cho phép đảo ngược.
Trong quá trình tạo hash, thông tin bị mất đi. Vì vậy, ngay cả về mặt lý thuyết, không thể khôi phục dữ liệu gốc duy nhất từ hash.
SHA-256 khá nhanh — CPU hiện đại tính hàng tỷ hash/giây. Đây là ưu điểm cho nhiều ứng dụng, nhưng lại là nhược điểm cho lưu mật khẩu.
Với mật khẩu, tốc độ nhanh cho phép kẻ tấn công brute-force hàng tỷ lần/giây. Nên dùng bcrypt, Argon2, hoặc PBKDF2 — các thuật toán được thiết kế chậm cố ý.
SHA-2 là một họ thuật toán bao gồm: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256. Chúng có cùng cấu trúc cơ bản nhưng khác nhau về kích thước đầu ra.
SHA-256 là thành viên phổ biến nhất của SHA-2, với đầu ra 256-bit. Đây là lựa chọn mặc định trong hầu hết các ứng dụng nhờ cân bằng tốt giữa tốc độ và bảo mật.
Về mặt lý thuyết có thể (gọi là collision), vì không gian đầu vào vô hạn nhưng đầu ra giới hạn 2²⁵⁶. Tuy nhiên xác suất xảy ra tự nhiên cực kỳ nhỏ — nhỏ hơn cả xác suất bị sét đánh liên tục 1000 lần.
Không có cuộc tấn công collision thực tế nào chống SHA-256 được biết đến. Để chắc chắn hơn trong môi trường cần bảo mật cực cao, có thể dùng SHA-512.
Trong Bitcoin, SHA-256 được dùng theo 2 cách chính:
Mỗi block chứa hash của block trước, tạo ra "chuỗi" không thể giả mạo.
Rainbow table là bảng tra cứu hash → giá trị gốc được tính sẵn. Chúng có thể tấn công SHA-256 nếu không dùng salt, nhưng với không gian 2²⁵⁶, việc tạo bảng đầy đủ là hoàn toàn không khả thi.
Với mật khẩu, thêm salt (chuỗi ngẫu nhiên) trước khi hash hoàn toàn vô hiệu hóa rainbow table. Mỗi mật khẩu có salt khác nhau, buộc phải tấn công từng cái riêng lẻ.