NhaLapTrinh.comNhà Lập Trình
Bảo mật cơ bản

Lưu mật khẩu người dùng thế nào cho đúng?

Đừng bao giờ lưu mật khẩu người dùng dưới dạng đọc được, kể cả mã hoá có thể giải ngược. Hãy dùng hàm băm chuyên cho mật khẩu, loại được thiết kế chậm có chủ đích và tự thêm muối ngẫu nhiên cho mỗi người, do thư viện đáng tin cung cấp. Đừng tự chế cách băm của riêng mình.

🎙️
📑 Nội dung theo chương
  1. 0:38 Giả định rằng cơ sở dữ liệu sẽ bị lộ
  2. 1:25 Mã hoá khác băm ở đâu?
  3. 2:02 Vì sao phải chậm có chủ đích?
  4. 2:49 Muối để làm gì?
  5. 3:31 Đừng tự chế, và những việc đi kèm
  6. 4:20 Câu hỏi thường gặp
🔊 Bản audio (lồng nhạc nền)

Đừng bao giờ lưu mật khẩu người dùng ở dạng đọc được, và cũng đừng mã hoá theo kiểu giải ngược lại được. Hãy dùng một hàm băm chuyên dành cho mật khẩu, loại được thiết kế chậm có chủ đích và tự thêm một chuỗi ngẫu nhiên gọi là muối cho từng người, do một thư viện đáng tin cung cấp. Và tuyệt đối đừng tự chế cách băm của riêng mình.

Chào bạn, đây là Nhà Lập Trình. Lưu mật khẩu là một trong những việc bảo mật cơ bản nhất, vậy mà vẫn có không ít phần mềm làm sai, nhất là phần mềm nội bộ viết vội. Tập này mình kể vì sao cách đúng lại là cách đúng, để bạn không chỉ làm theo mà còn hiểu. Như mọi tập về bảo mật, mình chỉ nói ở góc phòng thủ.

Giả định rằng cơ sở dữ liệu sẽ bị lộ

Cách nghĩ đúng khi thiết kế lưu mật khẩu là giả định rằng một ngày nào đó, toàn bộ cơ sở dữ liệu của bạn sẽ rơi vào tay người khác. Có thể do tấn công, do một bản sao lưu để nhầm chỗ công khai, do một nhân viên cũ mang theo, do một lỗi cấu hình.

Nếu ngày đó đến, bạn muốn kẻ có được dữ liệu không đọc được mật khẩu của người dùng. Điều này quan trọng hơn bạn nghĩ, vì rất nhiều người dùng một mật khẩu cho nhiều nơi. Mật khẩu lộ từ phần mềm quản lý nhỏ của bạn có thể mở được hộp thư, tài khoản ngân hàng, mạng xã hội của họ.

Lưu mật khẩu dạng đọc được là thất bại hoàn toàn trước giả định này. Ai đọc được bảng người dùng là có tất cả mật khẩu, kể cả nhân viên nội bộ vốn không nên biết.

Nếu phần mềm của bạn có chức năng quên mật khẩu mà gửi lại đúng mật khẩu cũ qua thư, đó là dấu hiệu chắc chắn nó đang lưu sai.

Mã hoá khác băm ở đâu?

Mã hoá là biến dữ liệu thành dạng không đọc được, nhưng có chìa khoá thì giải ngược lại được. Băm là biến dữ liệu thành một chuỗi cố định theo một chiều, không có cách nào giải ngược lại.

Với mật khẩu, bạn không cần giải ngược. Khi người dùng đăng nhập, bạn chỉ cần băm mật khẩu họ vừa gõ rồi so với chuỗi băm đã lưu. Khớp là đúng mật khẩu. Hệ thống không bao giờ cần biết mật khẩu gốc là gì.

Mã hoá mật khẩu có vẻ an toàn, nhưng chìa khoá phải nằm đâu đó mà chương trình đọc được. Kẻ lấy được cơ sở dữ liệu thường cũng lấy được cả chìa khoá, và thế là giải ra hết.

Vì vậy nguyên tắc là băm, không mã hoá. Nhưng không phải hàm băm nào cũng được.

Vì sao phải chậm có chủ đích?

Có những hàm băm được thiết kế để chạy cực nhanh, dùng để kiểm tra tệp có bị sửa không. Chúng rất tốt cho việc đó, nhưng rất tệ cho mật khẩu.

Lý do là kẻ có được chuỗi băm sẽ đoán: thử băm từng mật khẩu phổ biến rồi so. Hàm băm càng nhanh, họ đoán được càng nhiều mật khẩu mỗi giây. Với máy tính mạnh, hàm băm nhanh cho phép thử một lượng mật khẩu khổng lồ trong thời gian ngắn.

