Hashing là quá trình chuyển đổi dữ liệu có kích thước tùy ý thành một chuỗi có độ dài cố định, được sử dụng để xác minh tính toàn vẹn và lưu trữ mật khẩu an toàn. Theo Open Web Application Security Project (OWASP, 2025), việc sử dụng đúng các hàm băm ngăn chặn tới 70% lỗ hổng liên quan đến rò rỉ thông tin đăng nhập. Các hàm băm mật mã học là nền tảng của chữ ký số, công nghệ blockchain và kiểm soát phiên bản.
Các điểm chính
Hashing là quá trình tính toán một hàm băm chuyển đổi một tập hợp dữ liệu đầu vào tùy ý thành một chuỗi bit có độ dài cố định gọi là digest hoặc giá trị băm. Không giống như mã hóa, hashing là một quá trình một chiều: không thể khôi phục dữ liệu gốc từ giá trị băm.
Các hàm băm mật mã học có bốn thuộc tính bắt buộc: tính xác định (cùng một đầu vào luôn tạo ra cùng một giá trị băm), tính không thể đảo ngược (không thể khôi phục đầu vào từ giá trị băm về mặt tính toán), hiệu ứng tuyết lở (thay đổi một bit đầu vào sẽ thay đổi trung bình một nửa số bit của giá trị băm) và khả năng chống va chạm (không thể tìm thấy hai đầu vào khác nhau có cùng giá trị băm về mặt tính toán).
Điều quan trọng là hiểu sự khác biệt giữa hashing và mã hóa. Mã hóa là một quá trình hai chiều: dữ liệu đã mã hóa có thể được giải mã bằng một khóa. Hashing là một quá trình một chiều: sau khi chuyển đổi, dữ liệu không thể khôi phục được. Thuộc tính này làm cho hashing trở nên lý tưởng cho việc lưu trữ mật khẩu: hệ thống chỉ lưu trữ giá trị băm và ngay cả khi cơ sở dữ liệu bị rò rỉ, mật khẩu vẫn được bảo vệ.
Không phải tất cả các hàm băm đều phù hợp như nhau cho các tác vụ bảo mật. Việc phân chia thành các loại mật mã học và không mật mã học là cực kỳ quan trọng khi chọn thuật toán cho một tác vụ cụ thể trong phát triển di động.
Các hàm này được cố tình làm chậm và phức tạp để gây khó khăn cho các cuộc tấn công vét cạn. Chúng phải có khả năng chống lại các va chạm và tấn công tiền ảnh. Họ SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) được NIST chứng nhận và được khuyến nghị sử dụng trong các hệ thống chính phủ. Để băm mật khẩu, các thuật toán bcrypt, scrypt và Argon2 được sử dụng thêm với độ phức tạp có thể điều chỉnh.
Các hàm này được tối ưu hóa cho tốc độ, không phải cho bảo mật. Ví dụ: CityHash, MurmurHash, xxHash. Chúng được sử dụng trong các bảng băm, khử trùng lặp dữ liệu và tổng kiểm tra để xác minh nhanh tính toàn vẹn của dữ liệu không quan trọng. Điều quan trọng là không bao giờ sử dụng chúng để lưu trữ mật khẩu hoặc xác minh chữ ký số — tốc độ cao của chúng khiến chúng dễ bị tấn công vét cạn.
| Loại | Ví dụ | Lĩnh vực ứng dụng |
|---|---|---|
| Mật mã học | SHA-256, SHA-3, bcrypt | Mật khẩu, chữ ký, TLS |
| Không mật mã học | MurmurHash, xxHash | Bảng băm, bộ nhớ đệm |
| KDF mật khẩu | bcrypt, scrypt, Argon2 | Lưu trữ mật khẩu |
Chúng ta hãy xem xét các thuật toán băm phổ biến nhất được sử dụng trong phát triển di động hiện đại. Mỗi thuật toán có ưu và nhược điểm riêng.
SHA-256 là biểu tượng của mật mã học hiện đại, được NIST khuyến nghị như một phần của tiêu chuẩn FIPS 180-4. Thuật toán tạo ra digest 256 bit và là thành phần cốt lõi của giao thức TLS, mạng blockchain và hệ thống kiểm soát phiên bản. Theo báo cáo của NCC Group (2025), SHA-256 được sử dụng trong 96% chứng chỉ TLS để ký chứng nhận tính minh bạch của chứng chỉ.
SHA-3 là họ hàm băm mới nhất, được NIST tiêu chuẩn hóa vào năm 2015 với tên FIPS 202. Không giống như SHA-2 được xây dựng trên cấu trúc Merkle–Damgård, SHA-3 dựa trên một cấu trúc Keccak khác với hàm bọt biển. Điều này làm cho SHA-3 có khả năng chống lại các cuộc tấn công có thể xuất hiện nhắm vào SHA-2 trong tương lai. Đối với các nhà phát triển di động, SHA-3 có sẵn thông qua các thư viện mật mã tiêu chuẩn bắt đầu từ Android 7.0 và iOS 13.
import java.security.MessageDigest
fun hashWithSHA256(input: String): String {
val digest = MessageDigest.getInstance("SHA-256")
val hashBytes = digest.digest(input.toByteArray())
return hashBytes.joinToString("") { String.format("%02x", it) }
}
Các hàm băm mật mã học đa năng không đủ để lưu trữ mật khẩu — chúng quá nhanh. bcrypt được thiết kế đặc biệt cho việc băm mật khẩu: nó bao gồm muối và tham số chi phí điều chỉnh thời gian tính toán. Tăng gấp đôi chi phí sẽ tăng gấp đôi thời gian băm, làm cho việc vét cạn trở nên không hiệu quả ngay cả trên phần cứng mạnh mẽ.
import at.favre.lib.crypto.bcrypt.BCrypt
fun hashPassword(password: String): String {
return BCrypt.create()
.hashToString(BCrypt.MIN_COST, password.toCharArray())
}
fun verifyPassword(password: String, hash: String): Boolean {
val result = BCrypt.verifyer().verify(password.toCharArray(), hash)
return result.verified
}
Argon2 là người chiến thắng của Password Hashing Competition (2015), được OWASP khuyến nghị là lựa chọn tốt nhất cho việc băm mật khẩu. Argon2id là biến thể có khả năng chống lại các cuộc tấn công kênh phụ và tấn công đánh đổi thời gian-bộ nhớ. Không giống như bcrypt, Argon2 cho phép cấu hình riêng biệt thời gian thực thi, mức sử dụng bộ nhớ và mức độ song song, cung cấp khả năng bảo vệ linh hoạt chống lại các loại tấn công khác nhau.
Hashing giải quyết nhiều tác vụ thực tế trong phát triển di động — từ xác thực người dùng đến xác minh tính toàn vẹn của các tệp đã tải xuống. Hãy xem xét các trường hợp sử dụng chính.
Trường hợp sử dụng chính là lưu trữ mật khẩu an toàn ở phía máy chủ. Khi đăng ký, ứng dụng gửi mật khẩu đến máy chủ, nơi nó được băm với muối bằng bcrypt hoặc Argon2 và được lưu trong cơ sở dữ liệu. Khi đăng nhập, máy chủ sẽ băm mật khẩu đã nhập và so sánh với giá trị băm đã lưu. OWASP khuyến nghị sử dụng Argon2id với các tham số: thời gian 2 giây, bộ nhớ 64 MB, mức độ song song 4.
Khi tải xuống các tệp lớn như gói OBB hoặc bản cập nhật nội dung, các ứng dụng di động có thể xác minh tính toàn vẹn của chúng thông qua hashing. Máy chủ công bố giá trị băm SHA-256 của tệp và ứng dụng tính toán giá trị băm của dữ liệu đã tải xuống và so sánh chúng. Điều này đảm bảo tệp không bị hỏng hoặc bị giả mạo trong quá trình truyền. Theo Google Play Console (2025), xác minh giá trị băm của các ứng dụng được chứng nhận ngăn chặn tới 99,9% các cuộc tấn công tải xuống bị hỏng.
Giá trị băm được sử dụng tích cực để xây dựng bộ nhớ đệm hiệu quả và khử trùng lặp dữ liệu. Địa chỉ của một hình ảnh hoặc phản hồi JSON được băm và sử dụng làm khóa bộ nhớ đệm: khi có yêu cầu lặp lại, hệ thống sẽ so sánh các giá trị băm và trả về kết quả đã lưu nếu dữ liệu không thay đổi. Cho tác vụ này, các hàm băm không mật mã học như MurmurHash hoặc xxHash rất phù hợp, cung cấp hiệu suất tối đa.
import java.security.MessageDigest
fun calculateFileHash(fileBytes: ByteArray): String {
val digest = MessageDigest.getInstance("SHA-256")
val hash = digest.digest(fileBytes)
return hash.joinToString("") { String.format("%02x", it) }
}
fun verifyIntegrity(data: ByteArray, expectedHash: String): Boolean {
val actualHash = calculateFileHash(data)
return actualHash == expectedHash
}
Ngay cả các nhà phát triển có kinh nghiệm cũng mắc lỗi khi làm việc với hashing. Hãy xem xét các vấn đề phổ biến nhất có thể làm mất tác dụng của mọi lợi ích bảo vệ mật mã học.
MD5 và SHA-1 là các thuật toán lỗi thời mà có các cuộc tấn công va chạm thực tế. MD5 đã bị phá vỡ vào năm 2004 bởi một nhóm nhà nghiên cứu Trung Quốc (va chạm trong một giờ). SHA-1 đã bị phá vỡ vào năm 2017 bởi một nhóm từ Google và Centrum Wiskunde & Informatica (tấn công SHAttered). Việc sử dụng các thuật toán này trong các dự án mới được coi là lỗi bảo mật nghiêm trọng theo phân loại của OWASP.
Băm mật khẩu mà không có muối là một lỗ hổng nghiêm trọng. Muối là một chuỗi ngẫu nhiên, duy nhất cho mỗi người dùng, được thêm vào mật khẩu trước khi băm. Không có muối, hai mật khẩu giống hệt nhau sẽ tạo ra cùng một giá trị băm, cho phép sử dụng bảng cầu vồng để bẻ khóa. OWASP khuyến nghị sử dụng muối mạnh về mặt mật mã học có độ dài ít nhất 32 byte, được tạo riêng cho từng người dùng.
Ngay cả khi sử dụng bcrypt hoặc Argon2, bạn có thể làm giảm khả năng bảo vệ bằng cách chọn tham số chi phí quá thấp. Theo OWASP (2025), số lần lặp bcrypt tối thiểu phải là 10 (2^10 = 1024 lần lặp) và đối với Argon2id, thời gian tính toán phải ít nhất là 1 giây trên nền tảng mục tiêu. Các tham số quá thấp khiến các cuộc tấn công vét cạn trở nên khả thi trong thực tế trên các trang trại GPU.
Câu hỏi thường gặp
Hashing là một quá trình một chiều mà kết quả của nó không thể đảo ngược thành dữ liệu gốc. Mã hóa là một quá trình hai chiều: dữ liệu đã mã hóa có thể được giải mã bằng một khóa. Hashing được sử dụng để lưu trữ mật khẩu và xác minh tính toàn vẹn, trong khi mã hóa được sử dụng để truyền dữ liệu bảo mật giữa máy khách và máy chủ.
OWASP khuyến nghị Argon2id là lựa chọn tốt nhất cho việc băm mật khẩu nhờ khả năng bảo vệ có thể cấu hình chống lại các cuộc tấn công GPU và kênh phụ. Các lựa chọn thay thế: bcrypt (đã được kiểm chứng và dễ cấu hình), scrypt (chống lại các cuộc tấn công ASIC) và PBKDF2. SHA-256 và SHA-512 không phù hợp cho mật khẩu — chúng quá nhanh và không bảo vệ khỏi các cuộc tấn công vét cạn hàng loạt.
Va chạm là tình huống mà hai tập dữ liệu đầu vào khác nhau tạo ra cùng một giá trị băm. Đối với các hàm băm mật mã học, việc tìm thấy va chạm phải không thể thực hiện được về mặt tính toán. Ví dụ, xác suất va chạm SHA-256 là khoảng 1 trên 2^128 đối với hai thông điệp ngẫu nhiên bất kỳ — đây là một giá trị cực kỳ nhỏ.
Không, bcrypt tự động bao gồm muối trong thuật toán của nó. Khi gọi BCrypt.hashToString(), thư viện tạo ra một muối mạnh về mặt mật mã học dài 16 byte và nhúng nó vào chuỗi đầu ra cùng với giá trị băm và tham số chi phí. scrypt và Argon2 hoạt động tương tự. Đây là một trong những lý do tại sao các chuyên gia khuyến nghị sử dụng KDF chuyên dụng thay vì các hàm băm đa năng để bảo vệ mật khẩu.
Có, giá trị băm được sử dụng để tạo danh sách trắng và danh sách đen của các tệp. Cơ sở dữ liệu chống vi-rút chứa giá trị băm của các chương trình độc hại đã biết. Tuy nhiên, những kẻ tấn công có thể thay đổi một byte trong chương trình, điều này sẽ thay đổi hoàn toàn giá trị băm. Do đó, các hệ thống hiện đại sử dụng băm mờ (SSDeep, TLSH), có thể tìm các tệp tương tự về mặt ngữ nghĩa chứ không chỉ các kết quả khớp chính xác.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm