Mật khẩu mã hóa hay không mã hóa?
Có hai phương thức xác thực mật khẩu dưới dạng mã hóa:
- Dùng mật khẩu mã hóa trên một kết nối không mã hóa
- Dùng mật khẩu không mã hóa trên một kết nối mã hóa
Cách thứ nhất rõ ràng là không khuyến khích sử dụng. Điển hình là mech CRAM-MD5.
Cách thứ hai, xác thực trên một kết nối mã hóa với bộ cipher, ví dụ TLS_AES_256_GCM_SHA384 của phiên bản TLSv1.3 là an toàn.
Nói đến TLS là nói đến xác thực thực thể bằng chứng chỉ kỹ thuật số, ít nhất là áp dụng đối với server với chứng chỉ server.
Với TLSv1.3 khóa phiên được tạo một cách ngẫu nhiên chớp nhoáng (ephemeral) sử dụng kỹ thuật bí mật chuyển tiếp hoàn hảo (Perfect Forward Secrecy), điều này đảm bảo khóa phiên không lặp lại. Như thế, lấy ví dụ nếu khóa phiên bị lộ nó cũng không ảnh hưởng gì đến dữ liệu của một phiên khác. Tương tự như vậy, vì khóa phiên không liên quan gì đến khóa riêng của server nên nếu server bị thỏa hiệp thì khóa riêng của server không thể giải mã dữ liệu đã bị capture trước đó.
Khóa phiên dùng để làm gì?
Nó là key của cipher mã hóa đối xứng, dùng để mã hóa dữ liệu (lớn) liên lạc, cipher ở đây là AES 256 bít. Chế độ hoạt động của cipher là counter (GCM – Galois Counter Mode). Cho nên AES_256_GCM đi thành một cụm.
Dữ liệu mã hóa đối xứng không đảm bảo tính toàn vẹn.
Chưa có gì đảm bảo dữ liệu mà người nhận thu được là nguyên vẹn. Từ đây xuất hiện khái niệm mã hóa có xác thực (Authenticated Encryption). Công việc này được thực hiện bởi sử dụng hàm băm SHA384.
Xác thực mật khẩu như thế nào?
Đây là server xác thực khách, xem khách có giấy chứng nhận để sử dụng dịch vụ yêu cầu xác thực của nó hay không. Trên một kết nối TLS, mật khẩu và các thông tin yêu cầu xác thực khác được khách trình đến server như một giao dịch thông thường. Mọi dữ liệu đã được mã hóa một cách an toàn như trên. Nếu xác thực thành công, khách trở thành người dùng đã xác thực (authenticated user). Điều này áp dụng đối với mọi dịch vụ sử dụng kết nối TLS.
Như vậy là mật khẩu không mã hóa an toàn hơn mật khẩu mã hóa.
Kỹ thuật xác thực
Có một số kỹ thuật xác thực khác nhau, nhưng như chúng ta đã biết sẽ không có vấn đề gì khi sử dụng kỹ thuật PLAIN trên một kết nối TLS (tất nhiên xác thực mfa là một chủ đề khác).
Để thực hành, hãy telnet đến máy chủ thư omarine.org:
telnet omarine.org 25
Sau đó gõ lệnh EHLO:
EHLO localhost
Tiếp theo, vào lệnh xác thực:
AUTH PLAIN 12345678
Bạn sẽ nhận được thông báo
503 TLS encryption or CRAM-MD5 required

Điều đó có nghĩa là điều kiện để xác thực là kết nối TLS hoặc sử dụng kỹ thuật xác thực CRAM-MD5. Chúng ta kết nối đến cổng 25 không mã hóa nên bị từ chối.
Có gì mâu thuẫn ở đây?
Thực ra tôi đã cấu hình máy chủ chỉ chấp nhận xác thực trên kết nối TLS, còn CRAM-MD5 chỉ là một thông báo mà tôi chưa sửa. Có cần sửa không? không cần.
Thông báo lỗi chỉn chu là lỗ hổng cho tấn công error.
Để thực hiện kết nối TLS đến máy chủ thư omarine.org, bạn chạy lệnh này:
openssl s_client -connect omarine.org:25 -starttls smtp
