Saat ini saya terlibat dalam pengembangan produk (dikembangkan dalam C #) yang akan tersedia untuk diunduh dan dipasang secara gratis tetapi dalam versi yang sangat terbatas. Untuk mendapatkan akses ke semua fitur, pengguna harus membayar biaya lisensi dan menerima kunci. Kunci itu kemudian akan dimasukkan ke dalam aplikasi untuk "membuka" versi lengkap.
Seperti menggunakan kunci lisensi seperti itu biasa, saya bertanya-tanya:
- Bagaimana itu biasanya diselesaikan?
- Bagaimana saya bisa menghasilkan kunci dan bagaimana itu dapat divalidasi oleh aplikasi?
- Bagaimana saya bisa menghindari agar kunci tidak dipublikasikan di Internet dan digunakan oleh orang lain yang belum membayar lisensi (kunci yang pada dasarnya bukan "milik mereka").
Saya kira saya juga harus mengikat kunci ke versi aplikasi entah bagaimana sehingga akan mungkin untuk menagih untuk kunci baru di versi fitur.
Ada lagi yang harus saya pikirkan dalam skenario ini?
sumber
Ada banyak cara untuk menghasilkan kunci lisensi, tetapi sangat sedikit cara yang benar-benar aman. Sangat disayangkan, karena bagi perusahaan, kunci lisensi memiliki nilai yang hampir sama dengan uang tunai nyata.
Idealnya, Anda ingin kunci lisensi Anda memiliki properti berikut:
Hanya perusahaan Anda yang dapat membuat kunci lisensi untuk produk Anda, bahkan jika seseorang benar-benar merekayasa ulang produk Anda (yang AKAN terjadi, saya berbicara dari pengalaman). Mengacaukan algoritma atau menyembunyikan kunci enkripsi dalam perangkat lunak Anda benar-benar keluar dari pertanyaan jika Anda serius mengendalikan lisensi. Jika produk Anda berhasil, seseorang akan membuat generator utama dalam beberapa hari setelah rilis.
Kunci lisensi harus dapat digunakan hanya pada satu komputer (atau setidaknya Anda harus dapat mengendalikan ini dengan sangat ketat)
Kunci lisensi harus pendek dan mudah diketik atau didikte melalui telepon. Anda tidak ingin setiap pelanggan memanggil dukungan teknis karena mereka tidak mengerti jika kunci berisi "l" atau "1". Departemen dukungan Anda akan berterima kasih untuk ini, dan Anda akan memiliki biaya lebih rendah di bidang ini.
Jadi bagaimana Anda mengatasi tantangan ini?
Jawabannya sederhana tetapi secara teknis menantang: tanda tangan digital menggunakan kriptografi kunci publik. Kunci lisensi Anda sebenarnya harus ditandatangani "dokumen", berisi beberapa data yang berguna, ditandatangani dengan kunci pribadi perusahaan Anda. Tanda tangan harus menjadi bagian dari kunci lisensi. Produk harus memvalidasi kunci lisensi dengan kunci publik yang sesuai. Dengan cara ini, bahkan jika seseorang memiliki akses penuh ke logika produk Anda, mereka tidak dapat membuat kunci lisensi karena mereka tidak memiliki kunci pribadi. Kunci lisensi akan terlihat seperti ini: BASE32 (CONCAT (DATA, PRIVATE_KEY_ENCRYPTED (HASH (DATA)))) Tantangan terbesar di sini adalah bahwa algoritma kunci publik klasik memiliki ukuran tanda tangan yang besar. RSA512 memiliki tanda tangan 1024-bit. Anda tidak ingin kunci lisensi Anda memiliki ratusan karakter. Salah satu pendekatan yang paling kuat adalah dengan menggunakan kriptografi kurva eliptik (dengan implementasi yang cermat untuk menghindari paten yang ada). Kunci ECC seperti 6 kali lebih pendek dari kunci RSA, untuk kekuatan yang sama. Anda selanjutnya dapat mengurangi ukuran tanda tangan menggunakan algoritma seperti algoritme tanda tangan digital Schnorr (paten kedaluwarsa pada 2008 - bagus :))
Ini dapat dicapai dengan aktivasi produk (Windows adalah contoh yang baik). Pada dasarnya, untuk pelanggan dengan kunci lisensi yang valid, Anda perlu membuat beberapa "data aktivasi" yang merupakan pesan yang ditandatangani yang menyematkan id perangkat keras komputer sebagai data yang ditandatangani. Ini biasanya dilakukan melalui internet, tetapi hanya SEKALI: produk mengirim kunci lisensi dan id perangkat keras komputer ke server aktivasi, dan server aktivasi mengirim kembali pesan yang ditandatangani (yang juga dapat dibuat singkat dan mudah untuk didikte melalui telepon). Sejak saat itu, produk tidak memeriksa kunci lisensi saat startup, tetapi data aktivasi, yang membutuhkan komputer agar sama untuk memvalidasi (jika tidak, DATA akan berbeda dan tanda tangan digital tidak akan divalidasi).
Nah, cukup singkirkan karakter yang berlebihan seperti "1", "l", "0", "o" dari kunci Anda. Pisahkan string kunci lisensi menjadi grup karakter.
sumber
Jawaban sederhana - Tidak peduli skema apa yang Anda gunakan, bisa dipecahkan.
Jangan menghukum pelanggan yang jujur dengan sistem yang dimaksudkan untuk mencegah peretas, karena peretas akan memecahkannya.
Kode hash sederhana yang diikat ke email atau sejenisnya mungkin cukup baik. ID berbasis perangkat keras selalu menjadi masalah ketika orang perlu menginstal ulang atau memperbarui perangkat keras.
Utas bagus tentang masalah ini: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34
sumber
Saat membuat kunci, jangan lupa untuk menyatukan versi dan membangun nomor ke string yang Anda hitung. Dengan begitu tidak akan ada satu tombol pun yang membuka semua yang pernah Anda lepaskan.
Setelah Anda menemukan beberapa kunci atau tambalan melayang di astalavista.box.sk Anda akan tahu bahwa Anda berhasil membuat sesuatu yang cukup populer sehingga seseorang mau repot-repot memecahkannya. Bersuka cita!
sumber
Selain apa yang telah dinyatakan ....
Setiap penggunaan aplikasi .NET secara inheren dapat dipecahkan karena masalah bahasa perantara. Pembongkaran sederhana dari kode .NET akan membuka produk Anda kepada siapa pun. Mereka dapat dengan mudah mem-bypass kode lisensi Anda pada saat itu.
Anda bahkan tidak bisa menggunakan nilai perangkat keras untuk membuat kunci lagi. Mesin virtual sekarang memungkinkan seseorang untuk membuat gambar mesin 'berlisensi' dan menjalankannya pada platform apa pun yang mereka pilih.
Jika perangkat lunak mahal ada solusi lain. Jika tidak, buat saja itu cukup sulit bagi peretas biasa. Dan terima fakta bahwa pada akhirnya akan ada salinan tanpa izin.
Jika produk Anda rumit, masalah dukungan yang melekat akan membuat beberapa perlindungan untuk Anda.
sumber
Mesin C # / .NET yang kami gunakan untuk pembuatan kunci lisensi sekarang dikelola sebagai sumber terbuka:
https://github.com/appsoftware/.NET-Licence-Key-Generator .
Ini didasarkan pada sistem "Partial Key Verification" yang berarti hanya sebagian dari kunci yang Anda gunakan untuk menghasilkan kunci yang harus dikompilasi ke dalam didistribusikan Anda. Anda membuat kunci sendiri, sehingga penerapan lisensi unik untuk perangkat lunak Anda.
Seperti yang dinyatakan di atas, jika kode Anda dapat didekompilasi, relatif mudah untuk menghindari sebagian besar sistem lisensi.
sumber
Saya salah satu pengembang di belakang platform lisensi perangkat lunak Cryptolens dan telah bekerja pada sistem lisensi sejak usia 14 tahun. Dalam jawaban ini, saya telah memasukkan beberapa tips berdasarkan pengalaman yang diperoleh selama bertahun-tahun.
Cara terbaik untuk memecahkan masalah ini adalah dengan membuat server kunci lisensi yang akan dipanggil oleh setiap instance aplikasi untuk memverifikasi kunci lisensi.
Manfaat server kunci lisensi
Keuntungan dengan server kunci lisensi adalah:
Pertimbangan
Meskipun memverifikasi lisensi online memberi Anda lebih banyak kontrol atas setiap instance aplikasi, koneksi internet tidak selalu ada (terutama jika Anda menargetkan perusahaan yang lebih besar), jadi kami memerlukan cara lain untuk melakukan verifikasi kunci lisensi.
Solusinya adalah untuk selalu menandatangani respons kunci lisensi dari server menggunakan cryptosystem kunci publik seperti RSA atau ECC (mungkin lebih baik jika Anda berencana untuk berjalan pada sistem embedded). Aplikasi Anda hanya boleh memiliki kunci publik untuk memverifikasi respons kunci lisensi.
Jadi seandainya tidak ada koneksi internet, Anda dapat menggunakan respons kunci lisensi sebelumnya. Pastikan untuk menyimpan tanggal dan pengidentifikasi mesin dalam respons dan periksa bahwa tanggal tersebut tidak terlalu lama (mis. Anda mengizinkan pengguna offline paling lama 30 hari, dll) dan bahwa respons kunci lisensi milik perangkat yang benar.
Melindungi algoritma rahasia
Sebagian besar aplikasi .NET dapat direkayasa ulang dengan cukup mudah (ada diassembler yang disediakan oleh Microsoft untuk mendapatkan kode IL dan beberapa produk komersial bahkan dapat mengambil kode sumber dalam mis. C #). Tentu saja, Anda selalu dapat mengaburkan kodenya, tetapi tidak pernah 100% aman.
Saya kebanyakan kasus, tujuan dari solusi lisensi perangkat lunak adalah untuk membantu orang jujur menjadi jujur (yaitu bahwa pengguna jujur yang bersedia membayar jangan lupa untuk membayar setelah masa percobaan berakhir, dll).
Namun, Anda mungkin masih memiliki beberapa kode yang tidak ingin Anda bocorkan ke publik (mis. Algoritma untuk memprediksi harga saham, dll). Dalam hal ini, satu-satunya cara untuk pergi adalah membuat titik akhir API yang akan dipanggil aplikasi Anda setiap kali metode ini harus dijalankan. Ini memerlukan koneksi internet tetapi memastikan bahwa kode rahasia Anda tidak pernah dijalankan oleh mesin klien.
Penerapan
Jika Anda tidak ingin menerapkan semuanya sendiri, saya akan merekomendasikan untuk melihat tutorial ini (bagian dari Cryptolens )
sumber
Saya telah menggunakan Crypkey di masa lalu. Ini salah satu dari banyak yang tersedia.
Anda hanya dapat melindungi perangkat lunak hingga titik tertentu dengan skema lisensi apa pun.
sumber
Saya tidak tahu seberapa rumit yang ingin Anda dapatkan
tetapi saya percaya bahwa .net dapat mengakses nomor seri hard drive.
Anda dapat meminta program mengirimkannya kepada Anda dan sesuatu yang lain (seperti nama pengguna dan alamat mac nic)
Anda menghitung kode berdasarkan itu dan mengirimkannya kembali melalui email.
mereka akan mencegah mereka beralih mesin setelah mereka memiliki kunci.
sumber
Satu-satunya cara untuk melakukan semua yang Anda minta adalah dengan memerlukan akses internet dan verifikasi dengan server. Aplikasi perlu masuk ke server dengan kunci, dan kemudian Anda perlu menyimpan detail sesi, seperti alamat IP. Ini akan mencegah kunci dari digunakan pada beberapa mesin yang berbeda. Ini biasanya tidak terlalu populer di kalangan pengguna aplikasi, dan kecuali ini adalah aplikasi yang sangat mahal dan rumit, itu tidak sepadan.
Anda bisa saja memiliki kunci lisensi untuk aplikasi tersebut, dan kemudian memeriksa sisi klien apakah kuncinya baik, tetapi mudah untuk mendistribusikan kunci ini ke pengguna lain, dan dengan dekompiler kunci baru dapat dihasilkan.
sumber
Saya telah menerapkan aktivasi satu kali berbasis internet pada perangkat lunak perusahaan saya (C # .net) yang memerlukan kunci lisensi yang merujuk pada lisensi yang disimpan dalam database server. Perangkat lunak mengenai server dengan kunci dan diberikan informasi lisensi yang kemudian dienkripsi secara lokal menggunakan kunci RSA yang dihasilkan dari beberapa variabel (kombinasi CPUID dan hal-hal lain yang tidak sering berubah) pada komputer klien dan kemudian menyimpannya di registri.
Ini memerlukan beberapa pengkodean sisi server, tetapi telah bekerja dengan sangat baik bagi kami dan saya dapat menggunakan sistem yang sama ketika kami memperluas ke perangkat lunak berbasis browser. Ini juga memberi orang-orang penjualan Anda info hebat tentang siapa, di mana, dan kapan perangkat lunak itu digunakan. Setiap sistem lisensi yang hanya ditangani secara lokal sangat rentan terhadap eksploitasi, terutama dengan refleksi dalam .NET . Tetapi, seperti yang dikatakan semua orang, tidak ada sistem yang sepenuhnya aman.
Menurut pendapat saya, jika Anda tidak menggunakan lisensi berbasis web, tidak ada gunanya melindungi perangkat lunak sama sekali. Dengan sakit kepala yang disebabkan oleh DRM, tidak adil bagi pengguna yang benar-benar membayarnya.
sumber
Saya sangat percaya, bahwa hanya sistem lisensi berbasis kriptografi kunci publik adalah pendekatan yang tepat di sini, karena Anda tidak harus memasukkan informasi penting yang diperlukan untuk pembuatan lisensi ke dalam kode sumber Anda.
Di masa lalu, saya telah menggunakan Perpustakaan Lisensi Treek berkali-kali, karena memenuhi persyaratan ini dan menawarkan harga yang sangat bagus. Ia menggunakan perlindungan lisensi yang sama untuk pengguna akhir dan itu sendiri dan tidak ada yang memecahkannya sampai sekarang. Anda juga dapat menemukan kiat-kiat bagus di situs web untuk menghindari pembajakan dan pemecahan.
sumber
Seperti yang disebutkan beberapa orang lainnya, secara default saya adalah lawan yang sangat memusuhi pelanggan — sesuatu yang terkenal oleh industri perizinan. Jadi saya akan memperluas solusi yang baik untuk masalah Anda yang juga menawarkan UX pelanggan yang baik .
Sebagai permulaan, Anda menyebutkan bahwa Anda memiliki versi "terbatas" dari perangkat lunak yang Anda gunakan untuk mencoba dan mengonversi pelanggan untuk "meningkatkan" untuk fitur tambahan. Jadi yang Anda cari adalah lisensi fitur untuk produk Anda, misalnya pelanggan dapat membeli lisensi untuk fitur-X atau fitur-Y .
Saya membuat Keygen dengan mempertimbangkan jenis lisensi ini. Keygen adalah API REST lisensi yang memungkinkan Anda untuk mengelola akun pengguna, lisensi, dan juga melacak penggunaan / asosiasi mesin.
Apa yang akan saya lakukan adalah menyiapkan 2 jenis lisensi ( kebijakan di dalam Keygen) di mana satu adalah kebijakan dasar untuk versi gratis terbatas, dan yang lainnya adalah kebijakan untuk versi berbayar.
Saya tidak yakin apa yang Anda gunakan untuk pembayaran, tetapi mari kita asumsikan Anda menggunakan sesuatu seperti Stripe (cukup standar saat ini) yang menawarkan webhooks . Keygen juga memiliki webhooks (apakah Anda menggunakannya atau tidak, semua ini masih berlaku). Anda dapat mengintegrasikan Keygen untuk berbicara dengan penyedia pembayaran Anda menggunakan kait web dari kedua sisi (pikirkan:
customer.created
-> buat lisensi dasar untuk pelanggan,license.created
-> biaya pelanggan untuk lisensi baru).Jadi dengan memanfaatkan webhooks, kami dapat mengotomatisasi pembuatan lisensi untuk pelanggan baru. Jadi bagaimana dengan validasi lisensi dalam aplikasi itu sendiri? Ini dapat dilakukan dengan berbagai cara, tetapi cara yang paling populer adalah dengan meminta pelanggan Anda untuk memasukkan kunci lisensi yang panjang ke dalam bidang input yang kemudian dapat divalidasi; Saya pikir ini adalah cara yang mengerikan untuk menangani validasi lisensi di aplikasi Anda.
Kenapa aku berpikir begitu? Pertama-tama, Anda mewajibkan pelanggan Anda untuk memasukkan kunci lisensi yang sangat panjang yang dimaksudkan untuk konsumsi mesin, dan kedua Anda mengharuskan Anda dan pelanggan Anda untuk melacak kunci lisensi yang panjang dan membosankan itu .
Oke, jadi apa alternatifnya? Saya pikir alternatif terbaik adalah melakukan sesuatu yang biasa digunakan oleh pelanggan Anda: memungkinkan mereka membuat akun untuk produk Anda menggunakan email / kata sandi . Anda kemudian dapat mengaitkan semua lisensi dan mesin mereka dengan akun itu. Jadi sekarang alih-alih memasukkan kunci lisensi, mereka dapat masuk menggunakan kredensial mereka.
Apa manfaatnya bagi Anda? Pertama, ini menghilangkan kebutuhan Anda dan pelanggan Anda untuk melacak kunci lisensi, karena semuanya ditangani di belakang layar di dalam akun pengguna mereka dan yang paling penting: Anda sekarang dapat menawarkan pelanggan Anda lisensi dan mesin swalayan pengaktifan! yaitu karena semua lisensi dan mesin mereka terkait dengan akun pengguna mereka, Anda dapat meminta mereka untuk membeli lisensi ketika mereka menjalankan aplikasi Anda pada mesin yang tidak dikenal.
Sekarang ke validasi lisensi : setiap kali pelanggan Anda masuk ke aplikasi Anda dengan email / kata sandi mereka, Anda dapat meminta akun pengguna mereka untuk lisensi yang mereka miliki untuk menentukan apakah mereka dapat menggunakan fitur-X atau fitur-Y . Dan karena aplikasi Anda sekarang melayani sendiri , Anda dapat memungkinkan pelanggan Anda untuk membeli fitur tambahan langsung dari dalam aplikasi Anda!
Jadi kami telah memperkenalkan satu ton otomatisasi ke sistem lisensi kami, kami dapat melisensikan fitur individual (yaitu versi terbatas vs lengkap), kami telah menawarkan UX yang luar biasa bagi pelanggan kami dan kami juga mengurangi salah satu alasan terbesar untuk permintaan dukungan: pemulihan kunci lisensi.
Ngomong-ngomong, ini lama sekali tapi mudah-mudahan ini membantu seseorang!
sumber
Tidak mungkin untuk mencegah pembajakan perangkat lunak sepenuhnya. Anda dapat mencegah pembajakan biasa dan itulah yang dilakukan oleh semua solusi lisensi.
Lisensi simpul (mesin) terkunci adalah yang terbaik jika Anda ingin mencegah penggunaan kembali kunci lisensi. Saya telah menggunakan Cryptlex selama sekitar satu tahun sekarang untuk perangkat lunak saya. Ini juga memiliki paket gratis , jadi jika Anda tidak berharap terlalu banyak pelanggan, Anda dapat menggunakannya secara gratis.
sumber
Anda dapat menggunakan solusi pihak ketiga gratis untuk menangani ini untuk Anda seperti Quantum-Key.Net Gratis dan menangani pembayaran melalui paypal melalui halaman penjualan web yang dibuatnya untuk Anda, penerbitan kunci melalui email dan kunci penggunaan kunci ke komputer tertentu untuk mencegah pembajakan.
Anda juga harus berhati-hati untuk mengaburkan / mengenkripsi kode Anda atau dapat dengan mudah direkayasa balik menggunakan perangkat lunak seperti De4dot dan .NetReflector. Obfuscator kode gratis yang bagus adalah ConfuserEx yang cepat dan mudah digunakan dan lebih efektif daripada alternatif mahal.
Anda harus menjalankan perangkat lunak yang sudah selesai melalui De4Dot dan .NetReflector untuk merekayasa balik dan melihat apa yang akan dilihat oleh cracker jika mereka melakukan hal yang sama dan untuk memastikan Anda tidak membiarkan kode penting apa pun terbuka atau tidak disembunyikan.
Perangkat lunak Anda masih dapat di-crack, tetapi untuk cracker biasa mungkin cukup untuk menunda dan langkah-langkah sederhana ini juga akan mencegah kode Anda diekstraksi dan digunakan kembali.
https://quantum-key.net
Bagaimana cara menggunakan ConfuserEx?
https://github.com/0xd4d/de4dot
https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download
sumber