Hàm băm Bcrypt là gì?

Hàm băm bcrypt cho phép chúng ta xây dựng một nền tảng bảo mật mật khẩu có thể mở rộng theo sức mạnh tính toán và luôn băm mọi mật khẩu kèm theo salt.
Please wait 0 seconds...
Scroll Down and click on Go to Link for destination
Congrats! Link is Generated

Hàm băm bcrypt cho phép chúng ta xây dựng một nền tảng bảo mật mật khẩu có thể mở rộng theo sức mạnh tính toán và luôn băm mọi mật khẩu kèm theo salt.

Bcrypt là gì?

bcrypt được thiết kế bởi Niels Provos và David Mazières dựa trên thuật toán Blowfish: b là viết tắt của Blowfish, còn crypt lấy từ tên của hàm băm được sử dụng trong hệ thống mật khẩu của UNIX.

Hàm crypt là một ví dụ điển hình về sự thất bại khi không thích nghi với sự thay đổi công nghệ. Theo USENIX, vào năm 1976, crypt có thể băm ít hơn 4 mật khẩu mỗi giây. Vì kẻ tấn công cần tìm ảnh gốc của một hàm băm để đảo ngược nó, điều này khiến nhóm phát triển UNIX cảm thấy rất yên tâm về độ bảo mật của crypt. Tuy nhiên, 20 năm sau, một chiếc máy tính nhanh với phần mềm và phần cứng tối ưu hóa có thể băm tới 200.000 mật khẩu mỗi giây bằng hàm này!

Với tốc độ này, kẻ tấn công có thể dễ dàng thực hiện một cuộc tấn công từ điển (dictionary attack) một cách cực kỳ hiệu quả. Vì vậy, cần có một thuật toán mã hóa khó bị phá vỡ hơn theo cấp số nhân khi phần cứng ngày càng mạnh, nhằm cản trở lợi thế về tốc độ mà kẻ tấn công có thể đạt được.

Mã hóa Blowfish là một thuật toán khối nhanh, ngoại trừ khi thay đổi khóa. Khi đó, thuật toán yêu cầu xử lý tương đương với việc mã hóa khoảng 4 KB văn bản, được xem là rất chậm so với các thuật toán mã hóa khối khác. Việc thay đổi khóa chậm này lại có lợi cho các phương pháp băm mật khẩu như bcrypt, vì nó giúp chống lại các cuộc tấn công từ điển và brute-force bằng cách làm chậm quá trình tấn công.

Bcrypt có thể giảm thiểu các cuộc tấn công này bằng cách kết hợp giai đoạn thiết lập khóa đắt đỏ của Blowfish với một số lần lặp lại có thể thay đổi, nhằm tăng khối lượng công việc và thời gian tính toán của hàm băm. Lợi ích lớn nhất của bcrypt là có thể tăng số lần lặp theo thời gian, khiến thuật toán trở nên chậm hơn và có thể mở rộng theo sức mạnh tính toán. Chúng ta có thể vô hiệu hóa lợi thế của phần cứng nhanh hơn bằng cách tăng số lần lặp, khiến bcrypt chậm hơn.

"bcrypt được thiết kế để băm mật khẩu, vì vậy nó là một thuật toán chậm. Điều này tốt cho việc băm mật khẩu, vì nó làm giảm số lượng mật khẩu mà kẻ tấn công có thể băm mỗi giây khi thực hiện một cuộc tấn công từ điển."

Một lợi ích khác của bcrypt là nó yêu cầu một giá trị muối (salt) theo mặc định. Hãy cùng tìm hiểu sâu hơn về cách hàm băm này hoạt động!


Bcrypt hoạt động như thế nào?

Những nhà thiết kế của bcrypt, Provos và Mazières, đã sử dụng giai đoạn thiết lập khóa đắt đỏ của Blowfish để phát triển một thuật toán thiết lập khóa mới cho Blowfish có tên là eksblowfish (viết tắt của expensive key schedule Blowfish).

Giai đoạn 1: Thiết lập khóa

