Hướng dẫn bảo mật
Tạo mật khẩu phía client với Web Crypto và lấy mẫu loại bỏ
Một tài liệu kỹ thuật giải thích mô hình tạo mật khẩu phía trình duyệt của PwdGen, ranh giới entropy, lấy mẫu loại bỏ và giới hạn quyền riêng tư.
Tóm tắt
PwdGen sử dụng phương pháp tạo tham chiếu phía client: Web Crypto của trình duyệt hoặc runtime cung cấp các byte ngẫu nhiên, lấy mẫu loại bỏ ánh xạ các byte đó thành các chỉ số có giới hạn không thiên lệch, và hoán vị Fisher-Yates phân phối các lớp ký tự yêu cầu trong mật khẩu cuối cùng. Phương pháp này có chủ đích nhỏ gọn, có thể kiểm tra và tái tạo trên ứng dụng web, bộ điều hợp API, CLI và gói pwdgen-core đã chuẩn bị.
Tài liệu này mô tả mô hình kỹ thuật. Nó không phải là tuyên bố về một nguyên thủy mật mã mới, một tiêu chuẩn chính thức, hay một cuộc kiểm toán độc lập bên thứ ba.
Nguồn ngẫu nhiên
Trình tạo yêu cầu các giá trị ngẫu nhiên mạnh về mặt mật mã thông qua crypto.getRandomValues(). Các triển khai Web Crypto được kỳ vọng sử dụng bộ sinh số ngẫu nhiên giả an toàn mật mã (CSPRNG) được gieo bằng entropy chất lượng cao do môi trường chủ cung cấp. Trong thực tế, trình duyệt ủy thác trách nhiệm này cho các cơ sở hệ điều hành và nhà cung cấp mật mã nền tảng.
PwdGen không tuyên bố rằng mọi lệnh gọi tạo mật khẩu đều trực tiếp lấy mẫu từ nguồn nhiễu phần cứng. Phát biểu an toàn và chính xác hơn là trình duyệt cung cấp đầu ra CSPRNG thông qua Web Crypto API, và PwdGen tránh các giao diện ngẫu nhiên giả không mật mã.
Tại sao không dùng Math.random()
Math.random() không được chỉ định cho mục đích nhạy cảm với bảo mật. Nó phù hợp cho mô phỏng, hiệu ứng hình ảnh và hành vi UI ngẫu nhiên thông thường, nhưng không cung cấp các đảm bảo mong đợi cho mật khẩu, mã đặt lại, khóa ký hoặc các thông tin xác thực khác.
PwdGen coi các phương án dự phòng ngẫu nhiên giả không an toàn là trạng thái lỗi. Nếu Web Crypto không khả dụng, trình tạo sẽ hiển thị lỗi tương thích thay vì âm thầm tạo ra các thông tin xác thực yếu.
Lấy mẫu loại bỏ
Các byte và số nguyên ngẫu nhiên thường được lấy từ một phạm vi lũy thừa của 2. Bảng chữ cái mật khẩu hiếm khi có kích thước chia hết chính xác phạm vi đó. Một phép toán modulo trực tiếp có thể làm cho một số ký tự có xác suất xuất hiện cao hơn một chút so với các ký tự khác.
PwdGen sử dụng lấy mẫu loại bỏ:
- Lấy một số nguyên không dấu 32-bit.
- Tính bội số lớn nhất của kích thước bảng chữ cái nằm trong phạm vi 32-bit.
- Loại bỏ các giá trị trên ranh giới đó.
- Chỉ áp dụng modulo cho phạm vi hoàn chỉnh còn lại.
Điều này giữ cho việc chọn ký tự có giới hạn là đồng nhất mà không gây ra thiên lệch modulo có thể đo lường được.
Phạm vi ký tự và entropy
Đối với các chính sách mật khẩu đã cấu hình, trình tạo trước tiên chọn một ký tự từ mỗi lớp được kích hoạt, điền phần còn lại từ bảng chữ cái kết hợp, sau đó hoán vị kết quả. Điều này giúp đáp ứng các quy tắc mật khẩu đích mà không đặt một lớp có thể dự đoán ở một vị trí có thể dự đoán.
Ước tính entropy lý thuyết là:
bits = length × log2(uniqueAlphabetSize)
Giá trị đó là giới hạn trên cho các lựa chọn ngẫu nhiên đồng nhất từ bảng chữ cái đã cấu hình. Nó không tính đến việc sử dụng lại mật khẩu, đầu ra do người dùng chỉnh sửa, thiết bị bị xâm phạm, mật khẩu bị rò rỉ hoặc lưu trữ yếu bởi dịch vụ đích.
Ranh giới quyền riêng tư
Trong các công cụ trình duyệt, các giá trị được tạo vẫn nằm trong bộ nhớ trang và các trường kết quả hiển thị cho đến khi người dùng sao chép hoặc xuất chúng. Các trình tạo cục bộ không gửi mật khẩu đã tạo đến máy chủ PwdGen, đưa chúng vào URL hoặc ghi chúng vào các sự kiện phân tích.
Ranh giới này không bảo vệ chống lại các tiện ích mở rộng trình duyệt độc hại, trình quản lý clipboard, sự xâm phạm hệ điều hành, chụp màn hình, trang lừa đảo hoặc người dùng dán mật khẩu đã tạo vào một đích không an toàn.
Triển khai có thể tái tạo
Gói pwdgen-cli công khai và gói pwdgen-core đã chuẩn bị tồn tại để giữ cho mô hình tạo có thể kiểm tra bên ngoài trang web. Các bài kiểm tra đơn vị bao gồm việc bao gồm các lớp ký tự, ký tự bị loại trừ, cấu hình không hợp lệ, công thức entropy và sự vắng mặt của các đường dẫn mã dự phòng ngẫu nhiên giả không an toàn.
Mục tiêu không phải là biến PwdGen thành một tiêu chuẩn riêng. Mục tiêu là làm cho việc triển khai đủ nhỏ để các nhà phát triển có thể đọc, kiểm tra và thay thế nó khi môi trường của họ yêu cầu một ranh giới tin cậy khác.