- Tại sao phải mã hóa mật khẩu?
- Khái niệm cơ bản về băm mật khẩu
- Giới thiệu về bcrypt
- Tấn công bảng cầu vồng (tấn công sử dụng từ điển mật khẩu được tính toán trước).
- Tấn công thô bạo.
Có lẽ mọi lập trình viên đều quen thuộc với mã hóa mật khẩu. Đây là một bước quan trọng để chúng tôi có thể giữ an toàn cho thông tin người dùng ngay cả trong trường hợp cơ sở dữ liệu của chúng tôi bị xâm phạm. Có nhiều tình huống ứng dụng web bị rò rỉ thông tin người dùng. Điều này càng đáng lo ngại hơn nếu thông tin mật khẩu của chúng ta không được mã hóa cẩn thận. Nhiều người sử dụng cùng một mật khẩu cho hầu hết các tài khoản. Cho đi một mật khẩu và tất cả các tài khoản khác có nguy cơ bị xâm phạm. Vì vậy, chúng ta không bao giờ nên lưu trữ mật khẩu dưới dạng văn bản thuần túy.
Một trong những cách phổ biến nhất để giải quyết vấn đề này là thực hiện băm mật khẩu.
Băm
Băm mật khẩu là một phương pháp khá phổ biến để giải quyết các vấn đề về bảo mật mật khẩu. Hàm băm là hàm một chiều cho phép chúng ta chuyển đổi mật khẩu ban đầu thành một chuỗi đại diện cho nó và không thể giải mã ngược lại. Mỗi hàm băm sẽ tương ứng với chính xác một mật khẩu. Chúng tôi sẽ lưu hàm băm được tạo trong cơ sở dữ liệu. Khi thực hiện xác thực người dùng, hệ thống sẽ mã hóa thông tin người dùng nhập vào, so sánh với cơ sở dữ liệu và đưa ra kết quả.
Ví dụ “helloworld” sử dụng thuật toán băm md5 sẽ nhận được kết quả sau “68e109f0f40ca72a15e05cc22786f8e6” .
Với công nghệ máy tính ngày nay, việc giải mã hàm băm là không thể. Tuy nhiên, nếu chúng ta không cẩn thận, kẻ mạo danh vẫn có thể lấy được mật khẩu thông qua hàm băm. Hai phương pháp tấn công phổ biến là:
Để giải quyết vấn đề này, chúng ta sẽ tìm hiểu về dưa chua và kéo dài.
Thêm muối
Như đã đề cập ở trên, chỉ băm mật khẩu thôi là chưa đủ, chúng tôi sử dụng muối để xử lý các cuộc tấn công tính toán trước. Salting là hành động thêm một đoạn dữ liệu vào mật khẩu ban đầu trước khi băm.
Việc tạo muối rất đơn giản nhưng rất hiệu quả. Khi mật khẩu ban đầu trở nên dài hơn, độ phức tạp của mật khẩu đạt đến một cấp độ hoàn toàn mới, do đó, nó cũng trở nên phức tạp hơn. Bằng cách thêm muối, chúng tôi làm cho tất cả các cuộc tấn công tính toán trước trở nên vô dụng. Mỗi tài khoản người dùng, khi được tạo, sẽ được khởi tạo với một chuỗi muối ngẫu nhiên duy nhất khi đăng ký. Hai tài khoản có cùng mật khẩu sẽ không có cùng hàm băm được trả về. Vì chỉ dùng để giải bài toán tính trước nên không cần tạo hệ thống riêng để chứa muối, thông thường ta sẽ cất trực tiếp vào cùng một table.
kéo dài
Ngoài các cuộc tấn công bằng bàn cầu vồng, các cuộc tấn công vũ phu cũng là một hình thức tấn công khá phổ biến. Nếu phép tính không quá phức tạp, kẻ tấn công có thể nhanh chóng kết hợp và thử tất cả các trường hợp để tìm ra mật khẩu người dùng. Ở đây, chúng ta sẽ đi sâu vào khái niệm kéo dài.
Kéo dài là một phương pháp làm tăng độ phức tạp của thuật toán băm, khiến cho brute force không thể thực hiện được trong mọi trường hợp. Để đạt được điều này, chúng tôi thường lặp lại quy trình băm hàng nghìn lần. Điều này khiến người dùng mất nhiều thời gian hơn để biết mật khẩu, nhưng kẻ tấn công sẽ mất nhiều thời gian hơn để tìm ra kết quả. Đối với mật khẩu an toàn, gần như không thể tìm thấy chúng bằng cách cưỡng bức chúng.
Bcrypt là một chức năng mã hóa mật mã do Niels Provos và David Mazières thiết kế dựa trên mật mã blowfish. Nó được giới thiệu lần đầu tiên trên usenix vào năm 1999. Nó là sự kết hợp của ba khái niệm này. Chúng ta vừa học về “băm” “kéo dài” và “muối””.
Thông thường hàm băm bcrypt trông như thế này:
Ví dụ: Sử dụng bcrypt dẫn đến “helloworld”
Ở đâu: 2y: Thuật toán băm 10: Chi phí (2^10 hoặc 1024 chu kỳ) rt2pnlx7aag2edhy8sgdiu: 16 byte (128 bit) của muối base64 được mã hóa thành 22 ký tự. nndkeilb.kutzsdvokgl2x/ter1tkzg: 24 byte (192 bit) hàm băm được mã hóa base64 thành 31 ký tự.
Vì vậy, bằng cách sử dụng các giá trị băm ở trên, mật khẩu của chúng ta sẽ chạy từ 2 đến 10 lần (1024 chu kỳ) cùng với muối rt2pnlx7aag2edhy8sgdiu, mật khẩu “helloworld” và thuật toán mã hóa blowfish $2y$ để có được kết quả ở trên.
Vì vậy, ở đây chúng ta sẽ tìm hiểu lý do tại sao chúng ta muốn mã hóa mật khẩu, các phương pháp tấn công phổ biến và cách ngăn chặn nó bằng muối và kéo dài, cuối cùng chúng ta đi đến phần giới thiệu hàm băm bcrypt để xem các khái niệm trên được sử dụng như thế nào trong thực tế. Đây là bài viết đầu tiên của tôi trên viblo, xin vui lòng chỉ ra bất kỳ sai lầm.