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:
c#
.net
license-key
J3r3myK
sumber
sumber
Jawaban:
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. :-)
sumber
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:
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;)
sumber
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.
sumber
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.
sumber
Saya harus mengakui bahwa saya telah melakukan sesuatu yang agak gila.
Ketika mereka menemukan dan menghapus LicenseCheck, kesenangan apa yang akan mengikuti ketika DLL mulai melakukan segmentasi kesalahan .
sumber
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!
Catatan: Ini adalah satu-satunya cara saya akan merilis produk dengan kode sensitif (seperti algoritme yang berharga).
sumber
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.
sumber
Alat murah lain yang bagus untuk kunci produk dan aktivasi adalah produk yang disebut InstallKey. Lihatlah www.lomacons.com
sumber
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.
sumber
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
sumber
Ada beberapa alat dan API yang tersedia untuk itu. Namun, saya rasa Anda tidak akan menemukannya secara gratis;)
Misalnya, suite OLicense: http://www.olicense.de/index.php?lang=en
sumber
Anda dapat memeriksa LicenseSpot . Ini menyediakan:
sumber
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:
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.
sumber
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();
sumber