Bagaimana cara membuat kunci produk untuk aplikasi C # saya?


91

Bagaimana cara membuat kunci produk untuk Aplikasi C # saya?

Saya perlu membuat kunci produk (atau lisensi) yang saya perbarui setiap tahun. Selain itu saya perlu membuatnya untuk versi percobaan.

Terkait:



@stukelly yang diposting setelah J3r3myK memposting pertanyaannya ...
Dozer789

Jawaban:


83

Anda dapat melakukan sesuatu seperti membuat record yang berisi data yang ingin Anda autentikasi ke aplikasi. Ini dapat mencakup apapun yang Anda inginkan - misalnya fitur program yang diaktifkan, tanggal kedaluwarsa, nama pengguna (jika Anda ingin mengikatnya ke pengguna). Kemudian mengenkripsi itu menggunakan beberapa algoritma kripto dengan kunci tetap atau hash itu. Kemudian Anda hanya memverifikasinya dalam program Anda. Salah satu cara untuk mendistribusikan file lisensi (pada windows) adalah dengan menyediakannya sebagai file yang memperbarui registri (pengguna tidak perlu mengetiknya).

Waspadalah terhadap rasa keamanan yang salah - cepat atau lambat seseorang akan dengan mudah menambal program Anda untuk melewati pemeriksaan itu, dan mendistribusikan versi yang ditambal. Atau, mereka akan membuat kunci yang melewati semua pemeriksaan dan mendistribusikannya, atau memundurkan waktu, dll. Tidak peduli seberapa berbelit-belitnya Anda membuat skema, apa pun yang Anda lakukan untuk ini pada akhirnya akan menjadi keamanan melalui ketidakjelasan dan mereka akan selalu bisa melakukan ini. Bahkan jika mereka tidak bisa, seseorang akan melakukannya, dan akan mendistribusikan versi yang diretas. Hal yang sama berlaku bahkan jika Anda menyediakan dongle - jika seseorang menginginkannya, mereka juga dapat menambal ceknya. Menandatangani kode Anda secara digital tidak akan membantu, mereka dapat menghapus tanda tangan itu, atau mengundurkan diri.

Anda dapat memperumit masalah dengan menggunakan teknik untuk mencegah program berjalan di debugger dll, tetapi ini pun bukan bukti peluru. Jadi, Anda harus membuatnya cukup sulit sehingga pengguna yang jujur ​​tidak akan lupa untuk membayar. Juga berhati-hatilah agar skema Anda tidak mengganggu pengguna yang membayar - lebih baik memiliki beberapa salinan yang disobek daripada pelanggan yang membayar agar tidak dapat menggunakan apa yang telah mereka bayar.

Pilihan lainnya adalah melakukan pemeriksaan online - cukup berikan ID unik kepada pengguna, dan periksa secara online kemampuan apa yang harus dimiliki ID tersebut, dan simpan dalam cache untuk beberapa waktu. Namun, semua peringatan yang sama berlaku - orang bisa menghindari hal seperti ini.

Pertimbangkan juga biaya dukungan karena harus berurusan dengan pengguna yang lupa kunci mereka, dll.

edit: Saya hanya ingin menambahkan, jangan menginvestasikan terlalu banyak waktu dalam hal ini atau berpikir bahwa entah bagaimana skema rumit Anda akan berbeda dan tidak dapat dipecahkan. Itu tidak akan, dan tidak bisa selama orang-orang mengontrol perangkat keras dan OS tempat program Anda berjalan. Pengembang telah mencoba untuk membuat skema yang lebih kompleks untuk ini, berpikir bahwa jika mereka mengembangkan sistem mereka sendiri untuk itu maka itu hanya akan diketahui oleh mereka dan oleh karena itu 'lebih aman'. Tapi itu benar-benar adalah pemrograman yang setara dengan mencoba membangun mesin gerak abadi. :-)


1
Ringkasan yang bagus. Jika ada yang tidak percaya ini mudah untuk melewati pencarian CheatEngine, itu membuat non-pemrogram sangat mudah melakukannya. Paling baik untuk membuat lapisan ini sederhana.
Kelly

