Tiếng Việt

Văn bản & công cụ hàng ngày · Trình tạo mật khẩu

crypto.getRandomValues so với Math.random: tại sao mật khẩu lại quan trọng

· Cách thức hoạt động

mật khẩu web-crypto sự ngẫu nhiên

Một đường dẫn ngẫu nhiên yếu kết thúc trong khi đường dẫn Web Crypto tiếp tục đi vào các ký hiệu mật khẩu
Hình minh họa vector ToolAcre gốc

Giải thích sự khác biệt giữa trình tạo số ngẫu nhiên có mục đích chung của trình duyệt và trình tạo số ngẫu nhiên của trình duyệt, tại sao khả năng dự đoán lại gây tử vong cho mật khẩu và cách biết công cụ nào sử dụng.

Đủ ngẫu nhiên cho trò chơi súc sắc, không phải cho mật khẩu - hai loại ngẫu nhiên mà trình duyệt cung cấp

Một trình duyệt có thể cung cấp nhiều nguồn giá trị có vẻ bất thường nhưng sự rối loạn về hình ảnh không phải là bằng chứng cho thấy một chuỗi phù hợp với thông tin xác thực. ToolAcre vạch ra ranh giới sản phẩm cứng: mọi lựa chọn từ, lựa chọn dấu phân cách, lựa chọn ký tự và hoán đổi ngẫu nhiên đều đi qua một hàm số nguyên an toàn được hỗ trợ bởi `crypto.getRandomValues`. Nếu không thể sử dụng API đó thì trang sẽ vô hiệu hóa việc tạo thay vì tạo ra nội dung thay thế có vẻ hợp lý.

Sự từ chối đó quan trọng hơn việc hai kết quả đầu ra mẫu có vẻ lộn xộn như nhau hay không. Một nguồn có thể đoán trước vẫn có thể in các chữ cái, chữ số và từ có vẻ thuyết phục đối với một người. Do đó, việc triển khai làm cho nguồn có thể kiểm tra được và lỗi có thể nhìn thấy được. Nó không khẳng định rằng mọi giá trị được tạo ra đều an toàn cho mọi môi trường; trình duyệt hoặc thiết bị bị xâm nhập vẫn có thể đọc nội dung trang hiển thị.

Math.random dùng để làm gì - tính giả ngẫu nhiên được tạo mầm nhanh, có kết quả có thể được xây dựng lại từ một vài quan sát

Sổ làm việc mô tả Math.random dưới dạng giả ngẫu nhiên được tạo mầm có thể được xây dựng lại từ một vài quan sát, nhưng đó là những xác nhận triển khai chung mà kho lưu trữ này không thiết lập cho mọi công cụ JavaScript. Thực tế cục bộ đối với sản phẩm này đơn giản và mạnh mẽ hơn: các tệp trình tạo sản xuất không gọi `Math.random`. Kiểm tra cấp nguồn sẽ loại bỏ nhận xét, quét mã thực thi và không thành công nếu lệnh gọi như vậy xuất hiện ở bất kỳ đâu trong công cụ hoặc ứng dụng mật khẩu.

Sự khác biệt này khiến bài viết không thể biến một quy tắc triển khai thành một bài giảng về lịch sử trình duyệt phổ quát. ToolAcre không cần mô tả mọi thuật toán Math.random có thể để từ chối API để tạo mật khẩu. Gói của nó chấp nhận Web Crypto hoặc nguồn an toàn được đưa vào được sử dụng bởi các thử nghiệm và không đưa ra tùy chọn sản xuất nào cho chế độ hạt giống, chế độ xác định hoặc dự phòng yếu.

Kho lưu trữ này chứng minh điều gì về Math.random: nó không có trong quá trình tạo sản phẩm

`createWebCryptoSource` tìm kiếm `getRandomValues` có thể gọi được, sau đó gói phương thức đó làm nguồn ngẫu nhiên của gói. Ứng dụng thực hiện một cuộc thăm dò bổ sung trước khi kích hoạt các điều khiển: nó yêu cầu đối tượng mật mã toàn cầu điền vào một mảng được gõ một phần tử bên trong khối thử. Điều đó nắm bắt các môi trường bị hạn chế nơi thuộc tính tồn tại nhưng bị ném khi sử dụng, thay vì tin tưởng vào việc kiểm tra tính năng hời hợt.

Nguồn dừng ở ranh giới API của trình duyệt. Nó không chứng minh nhóm hệ điều hành, hướng dẫn phần cứng hoặc thiết kế gieo hạt nào nằm bên dưới một trình duyệt cụ thể. Những chi tiết đó khác nhau bên dưới giao diện và cần có tài liệu về nền tảng. Điều mà mã này chứng minh là các byte đến thông qua phương thức Web Crypto có tên và việc tạo đó không được thực hiện khi thăm dò thất bại.

Công việc crypto.getRandomValues thực hiện ở đây: điền vào các mảng đã nhập thông qua trình duyệt API

Khả năng dự đoán là nguy hiểm vì trình tạo thông tin xác thực được cho là đưa ra các lựa chọn mới mà người quan sát không thể sao chép từ đầu ra trước đó. ToolAcre hỗ trợ mục tiêu đó bằng cách từ chối các lộ trình sản xuất xác định, tập trung mọi lần rút thăm và kiểm tra xem API yếu có vắng mặt không. Nó không hứa hẹn khả năng miễn nhiễm khỏi chụp màn hình, tiện ích mở rộng, phần mềm độc hại, lừa đảo, sử dụng lại mật khẩu hoặc dịch vụ xử lý sai thông tin xác thực sau khi gửi.

