SHA-256 background
Thuật Toán Bảo Mật

SHA-256
Secure Hash Algorithm

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.

256 Bits đầu ra
2256 Tổ hợp có thể
64 Vòng xử lý
Cuộn xuống

SHA-256 là gì?

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.

📅
Năm ra đời 2001 (FIPS PUB 180-2)
🏛️
Thiết kế bởi NSA (National Security Agency)
📋
Tiêu chuẩn FIPS 180-4, RFC 6234
🔢
Độ dài đầu ra 256 bit / 32 byte / 64 hex chars
Dữ liệu đầu vào
"Hello, World!"
SHA-256
Hash đầu ra (256-bit)
dffd6021bb2bd5b0af676290809ec3a5
3191dd81c7f70a4b28688a362182986f

✦ Thay đổi 1 ký tự → Hash hoàn toàn khác

Hiệu Ứng Tuyết Lở (Avalanche Effect)

Chỉ thay đổi một ký tự nhỏ → toàn bộ hash thay đổi hoàn toàn

"SHA256"
↓
c96d 45ef b07a 3cd0 …
VS
"SHA257"
↓
4af2 118b e93c 7ad1 …

SHA-256 Hoạt Động Như Thế Nào?

Quy trình xử lý từng bước của thuật toán

01
📦

Pre-processing: Padding

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.

// Cấu trúc padding
[dữ liệu gốc] + [1] + [000...0] + [độ dài 64-bit]
// Tổng = bội số của 512 bit
02
✂️

Chia Khối 512-bit

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ừ.

W₀W₁ W₂… W₆₃
03
⚙️

Khởi Tạo Hash Values

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ố.

H₀ = 6a09e667
H₁ = bb67ae85
H₂ = 3c6ef372
H₃ = a54ff53a
H₄ = 510e527f
H₅ = 9b05688c
H₆ = 1f83d9ab
H₇ = 5be0cd19
04
🔄

64 Vòng Nén

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.

T₁ = h + Σ₁(e) + Ch(e,f,g) + Kₜ + Wₜ
T₂ = Σ₀(a) + Maj(a,b,c)
h←g, g←f, f←e, e←d+T₁
d←c, c←b, b←a, a←T₁+T₂
05
➕

Cộng Giá Trị Hash

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.

H₀+=a  H₁+=b  H₂+=c
H₃+=d  H₄+=e  H₅+=f
H₆+=g  H₇+=h  (mod 2³²)
06
🏁

Đầu Ra Cuối Cùng

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.

H₀ H₁ H₂ H₃ ∥ H₄ H₅ H₆ H₇ = 256-bit Hash ✓
Input
Padding
Block Split
64 Rounds
Hash Output

5 Tính Chất Bảo Mật Cốt Lõi

Những đặc điểm làm cho SHA-256 trở nên an toàn và đáng tin cậy

🎯
Tính Xác Định

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.

"hello" → 2cf24dba5fb0a30e…
"hello" → 2cf24dba5fb0a30e…
✓ Luôn giống nhau
🔒
Kháng Tiền Ảnh

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.

Độ khó bẻ gãyCực kỳ cao
💥
Kháng Va Chạm

Cực kỳ khó để tìm hai đầu vào khác nhau có cùng hash.

Xác suất va chạm~1/2¹²⁸
🌊
Hiệu Ứng Tuyết Lở

Thay đổi 1 bit đầu vào làm thay đổi ~50% số bit trong hash đầu ra.

"Cat" → 48735c4fae42d150…
"Dat" → 8ce657a835a00f4c…
≈ 128 bits khác nhau
📏
Đầu Ra Cố Định

Dù đầu vào là 1 byte hay 1 TB, đầu ra luôn là 256 bit (64 ký tự hex).

1 ký tự
→
64 hex chars
1 GB file
→
64 hex chars
1 TB video
→
64 hex chars

SHA-256 Trong Cuộc Sống Thực

Thuật toán này bảo vệ bạn mỗi ngày theo nhiều cách

⛓️
Blockchain
Bitcoin & Cryptocurrency

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.

  • Tạo địa chỉ Bitcoin
  • Mining (Proof of Work)
  • Xác thực giao dịch
🔐
Web Security
TLS/SSL & HTTPS

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.

  • Ký chứng chỉ SSL/TLS
  • Xác thực máy chủ
  • Trao đổi khóa an toàn