Saya memiliki masalah yang sama, saya membuat kunci lisensi untuk aplikasi saya dengan tanggal kedaluwarsa dan tanggal terakhir masuk untuk verifikasi, tetapi masalahnya adalah saya harus menambahkan kunci pribadi untuk mengedit file untuk memperbarui tanggal terakhir yang masuk bukan cara cerdas untuk memasukkan kunci ke dalam kode. ada saran?
Doicare

16

Siapa yang kamu percaya?

Saya selalu menganggap area ini terlalu penting untuk mempercayai pihak ketiga untuk mengelola keamanan runtime aplikasi Anda. Setelah komponen itu di-crack untuk satu aplikasi, itu akan di-crack untuk semua aplikasi. Itu terjadi pada Discreet dalam lima menit setelah mereka menggunakan solusi lisensi pihak ketiga selama 3ds Max bertahun-tahun yang lalu ... Good times!

Serius, pertimbangkan untuk menggulirkan milik Anda sendiri karena memiliki kendali penuh atas algoritme Anda. Jika Anda melakukannya, pertimbangkan untuk menggunakan komponen di kunci Anda di sepanjang baris:

  • Nama Lisensi - nama klien (jika ada) yang Anda lisensikan. Berguna untuk mengelola penerapan perusahaan - buat mereka merasa istimewa memiliki nama yang "dipersonalisasi" dalam informasi lisensi yang Anda berikan kepada mereka.
  • Tanggal berakhirnya lisensi
  • Jumlah pengguna untuk dijalankan di bawah lisensi yang sama. Ini mengasumsikan Anda memiliki cara untuk melacak instance yang berjalan di seluruh situs, dengan cara server-ish
  • Kode fitur - untuk memungkinkan Anda menggunakan sistem lisensi yang sama di beberapa fitur, dan di beberapa produk. Tentu saja jika retak untuk satu produk, itu retak untuk semua.

Kemudian checksum dan tambahkan enkripsi apa pun (yang dapat dibalik) yang Anda inginkan untuk membuatnya lebih sulit untuk dipecahkan.

Untuk membuat kunci lisensi uji coba, cukup tetapkan nilai untuk nilai di atas yang diterjemahkan sebagai "mode uji coba".

Dan karena ini sekarang mungkin kode paling penting dalam aplikasi / perusahaan Anda, di atas / alih-alih kebingungan pertimbangkan untuk meletakkan rutinitas dekripsi dalam file DLL asli dan cukup P / Panggil ke sana.

Beberapa perusahaan tempat saya bekerja telah mengadopsi pendekatan umum untuk ini dengan sukses besar. Atau mungkin produknya tidak layak dipecahkan;)


3
FYI enkripsi selalu dapat dibalik, akan sia-sia jika tidak dapat membaca apa yang telah dienkripsi. Hashing adalah salah satu cara 'enkripsi' yang mungkin Anda pikirkan.
Samuel

"Jangan gulirkan skema kripto Anda sendiri", yang menurut saya berasal dari Bruce Scheier (tidak yakin), adalah cara yang tepat. Anda mungkin ingin melihat jawaban ini: security.stackexchange.com/questions/2202/…
Shadok

Bisakah Anda menjelaskan lebih lanjut tentang "..P / Invoke to it". Saya melihat halaman yang ditautkan tetapi tidak membuat saya lebih bijak: - /
MrCalvin

11

Jika Anda bertanya tentang kunci yang dapat Anda ketik, seperti kunci produk Windows, maka itu didasarkan pada beberapa pemeriksaan. Jika Anda berbicara tentang kunci yang harus Anda salin dan tempel, kunci tersebut didasarkan pada tanda tangan digital (enkripsi kunci pribadi).