Hàm băm dành cho mật khẩu được thiết kế chậm có chủ đích, và có thể điều chỉnh độ chậm. Với người dùng thật đăng nhập, chậm thêm một phần nhỏ của giây không ai nhận ra. Với kẻ muốn đoán hàng tỷ lần, mỗi lần chậm đi như vậy biến việc đoán từ vài giờ thành nhiều năm.

Độ chậm nên được tăng dần theo thời gian, khi máy tính mạnh lên. Nhiều thư viện cho phép tự động băm lại mật khẩu với độ chậm mới khi người dùng đăng nhập thành công.

Muối để làm gì?

Nếu hai người dùng cùng một mật khẩu, băm ra sẽ cùng một chuỗi. Kẻ có dữ liệu nhìn thấy ngay những ai dùng chung mật khẩu. Tệ hơn, họ có thể chuẩn bị sẵn bảng băm của hàng triệu mật khẩu phổ biến, rồi chỉ việc tra.

Muối là một chuỗi ngẫu nhiên riêng cho từng người, được trộn vào mật khẩu trước khi băm. Hai người cùng mật khẩu nhưng khác muối sẽ ra hai chuỗi băm khác hẳn. Bảng chuẩn bị sẵn trở nên vô dụng, vì kẻ tấn công phải tính lại cho từng người.

Muối không cần giữ bí mật, nó được lưu ngay cạnh chuỗi băm. Tác dụng của nó không phải là bí mật, mà là làm mỗi mật khẩu thành một bài toán riêng.

Tin vui là các hàm băm mật khẩu hiện đại tự tạo muối và tự lưu muối kèm trong kết quả. Bạn không cần làm gì thêm, chỉ cần dùng đúng hàm.

Đừng tự chế, và những việc đi kèm

Lời khuyên quan trọng nhất: đừng tự chế cách băm mật khẩu. Đừng băm hai lần cho chắc, đừng tự ghép muối theo cách của mình, đừng tự nghĩ ra thuật toán. Mật mã học đầy những cái bẫy mà người không chuyên không thấy. Hãy dùng hàm băm mật khẩu có sẵn trong ngôn ngữ hoặc thư viện được cộng đồng tin dùng rộng rãi.

Ngoài chuyện lưu, còn vài việc đi kèm. Giới hạn số lần đăng nhập sai liên tiếp để chặn việc đoán qua mạng. Chức năng quên mật khẩu gửi đường dẫn đặt lại có thời hạn ngắn, dùng một lần, không bao giờ gửi mật khẩu.

Đừng ghi mật khẩu vào nhật ký, kể cả nhật ký lỗi khi đăng nhập thất bại. Rất nhiều vụ lộ mật khẩu đến từ nhật ký chứ không phải từ cơ sở dữ liệu.

Và khuyến khích người dùng bật xác thực hai lớp. Mật khẩu có lưu tốt đến đâu thì người dùng vẫn có thể bị lừa gõ nó vào một trang giả. Lớp thứ hai là tấm lưới cuối cùng.

Câu hỏi thường gặp

Băm mật khẩu là gì?

Là biến mật khẩu thành một chuỗi cố định theo một chiều, không giải ngược được. Khi đăng nhập, hệ thống băm mật khẩu vừa nhập và so với chuỗi đã lưu thay vì lưu mật khẩu gốc.

Vì sao không nên mã hoá mật khẩu?

Vì mã hoá có thể giải ngược nếu có chìa khoá, và chìa khoá thường nằm cùng hệ thống. Kẻ lấy được dữ liệu có thể lấy luôn chìa khoá và đọc được mọi mật khẩu.

Muối trong băm mật khẩu là gì?

Là chuỗi ngẫu nhiên riêng cho từng người, trộn vào mật khẩu trước khi băm để hai người cùng mật khẩu có chuỗi băm khác nhau. Các hàm băm mật khẩu hiện đại tự tạo và lưu muối.

Làm sao biết một trang web lưu mật khẩu sai?

Nếu chức năng quên mật khẩu gửi lại đúng mật khẩu cũ của bạn qua thư hoặc tin nhắn, trang đó đang lưu mật khẩu ở dạng đọc được. Nên đổi mật khẩu và không dùng lại mật khẩu đó ở nơi khác.

Có nên tự viết thuật toán băm mật khẩu riêng không?

Không nên. Hãy dùng hàm băm mật khẩu có sẵn trong thư viện đáng tin. Thuật toán tự chế thường có điểm yếu mà người không chuyên về mật mã không nhận ra.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.