Một hàm có tên EksBlowfishSetup được thiết lập bằng cách sử dụng chi phí mong muốn, muối (salt) và mật khẩu để khởi tạo trạng thái của eksblowfish. Sau đó, bcrypt tiêu tốn rất nhiều thời gian để chạy một quá trình thiết lập khóa phức tạp, trong đó mật khẩu được sử dụng làm khóa chính. Nếu người dùng chọn một mật khẩu yếu hoặc ngắn, thuật toán sẽ kéo dài khóa đó thành một khóa dài hơn – kỹ thuật này còn được gọi là key stretching.

Giai đoạn 2: Mã hóa giá trị đặc biệt

Một giá trị đặc biệt có tên OrpheanBeholderScryDoubt (192-bit) được mã hóa 64 lần bằng eksblowfish theo chế độ ECB, sử dụng trạng thái từ giai đoạn đầu tiên. Kết quả đầu ra của giai đoạn này là chi phí (cost) và giá trị muối 128-bit, kết hợp với kết quả của vòng lặp mã hóa.

Sau khi thực hiện cả hai giai đoạn trên, giá trị băm cuối cùng sẽ có tiền tố $2a$, $2y$, hoặc $2b$ để biểu thị phiên bản của bcrypt.

Tính năng bảo mật của bcrypt

Bcrypt đảm bảo các thuộc tính bảo mật quan trọng của một hàm băm mật khẩu:

Chống tìm ảnh gốc (preimage resistant)
Không thể dự đoán trước giá trị băm (large salt space), giúp ngăn chặn các cuộc tấn công bảng cầu vồng (rainbow table attack)
Có thể điều chỉnh chi phí tính toán (adaptable cost), giúp mở rộng theo sức mạnh tính toán

Nhờ vào thiết kế toán học, bcrypt được đánh giá là vẫn giữ vững giá trị bảo mật trong nhiều năm tới.


Thực hành tốt nhất khi sử dụng bcrypt

Một thách thức đối với các kỹ sư bảo mật là xác định chi phí tính toán hợp lý cho bcrypt. OWASP khuyến nghị:

🔹 Nghiên cứu trải nghiệm người dùng (UX): Xác định thời gian chờ hợp lý khi đăng ký và xác thực.
🔹 Điều chỉnh chi phí bcrypt để nó chạy trong thời gian chấp nhận được trên phần cứng của bạn.
🔹 Phân tích với nhóm bảo mật xem thời gian tính toán đó có đủ để giảm thiểu rủi ro tấn công hay không.

Người dùng có thể chấp nhận thời gian chờ 1-2 giây, nhưng với kẻ tấn công, điều này gây cản trở lớn trong việc bẻ khóa hàng loạt mật khẩu.

Do sức mạnh phần cứng ngày càng tăng theo định luật Moore, chúng ta có thể điều chỉnh chi phí bcrypt theo thời gian. Tuy nhiên, cần thực hiện quy trình di chuyển (migration), nếu không người dùng có thể bị khóa tài khoản khi cập nhật giá trị chi phí.


Triển khai bcrypt trong Node.js

Cài đặt thư viện bcrypt:

npm install bcrypt

Tạo muối và băm mật khẩu

const bcrypt = require("bcrypt");
const saltRounds = 10;
const plainTextPassword = "DFGh5546*%^__90";

bcrypt.genSalt(saltRounds)
  .then(salt => bcrypt.hash(plainTextPassword, salt))
  .then(hash => console.log(`Hash: ${hash}`))
  .catch(err => console.error(err));

Hoặc sử dụng cách tự động tạo muối:

bcrypt.hash(plainTextPassword, saltRounds)
  .then(hash => console.log(`Hash: ${hash}`))
  .catch(err => console.error(err));

Xác thực mật khẩu

const storedHash = "$2b$10$69SrwAoAUNC5F.gtLEvrNON6VQ5EX89vNqLEqU655Oy9PeT/HRM/a";

bcrypt.compare(plainTextPassword, storedHash)
  .then(result => console.log(result ? "✅ Mật khẩu đúng!" : "❌ Sai mật khẩu!"))
  .catch(err => console.error(err));

Kết luận

bcrypt là một giải pháp bảo mật mật khẩu mạnh mẽ nhờ khả năng điều chỉnh chi phí tính toán, yêu cầu muối và chống tấn công bảng cầu vồng. Tuy nhiên, cần lựa chọn mức chi phí phù hợp để cân bằng giữa bảo mật và trải nghiệm người dùng. 🚀

Đăng nhận xét

Tham gia cuộc trò chuyện