Viết câu “chúng tôi không lưu mật khẩu của bạn” lên một trang web tốn đúng bằng viết bất cứ câu nào khác: không gì cả. Đó là một câu chữ, không phải một bảo đảm. Người nói thật viết nó, người nói dối cũng viết nó, và từ phía bên này màn hình thì hai câu đó giống hệt nhau.
Đó là vấn đề cốt lõi của mọi trang web đòi mật khẩu của bạn để “phân tích”. Cho dù dịch vụ ấy hoàn hảo — mã sạch, thiện chí, người tử tế — bạn vẫn không có cách nào biết được. Máy chủ là một chiếc hộp đóng kín. Bạn gửi đi thứ dữ liệu nhạy cảm nhất mình có và tin rằng ở đầu bên kia mọi việc diễn ra đúng như lời hứa.
Và có một chi tiết thường bị bỏ qua: lời hứa không lưu cũng chẳng bảo vệ bạn khỏi những thứ nằm ngoài tầm tay người hứa. Một máy chủ trung thực vẫn có thể có log không ai ngó tới, một proxy trung gian, một bản sao lưu tự động, một nhân viên mới vào, hoặc đơn giản là một ngày xui xẻo. Mật khẩu đã rời khỏi máy bạn rồi. Chuyện xảy ra sau đó nằm ngoài tầm với của bạn, và nhiều khi cũng nằm ngoài tầm với của họ.
Câu trả lời duy nhất không đòi bạn phải tin điều gì
Giải pháp không phải là hứa hay hơn. Mà là không cần đến dữ liệu đó.
Nếu mật khẩu của bạn không bao giờ rời khỏi trình duyệt, câu hỏi “họ làm gì với nó?” mất hết ý nghĩa. Không có “họ”. Không có máy chủ nào nhận nó, không có log nào ghi nó, không có bản sao lưu nào chứa nó, không có nhân viên nào đọc được nó. Niềm tin không được quản lý tốt hơn: nó bị loại khỏi bài toán.
Đó là điều password.es làm. Trình kiểm tra phân tích thứ bạn gõ ngay trong trình duyệt của bạn, bằng bộ xử lý của bạn. Đoạn chữ bạn gõ không đi đâu cả, vì chẳng có nơi nào để đi.
Sự ngẫu nhiên đến từ đâu
Bộ tạo mật khẩu cũng theo đúng lối nghĩ ấy. Muốn tạo một mật khẩu ngẫu nhiên thì cần sự ngẫu nhiên, và có hai cách để có nó: xin máy chủ hoặc xin trình duyệt. Xin máy chủ thì vô lý: máy chủ sẽ biết mật khẩu trước cả bạn.
Nên chúng tôi xin trình duyệt, bằng crypto.getRandomValues(). Đây là API tiêu
chuẩn của nền tảng web dành cho tính ngẫu nhiên mật mã — thứ sinh ra chính là để
làm việc này, khác với Math.random(), vốn hợp để xáo bài trong một trò chơi chứ
không hợp với bất cứ thứ gì phải chống lại một người có ý đồ. Người tạo ra sự
ngẫu nhiên là chính trình duyệt, trên máy của bạn. Chúng tôi không tham gia: kết
quả hiện lên màn hình bạn và nằm yên ở đó.
Cách kiểm chứng mà không cần tin tôi
Mọi thứ ở trên, cho đến lúc này, vẫn chỉ là mấy đoạn văn do chính những người làm ra trang web viết. Tức là: đúng cái thứ mà tôi vừa bảo bạn đừng tin. Vậy nên đừng tin tôi. Hãy nhìn.
Mở công cụ dành cho nhà phát triển của trình duyệt — F12, hoặc Cmd+Option+I
trên máy Mac — vào tab Mạng (Network), để nguyên đó rồi vào trình kiểm tra.
Bạn sẽ thấy trang tải về. Giờ xóa sạch danh sách, bấm vào ô nhập mật khẩu và gõ.
Đây là thứ bạn sẽ thấy, và ở chỗ này nên nói cho chính xác thay vì nói cho hay:
- Khi bạn bấm vào ô nhập, có một yêu cầu được gửi đi. Đó không phải mật khẩu
của bạn — bạn còn chưa gõ gì mà — mà là thư viện làm nhiệm vụ phân tích, một
tệp tên
zxcvbn-_base.min.jsmang sẵn bên trong các danh sách từ, tên riêng, mẫu bàn phím và những mật khẩu đã bị lộ để đem ra đối chiếu. Nó tải về từ password.es ngay khi bạn chạm vào ô, để kịp có mặt trong lúc bạn gõ. Nó đi ra từ chính tên miền này, là một tệp tĩnh và giống hệt nhau với mọi người mở trang này — trang web có nhiều phiên bản tùy theo ngôn ngữ, và bản tiếng Việt tải bộ cơ sở. - Từ đó trở đi, bạn gõ gì thì gõ, danh sách vẫn nằm im. Một chữ cái, hai mươi chữ, xóa đi, gõ lại từ đầu, dán vào một đoạn dài. Không một yêu cầu nào. Bộ đếm không nhúc nhích. Từ điển đã nằm sẵn trong trình duyệt của bạn và việc tra cứu diễn ra với bộ nhớ của máy bạn.
Khác biệt nằm trọn ở chỗ đó. Không phải là bạn tin rằng yêu cầu kia không mang theo mật khẩu của bạn: mà là chẳng có yêu cầu nào cả. Không cần diễn giải gì, cũng không cần hiểu mã nguồn; chỉ cần nhìn một cái bộ đếm không tăng.
Bản kiểm kê đầy đủ, kể cả chỗ dở
Đã lấy lý lẽ là “cứ kiểm tra đi” thì giấu đi những gì bạn sẽ tìm thấy khi kiểm tra là chuyện lạ đời. Bản kiểm kê trung thực của password.es:
Không có analytics. Không Google Analytics, không một lựa chọn kín đáo nào khác, không pixel. Từng có một cái và nó đã bị gỡ khỏi mọi trang. Không có cookie. Trang web không ghi cái nào. Có đúng một thứ được lưu trong trình duyệt của bạn: nếu bạn thích giao diện sáng hay tối, nó nằm trong bộ nhớ cục bộ trên chính máy bạn. Nó không bao giờ được gửi đi đâu và bạn xóa được ngay từ công cụ kiểm tra đó. Không có đăng ký, không tài khoản, không biểu mẫu: có muốn để lại dữ liệu cũng chẳng có chỗ mà để.
Và chỗ dở, vì có thật: trang này xin hai bộ phông chữ từ máy chủ của Google khi tải. Nghĩa là Google thấy có ai đó với IP của bạn đã tải một trang thuộc tên miền này, giống như ở vô số trang web khác. Google không thấy thứ bạn gõ — yêu cầu ấy xảy ra trước đó và không lặp lại nữa — nhưng nó vẫn là một yêu cầu tới bên thứ ba, bạn sẽ thấy nó ngay trong tab Mạng kia, và sẽ chẳng có nghĩa lý gì nếu vừa bảo bạn mở công cụ kiểm tra vừa không nhắc đến nó. Nó nằm trong danh sách những thứ cần sửa.
Vì sao chúng tôi kể chuyện này
Chúng tôi đã có thể viết “không một yêu cầu nào, riêng tư tuyệt đối” rồi ung dung ngồi đó. Nghe sẽ hay hơn, và sẽ sai ở phần chi tiết: có một yêu cầu tải từ điển và có mấy bộ phông chữ. Một lý lẽ đổ sụp khi có người đi kiểm chứng thì không phải lý lẽ: đó là quảng cáo.
Phiên bản chính xác thì kém tròn trịa hơn nhưng chịu được soi xét: thứ bạn gõ không rời khỏi trình duyệt của bạn, và điều đó nhìn thấy được trong ba mươi giây bằng một công cụ bạn đã cài sẵn.
Mà này, vì chuyện này quay lại thành một tiêu chí chung cho bạn. Lần tới, khi một trang web đòi mật khẩu của bạn để làm gì đó, hãy mở tab kia ra và xem có yêu cầu nào hiện lên mỗi lần bạn gõ một phím không. Nếu có, mật khẩu của bạn đi rồi. Bản thông báo quyền riêng tư viết gì cũng mặc kệ, cái ổ khóa trên biểu mẫu xinh cỡ nào cũng mặc kệ, công ty trông nghiêm túc đến đâu cũng mặc kệ. Còn nếu trang web hiện ra mật khẩu đã phân tích xong sau một vòng quay chờ, thì bạn biết nó vừa đi qua đâu rồi đấy.
Quy tắc ít được nói tới nhất trong bảo mật không phải về mật khẩu: nó về việc kiểm chứng. Tin tưởng thì tốt. Kiểm chứng thì tốt hơn, và ở đây thì miễn phí.
Nguồn: kiến trúc của chính password.es, kiểm chứng được bằng công cụ kiểm tra
của bất kỳ trình duyệt nào — khi bạn đưa con trỏ vào ô nhập, trình kiểm tra tải
từ chính tên miền này thư viện phân tích cùng các danh sách của nó
(zxcvbn-_base.min.js) và không phát ra yêu cầu nào trong lúc bạn gõ ·
crypto.getRandomValues(), API tiêu chuẩn của Web Crypto API cho tính ngẫu nhiên
mật mã · mã nguồn của trang không chứa analytics, pixel hay cookie; dữ liệu duy
nhất lưu cục bộ là tùy chọn giao diện · các bộ phông chữ được phục vụ từ Google
Fonts.