Mục lục thư viện
Thư viện tài liệuBảo mật
Hai chế độ bảo vệ
Mỗi ứng dụng chạy một trong hai chế độ. Bảo vệ Standard là mặc định và không cần cài đặt gì. Bảo vệ Advanced thêm các phương pháp do bạn chọn. Hướng dẫn này giải thích hai chế độ, từng phương pháp và cách chuyển qua lại.
15 phút đọc
Nên dùng chế độ nào
| Bảo vệ Standard | Bảo vệ Advanced | |
|---|---|---|
| Dành cho | Người bán chỉ muốn gắn license và bán | Người bán muốn tự chống bẻ khoá và chia sẻ key |
| Bạn cần đặt | Không có gì | Các phương pháp bạn bật, chia theo năm nhóm |
| Việc của bạn | Gắn SDK và khoá công khai | Như Standard, thêm chọn phương pháp và tạo Protection Kit |
| Câu trả lời gửi về phần mềm | Không đổi | Có thể đổi, tuỳ phương pháp đã bật |
| Mặc định | Có | Tự chọn |
Cả hai chế độ đều có trên mọi gói. Bên trong Advanced, ba thứ cần Premium: Xử lý theo mức rủi ro tự xử lý, cảnh báo qua Discord, Telegram và webhook, và tự chọn thời hạn token offline.
Tab Phương pháp
Mở ứng dụng, chọn Bảo mật ứng dụng › Bảo vệ rồi sang tab Phương pháp. Từ trên xuống, tab gồm:
- Hai thẻ Bảo vệ Standard và Bảo vệ Advanced, ghi Đang dùng hoặc Dùng chế độ này
- Bảo vệ Standard: mười phương pháp, gắn nhãn Luôn bật
- Bảo vệ Advanced: các phương pháp theo năm nhóm, chỉ hiện danh sách tên cho tới khi bạn bật chế độ này
- Khoá ký: chuẩn bị và kích hoạt khoá ký mới, chỉ có ở Advanced, cần đăng nhập trong 15 phút gần nhất khi chạy production
- Lịch sử thay đổi
Mọi thành viên workspace đều xem được tab này, nhưng chỉ vai trò Quản trị và Chủ sở hữu thay đổi được. Tab Tổng quan cho biết chế độ đang dùng và số phương pháp đang bật, kèm liên kết dẫn về đây.
Chuyển chế độ
- Ở tab Phương pháp, bấm Dùng chế độ này trên thẻ bạn muốn
- Khi chuyển về Standard, hộp thoại hỏi Quay về Bảo vệ Standard?. Bấm Dùng Standard để xác nhận
Thay đổi áp dụng cho các yêu cầu tiếp theo của phần mềm, chậm nhất khoảng 10 giây.
Về Standard không xoá lựa chọn đã lưu. Chúng ngừng chạy và quay lại khi bạn bật Advanced. Điều này đúng với mọi công tắc và mọi luật truy cập.
Bảo vệ Standard
Mọi ứng dụng đều có mười phương pháp này. Bạn không cần đặt gì, và không ai tắt được, kể cả Chủ sở hữu.
| Phương pháp | Tác dụng |
|---|---|
| Kiểm soát phía server | Server quyết định ai được vào, phần mềm chỉ hỏi |
| Ký response | Server ký mọi câu trả lời, SDK chính thức từ chối câu trả lời không có chữ ký, ký bằng khoá lạ, không khớp yêu cầu hoặc quá cũ |
| Chống replay | Mỗi nonce chỉ được chấp nhận một lần, bắt lại rồi gửi lại một yêu cầu cũ không có tác dụng |
| Không nhúng secret | Bản build chỉ cần app id và khoá công khai, không chứa khoá API hay mật khẩu dùng chung |
| TLS kèm HSTS | Kết nối luôn qua HTTPS, trình duyệt từ chối HTTP |
| Gắn key với máy (Node Locking) | Key chỉ chạy trên máy đã kích hoạt, máy được nhận ra sau khi cài lại hoặc thay ít linh kiện |
| Session gắn với máy | Phiên thuộc về khoá thiết bị đã tạo ra nó, mã phiên bị lộ đem sang máy khác sẽ bị từ chối |
| Rate Limiting | Mỗi IP được sai key hoặc mật khẩu tối đa 20 lần trong 15 phút trên một ứng dụng, sau đó nhận too_many_attempts |
| Mã hoá khi lưu | Khoá ký, secret webhook và biến bí mật được mã hoá AES-256-GCM, license key chỉ lưu dạng HMAC |
| Audit Log | Đăng nhập và từ chối khi đăng nhập đều được ghi kèm lý do |
Vài điểm cần biết:
- Standard bỏ qua mọi công tắc đã lưu và mọi luật truy cập
- Sự kiện bảo mật vẫn được ghi vào nhật ký, nhưng không có thông báo chuông, không có cảnh báo qua email hay chat và không có phản ứng tự động
- Những gì đặt trong gói license hoặc trang Bản phát hành vẫn chạy, lệnh chặn thiết bị và chặn IP cũng vậy
- Với Rate Limiting, client dùng giao thức CLV1.1 nhận cùng một mã
invalid_credentialscho mọi lý do từ chối key (không tồn tại, bị khoá, bị thu hồi, hết hạn), sau cùng một khoảng chờ tối thiểu, nên kẻ dò không phân biệt được key nào có thật. Riêng máy đang giữ chỗ trên key đó vẫn nhận lý do chi tiết để hiển thị cho người dùng. - Đọc thêm: đặc tả giao thức cho Ký response và Chống replay, Thiết bị, HWID và chuyển máy cho Gắn key với máy (Node Locking)
Bảo vệ Advanced
Toàn bộ Standard, cộng các phương pháp dưới đây. Mỗi phương pháp có công tắc ở tab Phương pháp, hoặc có liên kết tới trang đặt nó. Mọi công tắc đều tắt cho tới khi bạn bật.
Thực thi license
| Phương pháp | Đặt ở | Tác dụng | Cần lưu ý |
|---|---|---|---|
| Quy định chuyển máy | Gói license | Khách được chuyển key sang máy mới bao nhiêu lần | Giới hạn quá chặt làm phiền khách đổi máy |
| Giới hạn session đồng thời | Gói license | Bao nhiêu máy được chạy một key cùng lúc | Phiên chết vẫn giữ chỗ tới khi hết hạn |
| Session lease ngắn hạn | Công tắc | Phiên chỉ sống vài phút, key bị khoá là dừng nhanh | Lease ngắn làm tăng lượng gọi server |
| Offline license có chữ ký | Gói license, Premium để đặt thời hạn | Mọi gói đều có token có chữ ký 7 ngày. Premium tự chọn thời hạn | License đã thu hồi vẫn có thể chạy offline tới hết thời hạn đó, trừ khi Chế độ chỉ online đang bật |
| Chế độ chỉ online | Công tắc | Không cấp token offline, luôn cần mạng | Mất mạng là phần mềm không chạy |
| Phát hiện chỉnh đồng hồ | Protection Kit | Phát hiện đồng hồ máy bị chỉnh lùi để kéo dài license | Không có cách kiểm tra offline nào chắc chắn tuyệt đối |
| Bắt buộc phiên bản tối thiểu | Bản phát hành | Bản thấp hơn bị từ chối khi đăng nhập, nếu phần mềm báo phiên bản | Khách phải cập nhật mới dùng tiếp |
Kiểm soát truy cập
| Phương pháp | Đặt ở | Tác dụng | Cần lưu ý |
|---|---|---|---|
| Allowlist và Blocklist IP | Tab Quy tắc truy cập | Chặn hoặc chỉ cho phép địa chỉ và dải mạng | VPN và NAT làm IP kém chính xác |
| Geo-Blocking | Tab Quy tắc truy cập | Chặn hoặc chỉ cho phép theo quốc gia | Chỉ hiện khi server đứng sau Cloudflare, và VPN vượt được |
| Denylist thiết bị | Tab Thiết bị của Người dùng cuối › Thiết bị & phiên | Chặn một máy không cho đăng nhập | Phần cứng mới có thể bị coi là máy mới |
| Bắt buộc MFA cho team | Công tắc | Thành viên phải có 2FA hoặc passkey mới mở được app này | Chỉ áp dụng người trong workspace |
Luật truy cập chỉ chạy ở Bảo vệ Advanced. Lệnh chặn IP do bạn đặt hoặc do Xử lý theo mức rủi ro đặt, cùng lệnh chặn thiết bị, có hiệu lực ở cả hai chế độ. Xem Kiểm soát truy cập và Thiết bị, HWID và chuyển máy.
Bảo vệ code
Phần lớn các phương pháp này chạy ngay trong phần mềm của bạn, qua Protection Kit. Chúng làm việc tấn công khó hơn chứ không làm nó bất khả thi, và không thay được một thiết kế đúng.
| Phương pháp | Đặt ở | Tác dụng | Cần lưu ý |
|---|---|---|---|
| Kiểm tra toàn vẹn build | Công tắc | Báo hoặc từ chối bản build có hash lạ. Phần mềm phải gửi hash lên | Bản đã vá có thể khai hash giả |
| Code Signing | Protection Kit | Người mua kiểm tra được phần mềm đúng là của bạn | Chứng minh nguồn gốc, không chống bẻ khoá |
| Code Obfuscation | Chưa có trong Kit | Làm mã đã biên dịch khó đọc hơn | Luôn có thể vượt qua, chỉ tăng công sức |
| Kiểm tra license nhiều lớp | Protection Kit | Kiểm tra ở nhiều chỗ, vá một chỗ là chưa đủ | Chỉ tăng công sức |
| Anti-Debugging | Chưa có trong Kit | Phát hiện debugger gắn vào phần mềm | Gần như không thể ngăn tuyệt đối, mặc định chỉ báo |
| Phát hiện máy ảo | Chưa có trong Kit | Phát hiện phần mềm chạy trong máy ảo | Dễ nhầm khách thật dùng máy ảo, mặc định chỉ báo |
| Certificate Pinning | Chưa có trong Kit, cần TLS pin của server | Chỉ tin khoá của API, kể cả khi có proxy | Đổi khoá sai là khoá cả khách |
Phát hiện và phản ứng
| Phương pháp | Đặt ở | Tác dụng | Cần lưu ý |
|---|---|---|---|
| Tín hiệu đe doạ | Tab Tổng quan | Hành vi lạ được chấm điểm và ghi lại | Tín hiệu từ client có thể bị giả |
| Xử lý theo mức rủi ro | Công tắc | Cảnh báo, buộc đăng nhập lại rồi khoá khi rủi ro tăng | Theo dõi một thời gian trước khi cho tự xử lý. Tự xử lý cần Premium |
| Forensic Watermarking | Công tắc | Mỗi license mang dấu ẩn để truy ra người làm lộ | Chỉ truy vết, không ngăn được. Hãy ghi rõ trong điều khoản bán |
| Định tuyến cảnh báo | Giám sát & cảnh báo › Bảo mật, tab Cảnh báo | Gửi cảnh báo qua email, Discord, Telegram hoặc webhook | Mọi kênh khác email đều cần Premium |
Khoá và bản phát hành
| Phương pháp | Đặt ở | Tác dụng | Cần lưu ý |
|---|---|---|---|
| Xoay khoá ký | Công tắc | Đặt chu kỳ xoay khoá ký. Thẻ khoá sẽ báo khi đến hạn | Chỉ là lời nhắc, và phần mềm phải nhận được khoá mới trước |
| Bản phát hành có chữ ký | Bản phát hành | Mỗi bản phát hành có chữ ký để phần mềm kiểm tra | Lộ khoá thì chữ ký không còn ý nghĩa |
Bật một phương pháp
- Bấm công tắc bên phải dòng. Cấu hình được lưu ngay và bạn thấy thông báo Đã lưu
- Phương pháp có tham số hiện thêm các ô sau khi bật. Ô số tự lưu khi bạn rời khỏi ô, giá trị nằm ngoài khoảng cho phép bị bỏ qua
- Với Kiểm tra toàn vẹn build và Xử lý theo mức rủi ro, bấm vào chế độ muốn dùng. Lựa chọn được lưu ngay
Thay đổi áp dụng cho các yêu cầu tiếp theo của phần mềm, chậm nhất khoảng 10 giây. Các phương pháp có công tắc:
| Phương pháp | Tham số (mặc định) |
|---|---|
| Session lease ngắn hạn | Nhịp báo 60 đến 3600 giây (300) |
| Chế độ chỉ online | Không có |
| Bắt buộc MFA cho team | Không có |
| Kiểm tra toàn vẹn build | Chỉ cảnh báo hoặc Chặn (Chỉ cảnh báo) |
| Xử lý theo mức rủi ro | Chỉ cảnh báo hoặc Tự xử lý (Chỉ cảnh báo); Cảnh báo từ, Đăng nhập lại từ, Tạm khoá từ 10 đến 100 (40, 60, 80) |
| Forensic Watermarking | Không có |
| Xoay khoá ký | Xoay mỗi 30 đến 730 ngày (180) |
Session lease ngắn hạn
Phương pháp này rút ngắn phiên: phiên hết hạn sau ba nhịp báo nếu máy không gửi heartbeat, tức 15 phút với nhịp mặc định 300 giây. Khi tắt, phiên sống 1 giờ kể từ lần đăng nhập hoặc heartbeat gần nhất. Server báo nhịp qua session.heartbeatSeconds và nextCheckSeconds trong câu trả lời đăng nhập và securityHints.heartbeatSec của init(). SDK không tự gửi heartbeat, phần mềm của bạn gọi theo nhịp đó:
const grant = await clavis.activate(licenseKey);
// Lease bật: dùng nhịp server gửi. Lease tắt: phiên sống 1 giờ, báo mỗi 30 phút là đủ
const everySec = grant.session.heartbeatSeconds ?? 30 * 60;
setInterval(() => {
clavis.heartbeat().catch(onSessionLost); // onSessionLost là hàm của bạn
}, everySec * 1000);
Chế độ chỉ online
Phương pháp này tắt license offline: server ngừng cấp offlineToken và init() gửi maxOfflineSec: 0, nên SDK không tin token offline nào nữa. Thu hồi hay tạm khoá license vì thế có hiệu lực ở lần kết nối kế tiếp. Token đã nằm trên một máy không bao giờ gọi được init() vẫn chạy tới hạn exp của nó. Mọi gói đều có token, nên đây là cách duy nhất để tắt. Xem License offline.
Bắt buộc MFA cho team
Phương pháp này buộc mọi thành viên, kể cả Chủ sở hữu, có 2FA hoặc passkey mới mở được ứng dụng này. Thành viên chưa có cả hai nhận lỗi two_factor_required ở mọi trang và API của ứng dụng. Để bạn không tự khoá mình, server chỉ cho bật khi chính tài khoản của bạn đã có một trong hai; nếu chưa, bạn thấy Bật 2FA cho tài khoản của bạn trước. Bật 2FA hoặc thêm passkey ở Tài khoản & tổ chức › Bảo mật tài khoản. Xem Bảo mật tài khoản dashboard.
Kiểm tra toàn vẹn build
Phương pháp này so hash bản chạy với các bản phát hành. SDK gửi appVersion và buildHash (SHA-256 của file đang chạy, 64 ký tự hex thường) khi bạn khai báo chúng:
const clavis = new ClavisClient({
baseUrl: "https://api.example.com",
appId: "app_…",
appPublicKey: "…",
device: { fingerprint: hashComponent(machineId) },
appVersion: "1.4.0",
buildHash: await sha256OfRunningFile(),
});
Một build là "lạ" khi hash không khớp file nào trong Phát hành & bản quyền › Bản phát hành và ứng dụng đã có ít nhất một bản đã phát hành. Build lạ luôn tạo tín hiệu Bản build lạ, ở chế độ nào cũng vậy. Phương pháp này quyết định phần còn lại: Chỉ cảnh báo vẫn cho đăng nhập, Chặn từ chối với unknown_build. Khi bật, init() còn gửi reportTamperSignals: true cho SDK. Xem Bản phát hành có ký và cập nhật.
Anti-Debugging và Phát hiện máy ảo
Kit chưa có module cho phần này, nên phần phát hiện là code của bạn. Phần mềm có thể tự báo những gì nó phát hiện. Mỗi báo cáo tạo tín hiệu Phát hiện can thiệp, chỉ nâng điểm rủi ro chứ không tự chặn ai. Báo cáo cần phiên đang sống, và mỗi phiên được tính tối đa 5 báo cáo mỗi giờ:
if (debuggerDetected()) {
await clavis.request("/v1/client/report", { kind: "debugger" }); // hoặc "hook", "vm", "patched"
}
Xử lý theo mức rủi ro
Phương pháp này để Protect 24/7 tự phản ứng theo điểm rủi ro (0 đến 100) của từng license, thiết bị và IP:
- Chỉ cảnh báo: khi điểm rủi ro vượt Cảnh báo từ, Protect ghi hành động Đã cảnh báo vào sự cố, không đụng tới khách
- Tự xử lý: thêm hành động tự động. License vượt Đăng nhập lại từ bị kết thúc mọi phiên; license chạm Tạm khoá từ bị tạm khoá. Thiết bị lặp lại tín hiệu Chia sẻ key hoặc Bản build lạ bị chặn. IP dò key bị chặn 24 giờ.
Tự xử lý mặc định là tính năng của Premium. Trên gói chưa có nó, bạn vẫn chọn được, nhưng trang hiện Tự xử lý chạy trên Premium, gói hiện tại chỉ cảnh báo và Protect chỉ cảnh báo. Lệnh tạm khoá và chặn tự động đều hoàn tác được trong Protect 24/7.
Forensic Watermarking
Phương pháp này gắn dấu người mua vào mỗi lần đăng nhập thành công: trường license.mark dạng <10 hex>.<6 hex>, nửa đầu chỉ ra license, nửa sau chỉ ra máy. Token offline mang cùng dấu ở trường wm. Hãy hiển thị dấu ở hộp About, header log hoặc file người dùng lưu ra; khi một bản bị phát tán, dấu cho biết license và máy nào làm lộ.
const grant = await clavis.activate(licenseKey);
if (grant.license.mark) aboutDialog.setFooter(`Bản quyền: ${grant.license.mark}`);
Để truy ngược một vụ lộ, dán dấu vào ô tìm kiếm của trang License, hoặc gửi tới POST /seller/v1/licenses/lookup của Seller API dưới dạng { "mark": "…" }; API còn chỉ ra máy nào khi nửa sau khớp khoá thiết bị hiện tại của máy đó. Dấu tìm thấy trong một file chỉ là đầu mối: ai cũng có thể chép dấu vào file.
Xoay khoá ký
Phương pháp này đặt lịch xoay khoá ký: mục Khoá ký của tab hiện Đến hạn xoay kèm ngày, đổi thành Đã quá hạn xoay khi trễ. Việc xoay không tự chạy: bạn bấm Chuẩn bị khoá mới, phát hành bản build mang cả hai khoá, rồi bấm Kích hoạt khoá mới; khoá cũ còn được tin thêm 14 ngày. Xem Khoá ký và xoay vòng khoá.
Bộ mẫu bảo vệ
Các phương pháp Bảo vệ code đi vào phần mềm của bạn qua Bảo mật ứng dụng › Bộ mẫu bảo vệ. Chọn ngôn ngữ và các phương pháp muốn dùng, rồi tạo và tải bộ mẫu về. Bạn có thể bắt đầu từ ba preset: Core, Recommended hoặc Full.
Khi một phương pháp cần thứ gì đó ở server, trang liệt kê nó dưới mục Bật phía server. Bật một công tắc từ đó sẽ chuyển ứng dụng sang Bảo vệ Advanced. Xem Bộ mẫu bảo vệ.
Lịch sử thay đổi
Mục Lịch sử thay đổi hiện 20 lần lưu gần nhất, mới nhất ở trên, kèm tên (hoặc email) người thực hiện và thời điểm:
- Chuyển sang {mode}: ứng dụng đổi chế độ
- Đổi {items}: các phương pháp đã đổi, ví dụ Đổi Session lease ngắn hạn, Xử lý theo mức rủi ro
Mỗi lần lưu cũng vào nhật ký kiểm toán của workspace với hành động security.updated hoặc security.mode. Khi chưa ai lưu gì, mục này hiện Chưa thay đổi gì.