Logika kunci produk sederhana dapat dimulai dengan mengatakan bahwa kunci produk terdiri dari empat grup 5-digit, seperti abcde-fghij-kljmo-pqrst, dan kemudian melanjutkan untuk menentukan hubungan internal seperti f + k + p harus sama dengan a, yang berarti digit pertama dari 2 , 3 dan 4 kelompok harus berjumlah a. Ini berarti 8xxxx-2xxxx-4xxxx-2xxxx valid, begitu juga 8xxxx-1xxxx-0xxxx-7xxxx. Tentu saja, akan ada hubungan lain juga, termasuk hubungan kompleks seperti, jika digit kedua dari kelompok pertama ganjil, maka digit terakhir dari kelompok terakhir juga harus ganjil. Dengan cara ini akan ada generator untuk kunci produk dan verifikasi kunci produk hanya akan memeriksa apakah cocok dengan semua aturan.

Enkripsi biasanya berupa rangkaian informasi tentang lisensi yang dienkripsi menggunakan kunci pribadi (== ditandatangani secara digital) dan dikonversi ke Base64 . Kunci publik didistribusikan dengan aplikasi. Ketika string Base64 tiba, itu diverifikasi (== didekripsi) oleh kunci publik dan jika ditemukan valid, produk diaktifkan.


9

Entah itu sepele atau sulit untuk dipecahkan, saya tidak yakin itu benar-benar membuat banyak perbedaan.

Kemungkinan aplikasi Anda diretas jauh lebih sebanding dengan kegunaannya daripada kekuatan penanganan kunci produk.

Secara pribadi, menurut saya ada dua kelas pengguna. Mereka yang membayar. Mereka yang tidak. Orang-orang yang melakukannya kemungkinan besar akan melakukannya dengan perlindungan yang paling sepele sekalipun. Mereka yang tidak akan menunggu celah atau mencari di tempat lain. Bagaimanapun, itu tidak akan memberi Anda uang lagi.


6

Saya harus mengakui bahwa saya telah melakukan sesuatu yang agak gila.

  1. Temukan kemacetan CPU dan ekstrak ke file DLL P / Invokeable .
  2. Sebagai tindakan pasca pembuatan, mengenkripsi bagian dari file DLL dengan kunci enkripsi XOR.
  3. Pilih skema kunci publik / pribadi, sertakan kunci publik di file DLL
  4. Atur agar mendekripsi kunci produk dan XOR kedua bagian bersama-sama menghasilkan kunci enkripsi untuk DLL.
  5. Dalam kode DllMain DLL, nonaktifkan perlindungan (PAGE_EXECUTE_READWRITE) dan dekripsi dengan kunci.
  6. Buat metode LicenseCheck () yang melakukan pemeriksaan kewarasan kunci lisensi dan parameter, lalu memeriksa seluruh file DLL, yang menyebabkan pelanggaran lisensi salah satunya. Oh, dan lakukan inisialisasi lainnya di sini.

Ketika mereka menemukan dan menghapus LicenseCheck, kesenangan apa yang akan mengikuti ketika DLL mulai melakukan segmentasi kesalahan .


Bukankah itu perlu DEP untuk dinonaktifkan?
Rowland Shaw

Tidak. Pengaturan PAGE_EXECUTE_READWRITE adalah dokumentasi cara yang benar untuk menulis kode modifikasi sendiri dan membersihkan bit NX pada halaman itu saja.
Joshua

8
Teknik umum ini sangat populer di akhir tahun 80-an. Kelemahannya adalah kode "rahasia" didekripsi menjadi RAM, membuatnya mudah untuk dicuri dari semua salinan perangkat lunak yang sedang berjalan.
Ray Burns

5

Ada opsi Lisensi dan Perlindungan Perangkat Lunak Microsoft (SLP) juga. Setelah membaca tentang itu saya benar-benar berharap saya bisa menggunakannya.

Saya sangat menyukai gagasan memblokir bagian kode berdasarkan lisensi. Hal keren, dan paling aman untuk .NET. Bacaan yang menarik bahkan jika Anda tidak menggunakannya!

Layanan Lisensi dan Perlindungan Perangkat Lunak Microsoft® (SLP) adalah layanan aktivasi perangkat lunak yang memungkinkan vendor perangkat lunak independen (ISV) untuk mengadopsi persyaratan lisensi fleksibel bagi pelanggan mereka. Layanan Microsoft SLP menggunakan metode perlindungan unik yang membantu melindungi aplikasi Anda dan informasi lisensi yang memungkinkan Anda masuk ke pasar lebih cepat sambil meningkatkan kepatuhan pelanggan.

