Đưa khóa mã hóa mảng bytecode ra bên ngoài
Cung cấp khóa mã hóa bytecode VM của riêng bạn bằng vmBytecodeArrayEncodingKey và trả lại nó tại thời điểm chạy thông qua một key getter - không nằm trong bundle, được đọc từ bộ nhớ phía client, hoặc được lấy từ backend của bạn.
Các tùy chọn này làm gì
vmBytecodeArrayEncoding mã hóa mảng bytecode của VM để nó không nằm trong đầu ra
dưới dạng văn bản thuần. Theo mặc định, khóa mã hóa được suy ra từ môi trường và được tái tạo trên client, nên bạn không
bao giờ phải xử lý nó. Điều đó thuận tiện, nhưng nguyên liệu khóa vẫn nằm trong bundle.
Hai tùy chọn cho phép bạn đưa khóa ra khỏi bundle và tự kiểm soát nó:
vmBytecodeArrayEncodingKey- khóa mà bạn cung cấp tại thời điểm biên dịch. Khi được đặt, nó được dùng thay cho khóa mặc định suy ra từ môi trường, và nó không được nhúng vào đầu ra đã làm rối.vmBytecodeArrayEncodingKeyGetter- một biểu thức JavaScript trả về chính khóa đó tại thời điểm chạy. Nó được nhúng nguyên văn và được đánh giá trong trình duyệt khi mã đã làm rối được tải.
Điểm mấu chốt là sự tách biệt: vì khóa không nằm trong mã, một lần quét thuần tĩnh của bundle không thể khôi phục nó. Nó vẫn phải hiện diện tại thời điểm chạy để mã hoạt động, nên nó không thực sự bí mật - nhưng bạn quyết định nó đến từ đâu và ai được thấy nó.
Hai tùy chọn này là một cặp. vmBytecodeArrayEncodingKey mà không có getter sẽ khiến mã đã làm rối không có cách nào
lấy được khóa tại thời điểm chạy, và một getter không có khóa biên dịch tương ứng thì chẳng có gì để khớp với. Hãy đặt
cả hai, cùng với vmBytecodeArrayEncoding: true.
Hai khóa kết hợp như thế nào
Khóa của bạn không bao giờ được dùng một mình - ở cả hai phía, nó được trộn với một khóa nội bộ mà trình làm rối kiểm soát:
- Thời điểm biên dịch.
vmBytecodeArrayEncodingKeyđược kết hợp với một khóa nội bộ mà trình làm rối suy ra, và mảng bytecode được mã hóa bằng khóa trộn thu được. - Thời điểm chạy. Giá trị mà
vmBytecodeArrayEncodingKeyGettercủa bạn phân giải ra được kết hợp với cùng khóa nội bộ đó, được tái tạo trên client từ nhiều yếu tố tại thời điểm chạy, để giải mã bytecode.
Vì cả hai phía đều trộn khóa của bạn với khóa nội bộ, getter phải phân giải ra đúng cùng một chuỗi mà bạn đã truyền
vào làm vmBytecodeArrayEncodingKey. Không phần nào tự nó đủ: khóa của bạn mà không có khóa nội bộ thì không thể giải mã
bytecode, và khóa nội bộ thì vô dụng nếu không có khóa của bạn - đó là lý do việc kiểm soát ai nhận được khóa của bạn mới
thực sự là điều bảo vệ mã.
Cung cấp khóa tại thời điểm chạy
Theo mặc định, getter là đồng bộ: biểu thức phải trả về khóa ngay lập tức khi mã đã làm rối được tải. Hãy đọc nó từ
bất kỳ nguồn nào đã có sẵn trên client - một cookie, localStorage, một biến toàn cục, hoặc một phần tử DOM được máy chủ
chèn vào.
Khóa phải tồn tại trước khi mã đã làm rối chạy:
Các nguồn đồng bộ khác cũng hoạt động theo cách tương tự - hãy chọn nguồn nào mà ứng dụng của bạn đã điền sẵn:
Hãy giữ khóa tách khỏi cùng tệp hoặc script chứa mã đã làm rối. Đưa nó vào cùng chỗ đó sẽ phá hỏng toàn bộ mục đích -
một lần quét tĩnh của bundle sẽ khôi phục được cả mã lẫn khóa của nó. Hãy lưu nó trong một nguồn riêng, và chèn khóa
biên dịch vmBytecodeArrayEncodingKey từ một biến môi trường hoặc secret thay vì commit nó.
Lấy khóa từ backend của bạn (bất đồng bộ)
Yêu cầu vmAsyncExecutor · v7.3.0+Một getter đồng bộ chỉ có thể đọc những gì đã có sẵn trên client. Để lấy khóa từ máy chủ của bạn - nhờ đó bạn có thể
đặt nó sau lớp xác thực và thu hồi nó - getter phải là bất đồng bộ, và điều đó đòi hỏi
vmAsyncExecutor. Khi trình thực thi bất đồng bộ được bật, getter có thể trả về
một Promise, và VM sẽ chờ nó trước khi chạy.
Một getter trả về Promise đòi hỏi vmAsyncExecutor. Điều này không thể kiểm tra tại thời điểm build, nên một
getter trả về Promise khi vmAsyncExecutor bị tắt sẽ thất bại tại thời điểm chạy - bộ giải mã nhận được đối tượng
Promise thay vì chuỗi khóa.
Cấp khóa dựa trên phiên đã xác thực và kiểm tra giấy phép cần thiết. Chỉ Origin hoặc Referer không xác thực được người gọi; yêu cầu GET cùng nguồn có thể không có Origin. Tắt bộ nhớ đệm phản hồi. Gắn khóa với đúng phiên bản build và triển khai cùng gói. Máy khách nhận khóa có thể kiểm tra khóa lúc chạy.
Khi khóa không khớp
Mã đã làm rối chỉ hoạt động khi getter trả về đúng chính xác cùng khóa đã dùng trong quá trình làm rối. Nếu các khóa
khác nhau - hoặc getter trả về undefined, null, hoặc một chuỗi rỗng - việc giải mã tạo ra một keystream sai và mã thất
bại tại thời điểm chạy với đầu ra rác hoặc một lỗi runtime thông thường.
Cố ý không có một thông báo lỗi riêng biệt, đặc thù cho khóa: một khóa thất bại không thể phân biệt với bất kỳ sự cố runtime nào khác. Vì vậy, khi một bundle được VM bảo vệ chỉ ném lỗi khi tùy chọn này được bật, hãy kiểm tra đường dẫn khóa trước tiên - rằng getter phân giải được trên trang, trả về một chuỗi không rỗng, và trả về cùng giá trị mà bạn đã build.
