Làm cách nào để tạo khóa sản phẩm cho ứng dụng C # của tôi?


90

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:



@stukelly đó đã được đăng sau khi J3r3myK đăng câu hỏi của mình ...
Dozer789

Câu trả lời:


83

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. :-)


1
Tóm tắt tốt. Nếu bất cứ ai không tin rằng điều này là đơn giản để bỏ qua việc tra cứu CheatEngine, nó rất dễ dàng mà những người không phải lập trình viên cũng có thể làm được. Tốt nhất để làm cho lớp này đơn giản.
Kelly

Tôi gặp phải vấn đề tương tự, tôi đã tạo khóa cấp phép cho ứng dụng của mình với ngày hết hạn và ngày đăng nhập cuối cùng để xác minh, nhưng vấn đề là tôi phải thêm khóa cá nhân để chỉnh sửa tệp nhằm cập nhật ngày đăng nhập cuối cùng là không phải là cách thông minh để đưa chìa khóa vào mã. bất kỳ lời khuyên?
Doicare

16

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:

  • Tên Giấy phép - tên của khách hàng (nếu có) mà bạn đang cấp phép. Hữu ích cho việc quản lý các hoạt động triển khai của công ty - khiến họ cảm thấy đặc biệt khi có tên "được cá nhân hóa" trong thông tin giấy phép mà bạn cung cấp cho họ.
  • Ngày hết hạn giấy phép
  • Số lượng người dùng để chạy theo cùng một giấy phép. Điều này giả sử bạn có một cách theo dõi các phiên bản đang chạy trên một trang web, theo cách máy chủ
  • Mã tính năng - để cho phép bạn sử dụng cùng một hệ thống cấp phép trên nhiều tính năng và trên nhiều sản phẩm. Tất nhiên nếu nó bị nứt cho một sản phẩm thì nó sẽ bị nứt cho tất cả.

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;)


3
Mã hóa FYI luôn có thể đảo ngược, sẽ vô ích nếu không thể đọc những gì đã được mã hóa. Băm là một cách 'mã hóa' mà bạn có thể nghĩ đến.
Samuel

"Đừng triển khai kế hoạch tiền điện tử của riêng bạn", mà tôi nghĩ là từ Bruce Scheier (không chắc chắn), là cách để đi. Bạn có thể muốn có một cái nhìn tại câu trả lời này: security.stackexchange.com/questions/2202/...
Shadok

Bạn có thể nói rõ hơn về "..P / Invoke to it". Tôi đã xem trang được liên kết nhưng nó không khiến tôi khôn ngoan hơn: - /
MrCalvin

11

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.


8

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.


6

Tôi phải thừa nhận rằng tôi đã làm một điều gì đó khá điên rồ.

  1. Tìm một nút cổ chai của CPU và giải nén nó vào tệp P / Invokable DLL.
  2. Là một hành động tạo bài đăng, hãy mã hóa một phần của tệp DLL bằng khóa mã hóa XOR.
  3. Chọn lược đồ khóa công khai / riêng tư, bao gồm khóa công khai trong tệp DLL
  4. Sắp xếp sao cho việc giải mã khóa sản phẩm và XOR hai nửa với nhau sẽ dẫn đến khóa mã hóa cho DLL.
  5. Trong mã DllMain của DLL, vô hiệu hóa bảo vệ (PAGE_EXECUTE_READWRITE) và giải mã nó bằng khóa.
  6. Tạo một phương thức LicenseCheck () giúp kiểm tra sự tỉnh táo của khóa cấp phép và các tham số, sau đó kiểm tra toàn bộ tệp DLL, loại bỏ vi phạm giấy phép. Ồ, và thực hiện một số khởi tạo khác ở đây.

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 .


Điều đó có cần phải tắt DEP không?
Rowland Shaw

Không. Đặt PAGE_EXECUTE_READWRITE là cách chính xác đã được ghi chép trong tài liệu để viết mã tự sửa đổi và chỉ xóa bit NX trên trang đó.
Joshua