Catatan: Ini adalah satu-satunya cara saya akan merilis produk dengan kode sensitif (seperti algoritme yang berharga).


Bagi mereka yang mengingatnya sebagai dibatalkan: SLP diluncurkan kembali
Michael Olesen

5

Jika Anda menginginkan solusi sederhana hanya untuk membuat dan memverifikasi nomor seri, coba Ellipter . Ia menggunakan kriptografi kurva elips dan memiliki fitur "Tanggal Kedaluwarsa" sehingga Anda dapat membuat verifikasi percobaan atau kunci pendaftaran terbatas waktu.


2

Alat murah lain yang bagus untuk kunci produk dan aktivasi adalah produk yang disebut InstallKey. Lihatlah www.lomacons.com


2

Salah satu metode sederhana adalah menggunakan Pengenal Unik Secara Global (GUID). GUID biasanya disimpan sebagai nilai 128-bit dan biasanya ditampilkan sebagai 32 digit heksadesimal dengan grup yang dipisahkan oleh tanda hubung, seperti{21EC2020-3AEA-4069-A2DD-08002B30309D} .

Gunakan kode berikut di C # oleh 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 "/".

Saya harap ini membantu.


1

Triknya adalah memiliki algoritme yang hanya Anda yang tahu (sehingga algoritme tersebut dapat diterjemahkan di ujung lain).

Ada beberapa hal sederhana seperti, "Pilih bilangan prima dan tambahkan bilangan ajaib ke dalamnya"

Opsi yang lebih berbelit-belit seperti menggunakan enkripsi asimetris dari sekumpulan data biner (yang dapat mencakup pengenal unik, nomor versi, dll) dan mendistribusikan data terenkripsi sebagai kuncinya.

Mungkin juga bermanfaat membaca tanggapan atas pertanyaan ini juga


6
"Triknya adalah memiliki algoritme yang hanya Anda yang tahu" - ini adalah definisi keamanan berdasarkan ketidakjelasan, dan ide yang sangat buruk.
Nick Johnson

3
Semua perizinan adalah dengan algoritma yang melibatkan rahasia. Perizinan sering kali paling baik didekati dengan berinvestasi pada pengacara, daripada perlombaan senjata menghasilkan kunci yang "tidak bisa dipecahkan"
Rowland Shaw

+1 untuk komentar tentang penegakan lisensi melalui sarana hukum
Rob

Ya, semua perizinan lemah, seperti DRM. Mengandalkan algoritme rahasia terbukti lebih lemah .
Nick Johnson

1
Saya memberi Anda +1 untuk jawaban yang bagus, dan berharap saya memberi Anda yang lain juga untuk melawan suara negatif. Sayangnya ada beberapa bayi kecil yang belum dewasa di dunia.
ProfK


0

Anda dapat memeriksa LicenseSpot . Ini menyediakan:

  • Komponen Lisensi Gratis
  • Aktivasi Online
  • API untuk mengintegrasikan aplikasi dan toko online Anda
  • Pembuatan nomor seri
  • Cabut lisensi
  • Manajemen Langganan

1
"Gratis" sebenarnya tidak gratis. Ini gratis untuk menyematkan komponen lisensi ke dalam aplikasi Anda; tidak gratis bagi aplikasi untuk benar-benar menggunakan komponen lisensi. Di luar 10 aktivasi, Anda perlu membayar biaya bulanan. Ini bukan persentase per aktivasi. Untuk aplikasi .NET berbiaya rendah volume rendah, model harga ini akan merugikan. Ini tidak seperti Apple AppStore untuk aplikasi .NET.
Cheeso

0

Saya akan sedikit mendukung jawaban bagus @ frankodwyer dan menggali lebih dalam tentang perizinan berbasis online. Saya adalah pendiri Keygen , REST API lisensi yang dibuat untuk pengembang.

