Công cụ mật khẩu Quay lại trình tạo

Hướng dẫn bảo mật

Tại sao Math.random không an toàn cho mật khẩu

Tìm hiểu lý do Math.random phù hợp cho hiệu ứng giao diện nhưng không dùng cho mật khẩu, mã đặt lại, token hoặc các bí mật nhạy cảm về bảo mật.

Tóm tắt

Math.random() là một hàm giả ngẫu nhiên JavaScript tổng quát. Nó hữu ích cho hoạt ảnh, hành vi giao diện ngẫu nhiên, ví dụ, trò chơi và mô phỏng. Nó không được chỉ định cho bảo mật mật mã và không nên được sử dụng để tạo mật khẩu, mã đặt lại, bí mật API, khóa ký hoặc token khôi phục.

Vấn đề

Trình tạo mật khẩu cần tính không thể đoán trước trước kẻ tấn công, không chỉ đơn thuần là các giá trị trông đa dạng với người dùng. Math.random() không cung cấp đảm bảo bảo mật mật mã theo tiêu chuẩn trình duyệt và cách triển khai có thể khác nhau giữa các engine.

Tùy chọn an toàn hơn trên trình duyệt

Trình duyệt hiện đại cung cấp crypto.getRandomValues() thông qua Web Crypto API. PwdGen sử dụng giao diện đó và lấy mẫu loại bỏ (rejection sampling), tránh chọn ký tự thiên lệch. Nếu API đó không khả dụng, hành vi an toàn là dừng tạo và giải thích yêu cầu tương thích.

Cách kiểm tra trình tạo

Tìm kiếm mã nguồn cho Math.random. Một trình tạo mật khẩu nghiêm túc không nên sử dụng nó cho các ký tự mật khẩu. Nó có thể xuất hiện trong tài liệu giải thích tại sao nó không an toàn, nhưng không nằm trong đường dẫn tạo.

Hướng dẫn chi tiết

Hướng dẫn này tập trung vào lý do Math.random không phù hợp cho mật khẩu và bí mật. Nó được viết cho nhà phát triển, sinh viên và người dùng công cụ kiểm tra xem trình tạo có sử dụng tính ngẫu nhiên an toàn hay không, vì vậy mục tiêu thực tế không phải là tạo ra một tuyên bố bảo mật gây sốc. Mục tiêu là chọn một thói quen mật khẩu có thể tồn tại trong sử dụng hàng ngày: biểu mẫu đăng nhập, trình quản lý mật khẩu, bàn phím di động, khôi phục tài khoản, thiết bị dùng chung và đôi khi là dịch vụ có quy tắc xác thực kỳ lạ. Một khuyến nghị an toàn chỉ hữu ích nếu một người thực có thể tuân theo nó một cách nhất quán.

Điểm khởi đầu an toàn nhất là tính ngẫu nhiên cộng với tính duy nhất. Ngẫu nhiên có nghĩa là giá trị được chọn từ một không gian lớn bởi một nguồn ngẫu nhiên phù hợp về mặt mật mã, không phải được phát minh từ ngày sinh, tên thú cưng, mẫu bàn phím hoặc câu trích dẫn yêu thích. Duy nhất có nghĩa là cùng một mật khẩu không được sử dụng ở bất kỳ nơi nào khác. Một mật khẩu dài nhưng được sử dụng lại có thể thất bại nhanh chóng sau một vụ vi phạm không liên quan, trong khi một mật khẩu ngẫu nhiên duy nhất giới hạn thiệt hại cho tài khoản duy nhất nơi nó được sử dụng.

Đối với chủ đề này, một thiết lập thực tế là crypto.getRandomValues với lấy mẫu loại bỏ thay vì Math.random. Bạn có thể áp dụng thiết lập đó với hướng dẫn Web Crypto API và sau đó lưu trữ giá trị cuối cùng trong một trình quản lý mật khẩu đáng tin cậy. PwdGen tạo giá trị cục bộ trong trình duyệt với Web Crypto; mật khẩu được tạo không được gửi đến máy chủ PwdGen. Thiết kế cục bộ đó giảm thiểu rủi ro phía máy chủ, nhưng nó không bảo vệ khỏi mọi mối đe dọa. Một tiện ích mở rộng trình duyệt độc hại, thiết bị bị xâm phạm, trang lừa đảo hoặc xử lý clipboard không an toàn vẫn có thể làm lộ bí mật sau khi nó được tạo.

