Độ an toàn của mật khẩu
Kẻ tấn công muốn xâm nhập vào một ứng dụng được bảo vệ bằng mật khẩu (tệp RAR có mật khẩu, email…) có nhiều cách để đạt được mục đích mà không cần biết mật khẩu. Một số cách đòi hỏi trí thông minh, sự khôn khéo và hiểu biết nhất định, số khác lại cần một chút may mắn và sức vóc. Vì vậy trước hết hãy tóm tắt xem kẻ tấn công có những cách nào.
Cách bẻ mật khẩu của người khác
- Tìm người biết mật khẩu (chẳng hạn chủ email) và lấy mật khẩu từ người đó: dụ dỗ, mua chuộc, đánh đập. Cách này tôi sẽ không mô tả trong bài :-).
- Tìm cách khéo léo moi mật khẩu từ chủ tài khoản, chẳng hạn bằng email giả mạo; thuật ngữ chuyên môn gọi là phishing (lừa đảo trực tuyến). Phương pháp này là gửi cho chủ tài khoản một email yêu cầu gửi lại tên đăng nhập và mật khẩu. Thư trông đáng tin đến mức nào là tuỳ ở bạn, vì chỉ một lời đề nghị suông có lẽ không đủ, cần thêm một câu chuyện nào đó. Ta thường gặp kiểu thư báo rằng cơ sở dữ liệu bị hỏng nên yêu cầu mọi người dùng nhập lại mật khẩu và tên đăng nhập, nếu không hộp thư sẽ bị xoá, v.v. Nếu thư trông thật sự nghiêm túc thì tỉ lệ thành công thường không nhỏ.
- Tấn công từ điển: tải từ Internet một số bộ mật khẩu phổ biến nhất rồi thử hết. Nếu may mắn và chủ tài khoản dùng một mật khẩu thông dụng, ta sẽ dễ dàng lấy được nó. Từ đó rút ra bài học quan trọng: đừng đặt mật khẩu có nghĩa. Hãy thử đặt mật khẩu là matkhau, tôi bảo đảm rằng tay hacker gà mờ đầu tiên sẽ bẻ được nó trong vài giây. Đây có lẽ là phương pháp hiệu quả nhất: nếu có một từ điển mật khẩu thật sự lớn, ta có thể đoán được mật khẩu của rất nhiều người dùng mà không tốn mấy công sức.
- Vét cạn (brute force) là phương pháp ngốc nghếch nhất, dùng sức mạnh thô. Phương pháp này thử mọi mật khẩu có thể có trên đời. Chương trình lần lượt ghép các chữ cái theo một thuật toán nhất định và thử xem có trúng mật khẩu cần tìm không. Khi tìm được, nó lưu mật khẩu lại và kết thúc. Ta sẽ xem xét kĩ phương pháp này.
Vét cạn
Chương trình dùng phương pháp này chỉ tạo ra các chỉnh hợp chữ cái khác nhau và thử xem có tình cờ trúng mật khẩu không. Ta tính xem việc thử như vậy có thể mất bao lâu.
Giả sử có một mật khẩu gồm 5 kí tự, chỉ gồm các chữ cái thường của bảng chữ cái tiếng Anh (không có chữ có dấu như ă, ơ, đ). Bảng chữ cái tiếng Anh có 26 chữ cái. Bây giờ chỉ cần tính xem có thể lập được bao nhiêu mật khẩu khác nhau từ 5 chữ cái như vậy. Ta dùng chỉnh hợp, vì thứ tự có ý nghĩa (mật khẩu minh không giống mật khẩu nhim, dù gồm cùng các chữ cái), hơn nữa phải dùng chỉnh hợp lặp, vì các chữ cái trong mật khẩu có thể lặp lại. Giờ đến phần tính toán. Công thức tính số chỉnh hợp lặp có dạng nk. Thay n bằng số chữ cái để chọn, tức là số chữ cái của bảng chữ cái tiếng Anh, và thay k bằng số chữ cái của mật khẩu, ở đây là 5. Ta được 265, tức là khoảng 12 triệu khả năng khác nhau. Như vậy là nhiều hay ít?
Điều đó còn tuỳ vào máy tính ta có. Một chiếc máy cũ kĩ mỗi giây chỉ so sánh được ít lần, còn máy tính siêu hiện đại làm được nhiều gấp 10.000 lần. Trong các ví dụ này, tôi giả sử máy tính thực hiện được 10 triệu lần so sánh và đánh giá mỗi giây. Hẳn ai cũng thấy rằng máy tính như vậy sẽ tìm ra mật khẩu 5 kí tự trong chưa đầy 2 giây, quả thật không phải là kết quả tốt đẹp gì. Nhưng đừng bỏ cuộc.
Tăng độ mạnh của mật khẩu
Mật khẩu 5 kí tự thật sự không an toàn chút nào, một số hệ thống hợp lí hơn thậm chí không cho phép chọn mật khẩu ngắn như vậy. Người ta khuyên mật khẩu không nên ngắn hơn 8 kí tự. Bây giờ ta tính xem mật khẩu 8 kí tự có bao nhiêu khả năng. Giống như trường hợp trước, ta chỉ xét các chữ cái thường của bảng chữ cái tiếng Anh. Thay vào công thức, ta được 268, tức là khoảng 200 tỉ khả năng. Con số này đã đẹp hơn. Máy tính sẽ thử hết mọi khả năng trong chưa đầy 6 giờ. Tốt hơn lần trước, nhưng hãy xem độ mạnh của mật khẩu tăng thế nào nếu bạn dùng cả chữ in hoa, chữ số và các kí tự đặc biệt như dấu gạch dưới, dấu gạch ngang, v.v.
Có 26 chữ cái thường, chữ in hoa cũng có 26 chữ, tổng cộng là 52 kí tự. Thêm vào đó 10 chữ số và một số kí tự đặc biệt. Không phải nơi nào cũng cho phép mọi kí tự đặc biệt, nên để đơn giản tôi chỉ tính 8 kí tự đặc biệt, để số kí tự tròn thành con số đẹp 70. Mật khẩu vẫn dài 8 kí tự. Thay vào, ta được số 708; để dễ hình dung, đó là khoảng 5,8 · 1014, tức là gần 600 nghìn tỉ khả năng. Đây đã là một con số khá đáng nể. Máy tính của ta sẽ phải thử hết mọi khả năng trong 16.000 giờ! Tức là gần 2 năm. Kẻ tấn công phải rất may mắn mới tìm ra mật khẩu trong một khoảng thời gian thực tế. Hơn nữa hắn còn phải biết độ dài mật khẩu của bạn; nếu không biết độ dài, hắn còn phải thử cả các khả năng với số kí tự ít hơn.
Có người lo cho dữ liệu của mình đến mức dùng mật khẩu chỉ gồm chữ số. Những mật khẩu này chống tấn công từ điển rất tốt, vì khó có từ điển mật khẩu phổ biến nào lại chứa đúng số 41.274.390.553. Đáng tiếc là tuy chống được tấn công từ điển, những mật khẩu như vậy lại kém chống chịu trước tấn công vét cạn. Chỉ có 10 chữ số, nghĩa là số khả năng luôn là 10k. Độ mạnh của mật khẩu chỉ dựa vào độ dài. Mật khẩu 8 kí tự với mọi loại kí tự ở trên có khoảng 5,8 · 1014 khả năng. Để đạt ít nhất mức đó, mật khẩu chỉ gồm chữ số phải có 15 chữ số, gần gấp đôi số kí tự. Rõ ràng chọn mật khẩu ngắn hơn nhưng có nhiều loại kí tự hơn thì hiệu quả hơn.
Đừng đánh giá thấp kẻ tấn công
Kẻ tấn công có thể rất thông minh. Giả sử sau khi đọc những dòng trên, bạn quyết định đổi mật khẩu hiện tại “chanhday” thành ít nhất là “Chanhday”, nhờ đó số khả năng tăng lên nhiều lần, vì kẻ tấn công phải đưa cả chữ in hoa vào thuật toán. Nhưng kẻ tấn công có thể đoán rằng chữ in hoa chỉ ở vị trí đầu tiên, vì như vậy dễ nhớ hơn và người ta không hay viết chữ in hoa ở giữa từ. Vì vậy hắn viết một thuật toán thử mọi khả năng gồm chữ cái thường, có thể có một chữ in hoa ngay ở đầu.
Mật khẩu ban đầu của bạn có độ phức tạp (ở đây tôi muốn nói có tất cả bao nhiêu khả năng nếu giữ nguyên dạng mật khẩu: 8 chữ cái thường) là 268. Nếu kẻ tấn công không suy nghĩ, mật khẩu mới có độ phức tạp 528, nhưng nếu dùng thuật toán vừa nêu, mật khẩu có độ phức tạp 52 · 267. Ở vị trí đầu tiên của mật khẩu có thể là chữ thường hoặc chữ in hoa, tổng cộng 52 chữ, còn ở 7 vị trí tiếp theo chỉ có thể là chữ thường; đó là chỉnh hợp lặp thông thường.
Hơn nữa, kẻ tấn công có thể biết mật khẩu của bạn gồm 4 chữ cái và 4 chữ số, không xen kẽ, các chữ số đứng liền nhau và các chữ cái đứng liền nhau. Độ phức tạp của mật khẩu như vậy tính như sau: bộ 4 chữ cái đầu có tất cả 264 khả năng, bộ 4 chữ số sau có 104 khả năng. Sau đó nhân hai kết quả này: 264 · 104. Nếu kẻ tấn công không biết chữ số hay chữ cái đứng trước, ta còn phải nhân kết quả trên với 2.