Karena Anda menyebutkan menginginkan 2 "jenis" lisensi untuk aplikasi Anda, yaitu "versi lengkap" dan "versi uji coba", kami dapat menyederhanakannya dan menggunakan model lisensi fitur di mana Anda melisensikan fitur tertentu dari aplikasi Anda (dalam hal ini, ada kumpulan fitur "lengkap" dan kumpulan fitur "uji coba").

Untuk memulai, kami dapat membuat 2 jenis lisensi (disebut kebijakan di Keygen) dan setiap kali pengguna mendaftarkan akun, Anda dapat membuat lisensi "uji coba" agar mereka dapat memulai (lisensi "uji coba" menerapkan kebijakan fitur "uji coba" kami) , yang dapat Anda gunakan untuk melakukan berbagai pemeriksaan dalam aplikasi, misalnya dapatkah pengguna menggunakan Uji Coba-Fitur-A dan Uji Coba-Fitur-B .

Dan mengembangkannya, setiap kali pengguna membeli aplikasi Anda (baik Anda menggunakan PayPal, Stripe, dll.), Anda dapat membuat lisensi yang menerapkan kebijakan fitur "lengkap" dan mengaitkannya dengan akun pengguna . Sekarang dalam aplikasi Anda, Anda dapat memeriksa apakah pengguna memiliki lisensi "penuh" yang dapat melakukan Pro-Feature-X dan Pro-Feature-Y (dengan melakukan sesuatu seperti user.HasLicenseFor(FEATURE_POLICY_ID)).

Saya menyebutkan mengizinkan pengguna Anda membuat akun pengguna — apa yang saya maksud dengan itu? Saya telah membahas ini secara mendetail dalam beberapa jawaban lain , tetapi ikhtisar singkat tentang mengapa menurut saya ini adalah cara terbaik untuk mengautentikasi dan mengidentifikasi pengguna Anda:

  1. Akun pengguna memungkinkan Anda mengaitkan beberapa lisensi dan beberapa mesin ke satu pengguna , memberikan Anda wawasan tentang perilaku pelanggan Anda dan untuk meminta mereka melakukan "pembelian dalam aplikasi" yaitu membeli versi "lengkap" Anda (seperti aplikasi seluler).
  2. Kami seharusnya tidak meminta pelanggan kami untuk memasukkan kunci lisensi yang panjang, yang keduanya membosankan untuk dimasukkan dan sulit untuk dilacak, yaitu mereka mudah hilang. (Coba cari "kunci lisensi hilang" di Twitter!)
  3. Pelanggan terbiasa menggunakan email / password ; Saya pikir kita harus melakukan apa yang biasa dilakukan orang sehingga kita dapat memberikan pengalaman pengguna yang baik (UX).

Tentu saja, jika Anda tidak ingin menangani akun pengguna dan Anda ingin pengguna Anda memasukkan kunci lisensi, tidak masalah (dan Keygen juga mendukung melakukannya. ). Saya hanya menawarkan cara lain untuk menangani aspek perizinan itu dan semoga memberikan UX yang bagus untuk pelanggan Anda.

Terakhir karena Anda juga menyebutkan bahwa Anda ingin memperbarui lisensi ini setiap tahun, Anda dapat menyetel durasinya pada kebijakan Anda sehingga lisensi "penuh" akan kedaluwarsa setelah satu tahun dan lisensi "uji coba" terakhir mengatakan 2 minggu, mengharuskan pengguna Anda membeli yang baru lisensi setelah kedaluwarsa.

Saya bisa menggali lebih dalam, masuk ke mesin yang mengaitkan dengan pengguna dan hal-hal seperti itu, tetapi saya pikir saya akan mencoba untuk membuat jawaban ini singkat dan fokus hanya pada fitur lisensi untuk pengguna Anda.


0

Silakan periksa jawaban ini: https://stackoverflow.com/a/38598174/1275924

Idenya adalah menggunakan Cryptolens sebagai server lisensi. Berikut adalah contoh langkah demi langkah (di C # dan VB.NET). Saya juga telah melampirkan potongan kode untuk verifikasi kunci di bawah ini (dalam 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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.