🔑
Authentication
Lưu Trữ Mật Khẩu

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.

  • PBKDF2 kết hợp SHA-256
  • Bcrypt, Argon2 (thuật toán hash mật khẩu riêng)
  • Xác thực không lộ mật khẩu
✅
Data Integrity
Kiểm Tra Tính Toàn Vẹn

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.

  • Checksum file download
  • Xác minh bản cập nhật
  • Backup integrity check
🐙
Version Control
Git & Code Versioning

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.

  • Commit object hashing
  • Tree và blob objects
  • Toàn vẹn repository
📜
PKI
Chữ Ký Số

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.

  • Ký văn bản pháp lý điện tử
  • Code signing (phần mềm)
  • JWT tokens

SHA-256 Theo Ngôn Ngữ Lập Trình

Thư viện chính thức & phổ biến nhất cho từng ngôn ngữ, kèm link GitHub

🐍
Python
Built-in

Module hashlib tích hợp sẵn — không cần cài thêm thư viện.

Python 3.x
import hashlib
h = hashlib.sha256(b'hello').hexdigest()
print(h)
⚡
JavaScript
Node / Browser

Dùng crypto module (Node) hoặc SubtleCrypto (Browser). Thư viện js-sha256 phổ biến cho cả hai môi trường.

Node.js (built-in)
const { createHash } = require('crypto');
const hash = createHash('sha256')
  .update('hello').digest('hex');
console.log(hash);
☕
Java
JDK / Bouncy Castle

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.

Java (JDK built-in)
MessageDigest md =
  MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(
  "hello".getBytes());
🐹
Go
Standard Library

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.

Go
import "crypto/sha256"

h := sha256.Sum256([]byte("hello"))
fmt.Printf("%x\n", h)
🦀
Rust
sha2 / ring

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.

Rust (sha2 crate)
use sha2::{Sha256, Digest};

let hash = Sha256::digest(b"hello");
println!("{:x}", hash);
⚙️
C / C++
OpenSSL / mbedTLS

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.

C (OpenSSL)
#include <openssl/sha.h>
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256((unsigned char*)"hello",
       5, hash);
🐘
PHP
Built-in

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 (built-in)
<?php
$hash = hash('sha256', 'hello');
echo $hash;
💎
Ruby
OpenSSL Digest

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.

Ruby (built-in)
require 'digest'
hash = Digest::SHA256.hexdigest('hello')
puts hash
🕊️
Swift
CryptoKit / Swift-Crypto

Apple CryptoKit (iOS 13+, macOS 10.15+) cung cấp SHA-256 tích hợp sẵn. swift-crypto hỗ trợ Linux.

Swift (CryptoKit)
import CryptoKit
let data = Data("hello".utf8)
let hash = SHA256.hash(data: data)
print(hash.description)
🎯
Kotlin
Bouncy Castle / kotlinx-crypto

Kế thừa Java MessageDigest. Thư viện kotlinx-crypto (Multiplatform) hỗ trợ Android, iOS, JS và Native.

Kotlin (JVM)
val hash = MessageDigest
  .getInstance("SHA-256")
  .digest("hello".toByteArray())
  .joinToString("") { "%02x".format(it) }
🔷
TypeScript / npm
crypto-js / noble-hashes

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ũ.

@noble/hashes
import { sha256 } from '@noble/hashes/sha256';
import { bytesToHex } from '@noble/hashes/utils';
const hash = bytesToHex(sha256('hello'));
🔷
C# / .NET
System.Security

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.

C# (.NET)
using System.Security.Cryptography;
var hash = SHA256.HashData(
  Encoding.UTF8.GetBytes("hello"));
Console.WriteLine(
  Convert.ToHexString(hash));
12+
Ngôn ngữ hỗ trợ
100%
Open Source
FIPS
140-2 Compliant
∞
Cộng đồng hỗ trợ

SHA-256 vs Các Thuật Toán Khác

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

Thử SHA-256 Ngay

Nhập văn bản và xem hash được tạo ra theo thời gian thực

SHA-256 Hash Output
Hash sẽ xuất hiện ở đây…
Độ dài đầu vào
0 bytes
Độ dài hash
64 chars
Thời gian tính
—

Câu Hỏi Thường Gặp

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:

  • Tạo địa chỉ ví: Khóa công khai → SHA-256 → RIPEMD-160 → địa chỉ Bitcoin
  • Mining (Proof of Work): Thợ đào tìm nonce sao cho SHA256(SHA256(block header)) < target. Khó tìm nhưng dễ xác minh.

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ẻ.