Công cụ dành cho nhà phát triển · Trình tạo UUID
Tại sao crypto.randomUUID() không thành công trên các trang HTTP: Giải thích về bối cảnh bảo mật
· Cách thức hoạt động
uuid mật mã browser-apis
crypto.randomUUID hoạt động trên localhost và trên HTTPS, sau đó biến mất trên máy chủ dàn dựng đơn giản-HTTP. Bài đăng này giải thích quy tắc ngữ cảnh bảo mật đằng sau hành vi đó và cách tạo UUID một cách an toàn khi áp dụng.
TypeError trên dàn dựng, mọi thứ khác đều ổn - triệu chứng và sự khác biệt về môi trường gây ra lỗi đó
Nhà phát triển kiểm tra công việc của họ trên localhost:3000 và trình tạo UUID hoạt động hoàn hảo. Họ triển khai để dàn dựng tại http://staging. nội bộ. ví dụ. com (đồng bằng HTTP trên công ty LAN) và mã đưa ra TypeError: crypto.randomUUID không phải là một hàm. Mã tương tự được sản xuất trên https://example. com hoạt động tốt. Sự không nhất quán thật khó hiểu cho đến khi họ đọc tài liệu MDN: crypto.randomUUID bị hạn chế trong các ngữ cảnh bảo mật. Bối cảnh an toàn là HTTPS hoặc localhost; nguồn gốc HTTP đơn giản trên LAN không được bảo mật theo quy tắc trình duyệt, ngay cả khi mạng ở chế độ riêng tư. Cách khắc phục là sử dụng crypto.getRandomValues với thao tác bit thủ công hoặc nâng cấp máy chủ dàn dựng lên HTTPS. Quy tắc bối cảnh bảo mật được đưa ra để ngăn chặn các API nhạy cảm bị rò rỉ sang các kết nối không được mã hóa.
Bối cảnh an toàn là gì — quy tắc trình duyệt dành riêng một số API nhất định cho nguồn gốc HTTPS và cho localhost
Một trang trên HTTP đơn giản có thể bị kẻ tấn công mạng chặn; việc hiển thị API mật mã cho một trang như vậy sẽ khiến kẻ tấn công có thể tạo mã nhận dạng bằng cách sử dụng API bị xâm phạm. HTTPS mã hóa trang và tất cả thông tin liên lạc API để kẻ tấn công trên mạng không thể chặn hoặc sửa đổi mã. Localhost được coi là an toàn vốn có vì nó chỉ tồn tại trên máy cục bộ và không thể bị chặn qua mạng. Bất kỳ nguồn gốc HTTP nào khác (địa chỉ LAN, miền công cộng không có HTTPS, proxy ngược chuyển tiếp tới HTTP) đều không an toàn theo định nghĩa. Web Crypto API được chia thành hai chức năng: crypto.randomUUID, được giới hạn trong bối cảnh bảo mật và crypto.getRandomValues, khả dụng trong cả bối cảnh bảo mật và không bảo mật. Cả hai đều sử dụng cùng một hệ điều hành CSPRNG.
Những phần nào của Web Crypto được kiểm soát — crypto.randomUUID và crypto.subtle yêu cầu ngữ cảnh an toàn trong khi crypto.getRandomValues thì không
Sự khác biệt là getRandomValues không che giấu sự thật rằng bạn đang sử dụng mật mã; một trang sử dụng nó phải yêu cầu rõ ràng các byte ngẫu nhiên. Hàm RandomUUID là một tiện ích cũng thực thi bối cảnh an toàn. Nếu ứng dụng của bạn cần tạo UUID trên một trang không bảo mật, bạn phải sử dụng getRandomValues và đặt thủ công các bit phiên bản và biến thể. RFC 9562 chỉ định các thao tác bit: đặt byte 6 thành (byte6 & 0x0f) | 0x40 cho phiên bản 4 và byte 8 thành (byte8 & 0x3f) | 0x80 cho biến thể RFC. Thư viện ToolAcre thực hiện chính xác điều này như một phương án dự phòng khi RandomUUID không khả dụng. Tái tạo lỗi: phân phối một trang đơn giản từ nguồn HTTP đơn giản không được coi là có khả năng đáng tin cậy. Kiểm tra xem RandomUUID có bị lộ hay không, sau đó so sánh getRandomValues mà tham chiếu Web Crypto cho phép trong bối cảnh không an toàn.
Xây dựng v4 UUID từ getRandomValues — dự phòng che giấu và định dạng giúp bạn duy trì CSPRNG khi thiếu RandomUUID
Mã tương tự trong tệp được cung cấp trên HTTPS có thể hiển thị RandomUUID. Nếu quá trình sản xuất báo cáo "randomUUID không phải là một chức năng", trước tiên hãy kiểm tra xem nguồn gốc có phải là bối cảnh an toàn hay không, sau đó xác minh hỗ trợ của trình duyệt và liệu tập lệnh khác có thay thế đối tượng mật mã hay không. Biện pháp khắc phục có thể là HTTPS hoặc triển khai getRandomValues đặt rõ ràng các bit UUID. Một polyfill Math.random không phải là một dự phòng tương đương: nó tái tạo hình dạng trong khi loại bỏ hợp đồng nguồn mật mã. Các thử nghiệm chỉ xác nhận dấu gạch ngang và chữ số phiên bản sẽ bỏ sót sự thay thế đó, vì vậy hãy xem lại đường dẫn nguồn cũng như chuỗi kết quả.
Ví dụ đã hoạt động - tái tạo lỗi trên nguồn gốc http:// và xác nhận việc sửa lỗi
Nhưng mã định danh bây giờ có thể dự đoán được. Kẻ tấn công chiếm được một số UUID từ hệ thống của bạn có thể dự đoán cái tiếp theo. Nếu một ứng dụng coi nhầm mã định danh đó là thông tin xác thực mang tính xác thực thì khả năng dự đoán sẽ trở thành lỗi cấp phép chứ không phải là lỗi về mặt thẩm mỹ. Chiến lược đúng là nâng cấp máy chủ lên HTTPS (luôn là bước đi đúng đắn cho bất kỳ trang nào có dữ liệu xác thực hoặc nhạy cảm) hoặc sử dụng getRandomValues với các thao tác bit rõ ràng (cần nhiều mã hơn nhưng hợp lý về mặt mật mã). Bối cảnh bảo mật được thực thi bởi trình duyệt; bạn không thể giải quyết nó bằng các biến cấu hình hoặc môi trường. Trình tạo ToolAcre được triển khai trên HTTPS, vì vậy crypto.randomUUID khả dụng. Khi bạn tạo UUID trong công cụ, nó sẽ sử dụng RandomUUID (nếu kiểm tra ngữ cảnh an toàn vượt qua) hoặc getRandomValues với các thao tác bit (nếu bạn sử dụng HTTP đơn giản, mặc dù điều này rất hiếm).
Tại sao bạn không nên điền bằng Math.random — lối tắt hấp dẫn và chi phí bảo mật mà nó mang lại
Không có con đường nào quay lại Math.random. Nếu bạn đang xây dựng trình tạo UUID của riêng mình và nhắm mục tiêu các nguồn gốc không an toàn, hãy sử dụng getRandomValues và tự thực hiện các thao tác bit. Kiểm tra trên cả HTTPS và localhost để xác nhận RandomUUID hoạt động, sau đó kiểm tra nguồn gốc http:// để xác nhận dự phòng getRandomValues của bạn là chính xác. Hiểu được hạn chế trong bối cảnh bảo mật sẽ giúp bạn thiết kế các chiến lược triển khai. Nếu ứng dụng của bạn phải chạy trên LAN riêng tư mà không có HTTPS (cơ sở hạ tầng cũ, hệ thống nhúng), dự phòng getRandomValues là con đường phía trước của bạn. Nếu bạn có lựa chọn, hãy nâng cấp lên HTTPS ở mọi nơi; nó miễn phí với Let's Encrypt và khoản đầu tư sẽ mang lại lợi ích cho tính bảo mật trên toàn bộ ứng dụng. Việc phát triển trên localhost không có hạn chế, vì vậy hãy kiểm tra trình tạo UUID của bạn trên localhost và trên giai đoạn HTTPS trước khi triển khai vào sản xuất. Quá trình sản xuất phải luôn HTTPS.
Điều này không bao gồm những gì — thời gian chạy của máy chủ như Node.js và Deno, hiển thị API mà không có quy tắc ngữ cảnh bảo mật
Hạn chế này không phải là một lỗi hay một mối phiền toái; đó là một tính năng bảo mật giúp ngăn ngừa tai nạn và buộc bạn phải nghĩ đến việc mã hóa. Mô hình rộng hơn là các API mật mã web được kiểm soát bởi bối cảnh bảo mật. crypto.getRandomValues, tiền điện tử. tinh tế. mã hóa, mật mã. tinh tế. generateKey và tất cả các hoạt động nhạy cảm khác đều yêu cầu HTTPS hoặc localhost. Không có ngoại lệ, không ghi đè, không có cách nào để vô hiệu hóa kiểm tra. Một trang không an toàn sẽ phá vỡ sự đảm bảo bảo mật cho người dùng của bạn. Ngay cả khi bạn cẩn thận chỉ sử dụng API mật mã trên một số trang nhất định, một lỗi (hoặc phần phụ thuộc bao gồm trình tạo UUID) có thể làm rò rỉ quá trình tạo ngẫu nhiên sang trang không được mã hóa. Trình tạo ToolAcre thực thi điều này ở cấp mã: nếu RandomUUID không khả dụng (ngữ cảnh không an toàn), nó sẽ sử dụng getRandomValues, có sẵn nhưng cảnh báo cho bất kỳ người đánh giá mã nào rằng có điều gì đó bất thường đang xảy ra.
Bài học rút ra: sửa nguồn gốc chứ không phải trình tạo — ToolAcre được phân phát trên HTTPS, do đó trình tạo của nó chạy trong bối cảnh an toàn theo thiết kế
Tốt hơn nữa, nó từ chối tạo mã nhận dạng nếu ngữ cảnh bảo mật thực sự không khả dụng (trong môi trường mà getRandomValues cũng không khả dụng, điều này hiếm gặp nhưng có thể xảy ra trong các hệ thống nhúng hoặc cũ hơn). Di chuyển hệ thống hiện có sang HTTPS để hỗ trợ API mật mã an toàn là một dự án phổ biến. Bắt đầu từ nguồn nơi UUID được tạo (máy chủ xác thực của bạn, chương trình phụ trợ API hoặc dịch vụ ứng dụng chính). Nhận chứng chỉ TLS (Let's Encrypt cung cấp chúng miễn phí). Định cấu hình máy chủ web của bạn để phân phát HTTPS theo mặc định và chuyển hướng các yêu cầu HTTP tới HTTPS. Kiểm tra với nhiều trình duyệt và ứng dụng khách API để đảm bảo mọi thứ đều hoạt động. Sau đó, hãy kiểm tra mã của bạn để tìm mọi API tiền điện tử còn lại có thể được gọi trên các trang không được mã hóa và sửa chúng. Trình tạo ToolAcre giả sử HTTPS; nếu bạn đang sử dụng nó, bạn đã là một phần của con đường đó.