8
Kỹ thuật chung này rất phổ biến vào cuối những năm 80. Điểm yếu của nó là mã "bí mật" được giải mã vào RAM, khiến nó dễ dàng bị đánh cắp từ bất kỳ bản sao đang chạy nào của phần mềm.
Ray Burns

5

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ị).


Đối với những ghi nhớ nó như hủy: SLP được bắt đầu lại một lần nữa
Michael Olesen

5

Nếu bạn muốn một giải pháp đơn giản chỉ để tạo và xác minh số sê-ri, hãy thử Ellipter . Nó sử dụng mật mã đường cong elliptic và có tính năng "Ngày hết hạn" để bạn có thể tạo mạng dùng thử hoặc khóa đăng ký có giới hạn thời gian.


2

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


2

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.


1

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


6
"Bí quyết là phải có một thuật toán mà chỉ bạn mới biết" - đây là định nghĩa khá mơ hồ về bảo mật và một ý tưởng thực sự tồi.
Nick Johnson

3
Tất cả việc cấp phép là bởi một thuật toán liên quan đến bí mật. Licensing thường tốt nhất tiếp cận bởi đầu tư vào các luật sư, chứ không phải là chạy đua vũ trang của đến với phím "không thể phá vỡ"
Rowland Shaw

+1 cho nhận xét liên quan đến việc thực thi giấy phép thông qua các phương tiện pháp lý
Rob

Vâng, tất cả các cấp phép đều yếu, giống như DRM. Tuy nhiên, dựa vào một thuật toán bí mật là yếu hơn rõ ràng .
Nick Johnson

1
Tôi đã cho bạn +1 cho một câu trả lời hay và tôi muốn tôi cung cấp cho bạn một câu trả lời nữa để phản đối sự phản đối. Đáng buồn thay, có một số em bé rất non nớt trên thế giới.
ProfK


0

Bạn có thể kiểm tra LicenseSpot . Nó cung cấp:

  • Thành phần cấp phép miễn phí
  • Kích hoạt trực tuyến
  • API để tích hợp ứng dụng của bạn và cửa hàng trực tuyến
  • Tạo số sê-ri
  • Thu hồi giấy phép
  • Quản lý đăng ký

1
"Miễn phí" không hẳn là miễn phí. Miễn phí để nhúng thành phần cấp phép vào ứng dụng của bạn; nó không miễn phí để ứng dụng thực sự sử dụng thành phần cấp phép. Ngoài 10 lần kích hoạt, Bạn cần phải trả phí hàng tháng. Nó không phải là tỷ lệ phần trăm mỗi lần kích hoạt. Đối với các ứng dụng .NET khối lượng thấp chi phí thấp, mô hình định giá này sẽ là một bất lợi. Nó không giống như Apple AppStore cho các ứng dụng .NET.
Cheeso

0

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-ATrial-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-XPro-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:

  1. Tài khoản người dùng cho phép bạn liên kết nhiều giấy phépnhiều máy với một người dùng , cung cấp cho bạn thông tin chi tiết về hành vi của khách hàng và nhắc họ "mua hàng trong ứng dụng" tức là mua phiên bản "đầy đủ" của bạn (giống như ứng dụng dành cho thiết bị di động).
  2. Chúng tôi không nên yêu cầu khách hàng của mình nhập các khóa cấp phép dài, vừa khiến việc nhập liệu trở nên tẻ nhạt vừa khó theo dõi, tức là họ dễ bị thất lạc. (Hãy thử tìm kiếm "khóa cấp phép bị mất" trên Twitter!)
  3. Khách hàng đã quen với việc sử dụng email / mật khẩu ; Tôi nghĩ chúng ta nên làm những gì mọi người đã quen làm để chúng ta có thể cung cấp trải nghiệm người dùng (UX) tốt.

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.


0

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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.