Giới hạn 72 byte của bcrypt ảnh hưởng khác nhau tùy ngôn ngữ. Chữ Latin cơ bản chiếm 1 byte trong UTF-8, nhưng các nguyên âm có dấu thanh điệu của tiếng Việt (như ệ, ầ, ộ, ữ — thuộc khối Latin Extended Additional) thường chiếm 2 byte mỗi ký tự. Một mật khẩu tiếng Việt nhiều dấu như "mộtmậtkhẩurấtdàivàkhóđoán" vì vậy chạm ngưỡng 72 byte sớm hơn nhiều so với một chuỗi Latin thuần cùng độ dài — dấu thanh điệu, dù chỉ là một nét nhỏ trên chữ cái, đều có giá bằng byte bổ sung.
Vì sao tốc độ gây hại cho bảo mật mật khẩu
Nếu kẻ tấn công đánh cắp cơ sở dữ liệu hash mật khẩu, chúng sẽ cố dò lại mật khẩu gốc bằng brute force. Với một hàm nhanh như SHA-256, phần cứng hiện đại có thể kiểm tra hàng tỷ tổ hợp mỗi giây. Bcrypt cố ý làm cho một lần băm mất khoảng 100 mili giây, khiến brute force chậm và tốn kém hơn nhiều bậc.
Cost factor là gì
Tham số "cost" của bcrypt xác định số vòng lặp bên trong dưới dạng lũy thừa của 2 (2^cost, thường là 10-12). Tăng thêm một đơn vị sẽ khiến thời gian băm tăng gấp đôi — và tổng chi phí brute force của kẻ tấn công cũng tăng gấp đôi tương ứng.
Muối được tích hợp sẵn
Bcrypt tự động tạo ra một muối (salt) ngẫu nhiên duy nhất cho mỗi mật khẩu và nhúng trực tiếp vào kết quả — không cần lưu trữ riêng. Hai mật khẩu giống hệt nhau cho ra hash khác nhau, và các bảng hash tính sẵn (rainbow table) cho mật khẩu phổ biến trở nên vô dụng — mỗi hash phải bị tấn công riêng lẻ.
Vì sao cần điều này
- Lưu trữ đúng cách mật khẩu người dùng trong cơ sở dữ liệu của ứng dụng.
- Hiểu vì sao SHA-256 hoặc MD5 là lựa chọn tồi cho việc băm mật khẩu.
- Kiểm thử hoặc di chuyển một hệ thống xác thực sử dụng bcrypt.
Giới hạn ẩn: 72 byte, không phải ký tự
Bcrypt chỉ xử lý 72 byte đầu tiên của mật khẩu — phần dài hơn bị loại bỏ âm thầm mà không cảnh báo. Với mật khẩu không dấu, đó là 72 ký tự; nhưng với mật khẩu tiếng Việt có dấu, số ký tự thực tế vừa với giới hạn này sẽ ít hơn đáng kể — điều đáng lưu ý khi đặt giới hạn độ dài mật khẩu cho người dùng Việt.