Ranh giới đó ngăn ngừa một lỗi danh mục phổ biến: thế hệ giải quyết cách chọn một ứng cử viên chứ không phải mọi thứ xảy ra với nó sau này. Gói trả về một chuỗi và không ghi nhật ký hoặc lưu trữ chuỗi đó. Trang giữ một giá trị hiện tại trong bộ nhớ và hiển thị nó dưới dạng văn bản. Chính sách lưu trữ, truyền tải, khôi phục tài khoản và xác thực mật khẩu vẫn là trách nhiệm của các hệ thống khác.

Đọc mã - cách kiểm tra API nào một trang sử dụng và tại sao các trang mở, có thể kiểm tra lại dễ tin cậy hơn

Việc đọc mã bắt đầu ở `packages/password-generator/src/index.js`, trong đó hợp đồng cho biết mọi quyết định ngẫu nhiên đều đạt `secureRandomInt`. Sau đó, tệp triển khai sẽ hiển thị `getRandomValues`, lấy mẫu từ chối và các lỗi rõ ràng. Cuối cùng, `no-math-random.test.js` và bộ bảo mật mật khẩu rộng hơn giúp đảm bảo phủ định có thể thực thi được thay vì để lại “chúng tôi không bao giờ sử dụng Math.random” làm nhận xét chưa được kiểm tra.

Chỉ riêng nguồn mở không làm cho mã trở nên chính xác nhưng nó cung cấp cho người đánh giá các đường nối cụ thể để kiểm tra. Tìm kiếm nguồn ngẫu nhiên, theo dõi người gọi thông qua các lựa chọn và ngẫu nhiên, đồng thời kiểm tra điều gì sẽ xảy ra khi thiếu API. Một đánh giá đáng tin cậy sẽ có thể nêu tên cả con đường thành công và con đường từ chối thay vì suy ra sự an toàn từ việc xây dựng thương hiệu.

Ví dụ hoạt động - cùng một quy trình chọn từ được viết theo cả hai cách và những gì kẻ tấn công có thể làm với mỗi cách

Hãy xem xét yêu cầu số nguyên bên dưới 100. `secureRandomInt` cần một byte có phạm vi chứa các giá trị 256. Nó chỉ chấp nhận tiền tố lớn nhất chia hết cho 100, tiền tố này kết thúc trước 200 và từ chối phần đuôi còn lại. Kiểm tra xác định cung cấp byte 200 theo sau là byte 7. Quá trình triển khai loại bỏ 200 và trả về 7; một phím tắt modulo trực tiếp sẽ trả về 0 từ byte bị từ chối.

Hàm số nguyên an toàn tương tự chọn các chỉ số cho các từ và ký tự, vì vậy ví dụ này không phải là một món đồ chơi tách rời khỏi thế hệ. Các byte chính xác trong quá trình sản xuất không phải là ví dụ có thể lặp lại và không bao giờ được xuất bản dưới dạng thông tin xác thực. Tạo tác hữu ích là bằng chứng về luồng điều khiển: Web Crypto lấp đầy bộ đệm, phần đuôi không đồng đều bị từ chối và chỉ giá trị được chấp nhận mới trở thành lựa chọn giới hạn.

Ví dụ đã hoạt động: theo dõi một lần rút giới hạn thông qua đường dẫn SecureRandomInt được vận chuyển

Kho lưu trữ này không triển khai hoặc so sánh các trình tạo phía máy chủ, trình tạo số ngẫu nhiên phần cứng hoặc các công cụ dòng lệnh của hệ điều hành. Nó cũng không thể kiểm tra nội bộ quá trình triển khai mật mã của trình duyệt từ JavaScript. Các chủ đề đó cần có tài liệu nguồn, mô hình mối đe dọa và kiểm tra hoạt động riêng thay vì một nội dung tương tự được dán vào đường dẫn mã ToolAcre.

Trang này cũng không phải là trình quản lý mật khẩu. Nó không lưu, đồng bộ hóa, truyền tải hoặc tự động điền những gì nó tạo ra. Người đọc không nên hiểu “nguồn ngẫu nhiên mật mã” là lời khuyên để sử dụng lại kết quả hoặc di chuyển nó qua một kênh không an toàn. Xác nhận quyền sở hữu chỉ thuộc về lựa chọn bên trong tab trình duyệt hiện tại.

Bài học rút ra - Trình tạo mật khẩu sử dụng trình tạo số ngẫu nhiên được mã hóa của trình duyệt và bạn có thể xác minh nó từ chính trang đó

Lựa chọn có thể xác minh của ToolAcre là tiền điện tử hoặc không gì cả. Trang gọi trình duyệt API trong quá trình phát hiện hỗ trợ, vô hiệu hóa các điều khiển khi nó bị lỗi và cho phép công cụ ném `InsecureRandomError` nếu việc tạo bằng cách nào đó đạt đến cùng một điều kiện bị thiếu. Không có dự phòng Math.random nào bị ẩn đằng sau một trong hai nhánh.

Sử dụng mẫu đó khi xem xét trình tạo: xác định nguồn, theo dõi mọi lần rút giới hạn, kiểm tra mức giảm và xáo trộn, đồng thời buộc đường dẫn nguồn không khả dụng. Sau đó đánh giá riêng thiết bị và đích đến. Nguồn ngẫu nhiên hợp lý là cần thiết cho công việc của trình tạo này nhưng nó không phải là chứng chỉ chung cho toàn bộ vòng đời của chứng chỉ.