Các vấn đề phổ biến nhất cần tránh là các chuỗi giả ngẫu nhiên có thể dự đoán, thiên lệch modulo, hàm ngẫu nhiên tùy chỉnh và mã demo được sao chép vào sản xuất. Những vấn đề này quan trọng vì kẻ tấn công hiếm khi cần brute-force mọi mật khẩu có thể khi thói quen con người cho chúng một lối tắt. Nhồi nhét thông tin đăng nhập (credential stuffing), lừa đảo, danh sách mật khẩu bị rò rỉ và lạm dụng khôi phục tài khoản thường thực tế hơn một tìm kiếm toán học thuần túy. Đó là lý do tại sao lời khuyên tốt nhất kết hợp chất lượng mật khẩu với các biện pháp kiểm soát cấp tài khoản như MFA, passkey, lưu trữ mã khôi phục và kiểm tra thường xuyên email hoặc số điện thoại khôi phục.

Sử dụng danh sách kiểm tra này khi áp dụng khuyến nghị:

Nếu một trang web từ chối thiết lập lý tưởng, đừng ép mật khẩu vào một mẫu yếu hơn bằng tay. Điều chỉnh một biến tại một thời điểm. Nếu ký tự đặc biệt bị từ chối, giữ chữ hoa, chữ thường và số được bật và tăng độ dài. Nếu độ dài tối đa thấp, sử dụng độ dài được chấp nhận lớn nhất và đảm bảo giá trị là duy nhất. Nếu mật khẩu phải được đọc to, in ra hoặc gõ trên màn hình tivi hoặc bộ định tuyến, hãy cân nhắc loại trừ các ký tự gây nhầm lẫn và tăng độ dài để bù đắp cho bảng chữ cái nhỏ hơn.

Cuối cùng, hãy nhớ ranh giới của lời khuyên về mật khẩu. Một mật khẩu mạnh là một lớp phòng thủ, không phải là sự đảm bảo. Nó không thể làm cho một trang lừa đảo an toàn, sửa phần mềm độc hại hoặc bù đắp cho một dịch vụ lưu trữ thông tin xác thực kém. Thói quen hữu ích là nhàm chán nhưng bền vững: tạo một giá trị duy nhất, lưu trữ an toàn, bảo vệ đường dẫn khôi phục và thay thế nhanh chóng nếu bạn nghi ngờ bị lộ.

Một bước tiếp theo an toàn

Sau khi đọc hướng dẫn này, hãy thực hiện một cuộc kiểm tra tài khoản nhỏ thay vì cố gắng sửa mọi thứ cùng một lúc. Chọn tài khoản sẽ gây rắc rối nhất nếu bị chiếm quyền điều khiển, xác nhận mật khẩu của nó là duy nhất và kiểm tra email khôi phục, số điện thoại khôi phục, phương thức MFA và lưu trữ mã dự phòng. Nếu bất kỳ phần nào của chuỗi đó yếu, hãy cải thiện phần đó trước khi chuyển sang các tài khoản rủi ro thấp hơn. Thứ tự này giữ cho công việc có thể quản lý được và bảo vệ các tài khoản mà kẻ tấn công có nhiều khả năng sử dụng làm bước đệm. Đối với lý do math.random không an toàn cho mật khẩu, kết quả tốt nhất là một thói quen có thể lặp lại: tạo cục bộ, lưu trữ cẩn thận và tránh sử dụng lại.

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

Math.random có bao giờ được chấp nhận không?

Có, cho hiệu ứng hình ảnh, mô phỏng và tính ngẫu nhiên giao diện thông thường, nhưng không cho thông tin đăng nhập hoặc token bảo mật.

Trình tạo mật khẩu nên sử dụng gì thay thế?

Chúng nên sử dụng nguồn ngẫu nhiên mật mã như crypto.getRandomValues() trong trình duyệt.

PwdGen có dự phòng sang Math.random không?

Không. Nếu Web Crypto không khả dụng, PwdGen hiển thị cảnh báo tương thích và không tạo mật khẩu với Math.random().

Nguồn