Làm cách nào để tạo khóa sản phẩm cho Ứng dụng C # của tôi?
Tôi cần tạo khóa sản phẩm (hoặc giấy phép) mà tôi cập nhật hàng năm. Ngoài ra, tôi cần tạo một phiên bản dùng thử.
Có liên quan:
Làm cách nào để tạo khóa sản phẩm cho Ứng dụng C # của tôi?
Tôi cần tạo khóa sản phẩm (hoặc giấy phép) mà tôi cập nhật hàng năm. Ngoài ra, tôi cần tạo một phiên bản dùng thử.
Có liên quan:
Câu trả lời:
Bạn có thể làm điều gì đó như tạo một bản ghi chứa dữ liệu bạn muốn xác thực cho ứng dụng. Điều này có thể bao gồm bất kỳ thứ gì bạn muốn - ví dụ như các tính năng của chương trình để kích hoạt, ngày hết hạn, tên của người dùng (nếu bạn muốn liên kết nó với một người dùng). Sau đó, mã hóa nó bằng cách sử dụng một số thuật toán tiền điện tử với một khóa cố định hoặc băm nó. Sau đó, bạn chỉ cần xác minh nó trong chương trình của bạn. Một cách để phân phối tệp giấy phép (trên windows) là cung cấp nó dưới dạng tệp cập nhật sổ đăng ký (tiết kiệm cho người dùng phải nhập nó).
Tuy nhiên, hãy cẩn thận với cảm giác an toàn sai - sớm hay muộn ai đó sẽ vá chương trình của bạn để bỏ qua bước kiểm tra đó và phân phối phiên bản đã vá. Hoặc, họ sẽ tìm ra một khóa để vượt qua tất cả các lần kiểm tra và phân phối nó, hoặc cập nhật đồng hồ, v.v. Không quan trọng bạn lập kế hoạch phức tạp như thế nào, bất cứ điều gì bạn làm cho điều này cuối cùng sẽ là bảo mật thông qua sự che giấu và chúng sẽ luôn có thể này. Ngay cả khi họ không thể, ai đó sẽ làm và sẽ phân phối phiên bản bị tấn công. Điều tương tự cũng áp dụng ngay cả khi bạn cung cấp một dongle - nếu ai đó muốn, họ cũng có thể vá séc cho điều đó. Việc ký điện tử vào mã của bạn sẽ không giúp ích được gì, họ có thể xóa hoặc từ chức chữ ký đó.
Bạn có thể phức tạp hóa vấn đề một chút bằng cách sử dụng các kỹ thuật để ngăn chương trình chạy trong trình gỡ lỗi, v.v., nhưng ngay cả điều này cũng không phải là bằng chứng đầu dòng. Vì vậy, bạn chỉ nên gây khó khăn đủ để một người dùng trung thực sẽ không quên trả tiền. Ngoài ra, hãy hết sức cẩn thận để chương trình của bạn không trở nên khó chịu đối với người dùng trả tiền - tốt hơn hết là bạn nên có một số bản sao bị xé nhỏ hơn là để khách hàng trả tiền của bạn không thể sử dụng những gì họ đã trả tiền.
Một tùy chọn khác là kiểm tra trực tuyến - chỉ cần cung cấp cho người dùng một ID duy nhất và kiểm tra trực tuyến xem ID đó có khả năng gì và lưu vào bộ nhớ cache trong một khoảng thời gian. Tuy nhiên, tất cả các cảnh báo tương tự cũng được áp dụng - mọi người có thể làm tròn bất cứ thứ gì như thế này.
Cũng nên xem xét chi phí hỗ trợ khi phải đối phó với những người dùng quên khóa của họ, v.v.
chỉnh sửa: Tôi chỉ muốn nói thêm, đừng đầu tư quá nhiều thời gian vào việc này hoặc nghĩ rằng bằng cách nào đó, lược đồ phức tạp của bạn sẽ khác và không thể theo dõi được. Nó sẽ không xảy ra và không thể miễn là mọi người kiểm soát phần cứng và hệ điều hành mà chương trình của bạn chạy. Các nhà phát triển đã cố gắng đưa ra các kế hoạch phức tạp hơn bao giờ hết cho việc này, nghĩ rằng nếu họ phát triển hệ thống của riêng mình cho nó thì nó sẽ chỉ có họ biết và do đó 'an toàn hơn'. Nhưng nó thực sự tương đương với việc lập trình cố gắng tạo ra một cỗ máy chuyển động vĩnh viễn. :-)
Những người mà bạn tin tưởng?
Tôi luôn coi khu vực này là quá quan trọng để tin tưởng một bên thứ ba quản lý bảo mật thời gian chạy của ứng dụng của bạn. Sau khi thành phần đó bị bẻ khóa cho một ứng dụng, nó sẽ bị bẻ khóa cho tất cả các ứng dụng. Điều đó xảy ra với Discreet sau năm phút khi họ sử dụng giải pháp cấp phép của bên thứ ba cho 3ds Max năm trước ... Chúc may mắn!
Nghiêm túc mà nói, hãy cân nhắc việc tự mình thực hiện để có toàn quyền kiểm soát thuật toán của bạn. Nếu bạn làm vậy, hãy cân nhắc sử dụng các thành phần trong khóa của bạn dọc theo các dòng:
Sau đó, kiểm tra cái quái của chúng và thêm bất kỳ mã hóa nào (có thể đảo ngược) bạn muốn vào nó để làm cho nó khó bị bẻ khóa hơn.
Để tạo khóa cấp phép dùng thử, chỉ cần đặt các giá trị cho các giá trị trên được dịch là "chế độ dùng thử".
Và vì đây có lẽ là mã quan trọng nhất trong ứng dụng / công ty của bạn, trên hết / thay vì xáo trộn, hãy xem xét đưa các quy trình giải mã vào tệp DLL gốc và chỉ cần P / Invoke nó.
Một số công ty mà tôi từng làm việc đã áp dụng các phương pháp tiếp cận tổng quát cho việc này với thành công lớn. Hoặc có thể các sản phẩm không đáng bị nứt;)
Nếu bạn đang hỏi về các khóa mà bạn có thể nhập, như khóa sản phẩm Windows, thì chúng dựa trên một số kiểm tra. Nếu bạn đang nói về các khóa mà bạn phải sao chép dán, thì chúng dựa trên chữ ký số (mã hóa khóa cá nhân).
Một logic khóa sản phẩm đơn giản có thể bắt đầu bằng việc nói rằng khóa sản phẩm bao gồm bốn nhóm 5 chữ số, như abcde-fghij-kljmo-pqrst
, sau đó tiếp tục xác định các mối quan hệ nội bộ như f + k + p phải bằng a, nghĩa là các chữ số đầu tiên của 2 , Nhóm 3 và 4 phải tổng là a. Điều này có nghĩa là 8xxxx-2xxxx-4xxxx-2xxxx hợp lệ, 8xxxx-1xxxx-0xxxx-7xxxx cũng vậy. Tất nhiên, cũng sẽ có các mối quan hệ khác, bao gồm các mối quan hệ phức tạp như, nếu chữ số thứ hai của nhóm đầu tiên là lẻ, thì chữ số cuối cùng của nhóm cuối cùng cũng phải lẻ. Bằng cách này sẽ có trình tạo khóa sản phẩm và việc xác minh khóa sản phẩm sẽ chỉ đơn giản là kiểm tra xem nó có khớp với tất cả các quy tắc hay không.
Mã hóa thường là chuỗi thông tin về giấy phép được mã hóa bằng khóa riêng (== được ký điện tử) và được chuyển đổi thành Base64 . Khóa công khai được phân phối cùng với ứng dụng. Khi chuỗi Base64 đến, nó được xác minh (== đã giải mã) bằng khóa công khai và nếu thấy hợp lệ, sản phẩm sẽ được kích hoạt.
Cho dù nó tầm thường hay khó bẻ khóa, tôi không chắc rằng nó thực sự tạo ra nhiều sự khác biệt.
Khả năng ứng dụng của bạn bị bẻ khóa tỷ lệ thuận với tính hữu dụng của nó hơn là độ mạnh của việc xử lý khóa sản phẩm.
Cá nhân tôi nghĩ rằng có hai lớp người dùng. Những người trả tiền. Những người không. Những cái làm như vậy có thể sẽ làm như vậy với sự bảo vệ dù là nhỏ nhặt nhất. Những người không sẽ chờ một vết nứt hoặc tìm kiếm nơi khác. Dù bằng cách nào, nó sẽ không giúp bạn có thêm tiền.
Tôi phải thừa nhận rằng tôi đã làm một điều gì đó khá điên rồ.
Khi họ tìm và gỡ bỏ LicenseCheck, điều thú vị sẽ xảy ra khi DLL bắt đầu phân đoạn bị lỗi .
Ngoài ra còn có tùy chọn Dịch vụ Cấp phép và Bảo vệ Phần mềm (SLP) của Microsoft . Sau khi đọc về nó, tôi thực sự ước mình có thể sử dụng nó.
Tôi thực sự thích ý tưởng chặn các phần mã dựa trên giấy phép. Nội dung hấp dẫn và an toàn nhất cho .NET. Đọc thú vị ngay cả khi bạn không sử dụng nó!
Dịch vụ Cấp phép và Bảo vệ Phần mềm (SLP) của Microsoft® là một dịch vụ kích hoạt phần mềm cho phép các nhà cung cấp phần mềm độc lập (ISV) áp dụng các điều khoản cấp phép linh hoạt cho khách hàng của họ. Microsoft SLP Services sử dụng một phương pháp bảo vệ duy nhất giúp bảo vệ ứng dụng và thông tin cấp phép của bạn, cho phép bạn tiếp cận thị trường nhanh hơn đồng thời tăng cường sự tuân thủ của khách hàng.
Lưu ý: Đây là cách duy nhất tôi muốn phát hành một sản phẩm có mã nhạy cảm (chẳng hạn như một thuật toán có giá trị).
Một công cụ tốt, rẻ tiền khác để kích hoạt và khóa sản phẩm là một sản phẩm có tên InstallKey. Hãy xem tại www.lomacons.com
Một phương pháp đơn giản là sử dụng Mã định danh duy nhất trên toàn cầu (GUID). GUID thường được lưu trữ dưới dạng giá trị 128 bit và thường được hiển thị dưới dạng 32 chữ số thập lục phân với các nhóm được phân tách bằng dấu gạch ngang, chẳng hạn như {21EC2020-3AEA-4069-A2DD-08002B30309D}
.
Sử dụng mã sau trong C # bằng cách System.Guid.NewGuid()
.
getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string.
_key = Convert.ToString(Regex.Replace(getKey, ".{4}", "$0/")); // And use this to separate every four digits with a "/".
Tôi hy vọng nó sẽ giúp.
Bí quyết là có một thuật toán mà chỉ bạn biết (để nó có thể được giải mã ở đầu bên kia).
Có những điều đơn giản như "Chọn một số nguyên tố và thêm một số ma thuật vào nó"
Nhiều tùy chọn phức tạp hơn như sử dụng mã hóa không đối xứng của một tập hợp dữ liệu nhị phân (có thể bao gồm một số nhận dạng duy nhất, số phiên bản, v.v.) và phân phối dữ liệu được mã hóa làm khóa.
Cũng có thể là đáng đọc các câu trả lời cho câu hỏi này cũng
Có một số công cụ và API có sẵn cho nó. Tuy nhiên, tôi không nghĩ rằng bạn sẽ tìm thấy một cái miễn phí;)
Ví dụ: có bộ OLicense: http://www.olicense.de/index.php?lang=en
Bạn có thể kiểm tra LicenseSpot . Nó cung cấp:
Tôi sẽ kể lại một chút về câu trả lời tuyệt vời của @ Frankodwyer và đào sâu hơn một chút về cấp phép dựa trên trực tuyến. Tôi là người sáng lập Keygen , một API REST cấp phép được xây dựng cho các nhà phát triển.
Vì bạn đã đề cập đến việc muốn có 2 "loại" giấy phép cho ứng dụng của mình, tức là "phiên bản đầy đủ" và "phiên bản dùng thử", chúng tôi có thể đơn giản hóa điều đó và sử dụng mô hình giấy phép tính năng mà bạn cấp phép cho các tính năng cụ thể của ứng dụng của mình (trong trường hợp này, có bộ tính năng "đầy đủ" và bộ tính năng "dùng thử").
Để bắt đầu, chúng tôi có thể tạo 2 loại giấy phép (được gọi là chính sách trong Keygen) và bất cứ khi nào người dùng đăng ký tài khoản, bạn có thể tạo giấy phép "dùng thử" để họ bắt đầu sử dụng (giấy phép "dùng thử" triển khai chính sách tính năng "dùng thử" của chúng tôi) , mà bạn có thể sử dụng để thực hiện các kiểm tra khác nhau trong ứng dụng, ví dụ người dùng có thể sử dụng Trial-Feature-A và Trial-Feature-B .
Và dựa trên điều đó, bất cứ khi nào người dùng mua ứng dụng của bạn (cho dù bạn đang sử dụng PayPal, Stripe, v.v.), bạn có thể tạo giấy phép triển khai chính sách tính năng "đầy đủ" và liên kết giấy phép đó với tài khoản của người dùng . Giờ đây, trong ứng dụng của mình, bạn có thể kiểm tra xem người dùng có giấy phép "đầy đủ" có thể sử dụng Pro-Feature-X và Pro-Feature-Y hay không (bằng cách làm điều gì đó như user.HasLicenseFor(FEATURE_POLICY_ID)
).
Tôi đã đề cập đến việc cho phép người dùng của bạn tạo tài khoản người dùng — tôi muốn nói điều đó là gì? Tôi đã đi vào chi tiết vấn đề này trong một vài câu trả lời khác , nhưng tóm tắt nhanh về lý do tại sao tôi nghĩ đây là một cách tuyệt vời để xác thực và xác định người dùng của bạn:
Tất nhiên, nếu bạn không muốn xử lý tài khoản người dùng và bạn muốn người dùng của mình nhập các khóa cấp phép, điều đó hoàn toàn ổn (và Keygen cũng hỗ trợ làm điều đó ). Tôi chỉ đưa ra một cách khác để xử lý khía cạnh đó của việc cấp phép và hy vọng cung cấp trải nghiệm người dùng tốt cho khách hàng của bạn.
Cuối cùng, vì bạn cũng đã đề cập rằng bạn muốn cập nhật các giấy phép này hàng năm, bạn có thể đặt thời hạn trên các chính sách của mình để giấy phép "đầy đủ" sẽ hết hạn sau một năm và giấy phép "dùng thử" trước đó là 2 tuần, yêu cầu người dùng của bạn phải mua một giấy phép mới giấy phép sau khi hết hạn.
Tôi có thể tìm hiểu sâu hơn, tham gia vào việc liên kết máy móc với người dùng và những thứ tương tự, nhưng tôi nghĩ mình sẽ cố gắng giữ câu trả lời này ngắn gọn và tập trung vào việc cấp phép các tính năng đơn giản cho người dùng của bạn.
Vui lòng kiểm tra câu trả lời này: https://stackoverflow.com/a/38598174/1275924
Ý tưởng là sử dụng Cryptolens làm máy chủ cấp phép. Đây là một ví dụ từng bước (trong C # và VB.NET). Tôi cũng đã đính kèm đoạn mã để xác minh khóa bên dưới (trong C #):
var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";
var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
Key = licenseKey,
ProductId = 3349,
Sign = true,
MachineCode = Helpers.GetMachineCode()
});
if (result == null || result.Result == ResultType.Error ||
!result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
// an error occurred or the key is invalid or it cannot be activated
// (eg. the limit of activated devices was achieved)
Console.WriteLine("The license does not work.");
}
else
{
// everything went fine if we are here!
Console.WriteLine("The license is valid!");
}
Console.ReadLine();