Bagaimana kunci lisensi perangkat lunak dihasilkan?


361

Kunci lisensi adalah standar de facto sebagai tindakan anti-pembajakan. Sejujurnya, ini mengejutkan saya sebagai (dalam) Keamanan Melalui Ketidakjelasan , meskipun saya benar-benar tidak tahu bagaimana kunci lisensi dihasilkan. Apa contoh yang baik (aman) dari pembuatan kunci lisensi? Apa primitif kriptografi (jika ada) yang mereka gunakan? Apakah ini pesan intisari? Jika demikian, data apa yang akan mereka hashing? Metode apa yang digunakan pengembang untuk membuat cracker kesulitan membangun generator utama mereka sendiri? Bagaimana generator utama dibuat?


8
+1 pertanyaan menarik, mungkin penjawab dapat memposting tautan ke beberapa sumber yang bagus tentang topik ini untuk dibaca lebih lanjut? tolong :)
Yakub

44
Semua skema DRM pada dasarnya adalah skema tidak jelas, karena semua kode dan data yang diperlukan untuk menjalankan program telah dipasok kepada pengguna. Skema ini dapat dibuat dengan sembarangan untuk menyulitkan penambalan, tetapi suatu kepastian bahwa kode tersebut dapat ditambal untuk menghindari pemeriksaan apa pun.
caf

5
Kunci CD memang keamanan melalui ketidakjelasan. Ada beberapa cara untuk membangunnya, tetapi semuanya harus bergantung pada penyisipan beberapa rahasia dalam program yang diperlukan untuk memverifikasi kunci.
Nick Johnson

4
Mereka disebut kunci produk atau kunci lisensi sekarang, karena sebagian besar perangkat lunak yang menggunakannya lebih mungkin dikirim secara online daripada dengan cd.
Joel Coehoorn

4
Saya ingin membuat aplikasi suatu hari nanti di mana saya harus khawatir tentang ini, semacam mimpi masa kecil. Aplikasi web tidak memotongnya.
Znarkus

Jawaban:


268

Untuk kunci CD jadul, itu hanya masalah membuat algoritma untuk kunci CD mana (yang bisa berupa string apa saja) yang mudah dibuat dan mudah diverifikasi, tetapi rasio kunci CD yang valid terhadap CD yang tidak valid -keys sangat kecil sehingga menebak-nebak kunci CD tidak akan membuat Anda valid.

CARA YANG TIDAK BENAR UNTUK MELAKUKANNYA:

Starcraft dan Half-life keduanya menggunakan checksum yang sama, di mana digit ke-13 memverifikasi ke-12 pertama. Dengan demikian, Anda bisa memasukkan apa pun untuk 12 digit pertama, dan menebak ke-13 (hanya ada 10 kemungkinan), yang mengarah ke yang terkenal itu.1234-56789-1234

Algoritma untuk memverifikasi bersifat publik, dan terlihat seperti ini:

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

CARA YANG BENAR UNTUK MELAKUKANNYA

Windows XP mengambil cukup banyak informasi, mengenkripsi, dan menempatkan pengkodean huruf / angka pada stiker. Ini memungkinkan MS untuk memverifikasi kunci Anda dan mendapatkan jenis produk (Rumah, Profesional, dll.) Secara bersamaan. Selain itu, memerlukan aktivasi online.
Algoritma lengkapnya agak rumit, tetapi diuraikan dengan baik dalam makalah ini (sepenuhnya legal!), Yang diterbitkan di Jerman.

Tentu saja, apa pun yang Anda lakukan, kecuali jika Anda menawarkan layanan online (seperti World of Warcraft ), semua jenis perlindungan salinan hanyalah sebuah kios: sayangnya, jika itu adalah nilai permainan apa pun, seseorang akan rusak (atau setidaknya mengelak ) algoritma CD-key, dan semua perlindungan hak cipta lainnya.

CARA NYATA YANG BENAR - BENAR MELAKUKANNYA:

Untuk layanan online, hidup sedikit lebih sederhana, karena bahkan dengan file biner Anda perlu mengautentikasi dengan server mereka untuk memanfaatkannya (mis. Punya akun WoW). Algoritma CD-key untuk World of Warcraft - digunakan, misalnya, ketika membeli kartu bermain - mungkin terlihat seperti ini:

  1. Hasilkan nomor acak cryptographically aman yang sangat besar.
  2. Simpan di basis data kami dan cetak di kartu.

    Kemudian, ketika seseorang memasukkan nomor kartu bermain, periksa apakah itu ada di database, dan jika ada, kaitkan nomor itu dengan pengguna saat ini sehingga tidak akan pernah dapat digunakan lagi.

Untuk layanan online, tidak ada alasan untuk tidak menggunakan skema di atas; menggunakan hal lain dapat menyebabkan masalah .


47
Mathematica memiliki proses yang menarik. Produk dilengkapi dengan kunci unik, dan file instalasi menghasilkan kunci unik kedua (berdasarkan perangkat keras Anda). Kedua kunci ini harus dimasukkan ke dalam formulir online dengan nama dan informasi pendaftaran Anda, dan kemudian mereka mengirimi Anda kunci asli berdasarkan dari dua kunci yang sebenarnya membuka kunci perangkat lunak, tetapi hanya untuk kunci produk spesifik itu dan pada perangkat keras spesifik Anda.
Dan

18
Heh, saya tidak pernah tahu tentang 1234-56789-1234kunci Starcraft, tetapi saya ingat bahwa hanya butuh sekitar lima menit untuk "memaksa" verifikasi dengan menekan tombol dan mencoba lagi.
fmark

18
Saya juga ingat beberapa produk Microsoft di masa lalu yang memungkinkan Anda untuk menggunakan 111-1111111 sebagai cdkey yang valid (Visual Studio 6.0)
hannson

25
Tidak pernah tahu tentang 1234-56789-1234. Sebaliknya, kami menggunakan tiga belas tiga! 3333333333333
ErikTJ

33
Masalah dengan aktivasi online adalah bahwa kita semua kacau jika / ketika penerbit keluar dari bisnis. Tolong jangan lakukan ini. Ini terjadi, dan dapat / akan terjadi bahkan pada Microsoft suatu hari nanti.
Brad

56

Ketika saya awalnya menulis jawaban ini, ada asumsi bahwa pertanyaan itu mengenai validasi kunci luring. Sebagian besar jawaban lain membahas verifikasi online, yang secara signifikan lebih mudah ditangani (sebagian besar logika dapat dilakukan di sisi server).

Dengan verifikasi offline, hal yang paling sulit adalah memastikan bahwa Anda dapat menghasilkan sejumlah besar kunci lisensi unik, dan tetap mempertahankan algoritma yang kuat yang tidak mudah dikompromikan (seperti angka cek sederhana)

Saya tidak terlalu berpengalaman dalam matematika, tetapi saya tersadar bahwa salah satu cara untuk melakukan ini adalah dengan menggunakan fungsi matematika yang memplot grafik

Garis yang diplot dapat memiliki (jika Anda menggunakan frekuensi yang cukup baik) ribuan titik unik, sehingga Anda dapat menghasilkan kunci dengan memilih titik-titik acak pada grafik itu dan menyandikan nilainya dengan beberapa cara

masukkan deskripsi gambar di sini

Sebagai contoh, kita akan memplot grafik ini, memilih empat poin dan mengkodekan ke dalam string sebagai "0, -500; 100, -300; 200, -100; 100.600"

Kami akan mengenkripsi string dengan kunci yang dikenal dan diperbaiki (sangat lemah, tetapi melayani tujuan), kemudian mengonversi byte yang dihasilkan melalui Base32 untuk menghasilkan kunci terakhir

Aplikasi kemudian dapat membalikkan proses ini (base32 ke bilangan real, mendekripsi, mendekodekan poin) dan kemudian memeriksa masing-masing poin tersebut pada grafik rahasia kami.

Ini adalah sejumlah kecil kode yang akan memungkinkan sejumlah besar kunci unik dan valid dihasilkan

Namun itu sangat aman dengan ketidakjelasan. Siapa pun yang meluangkan waktu untuk membongkar kode akan dapat menemukan fungsi grafik dan kunci enkripsi, kemudian membuat generator kunci, tetapi mungkin cukup berguna untuk memperlambat pembajakan kasual.


6
Tidak, Erik tidak mau. X adalah bilangan bulat dan Y adalah dasar dari fungsi.
Joshua

Ini tidak berbeda dengan berapa lama navigasi satelit pra-GPS bekerja! youtube.com/watch?v=BBOsQBuCJfs
Brad

34

Periksa artikel ini tentang Verifikasi Kunci Sebagian yang mencakup persyaratan berikut:

  • Kunci lisensi harus cukup mudah untuk diketik.

  • Kita harus dapat memasukkan (mencabut) kunci lisensi ke dalam kasus tolak bayar atau pembelian dengan kartu kredit curian.

  • Tidak ada "telepon rumah" untuk menguji kunci. Meskipun praktik ini menjadi semakin lazim, saya masih tidak menghargainya sebagai pengguna, jadi tidak akan meminta pengguna saya untuk menggunakannya.

  • Seharusnya cracker tidak mungkin membongkar aplikasi yang dirilis dan menghasilkan "keygen" yang berfungsi dari itu. Ini berarti bahwa aplikasi kami tidak akan sepenuhnya menguji kunci untuk verifikasi. Hanya beberapa kunci yang akan diuji. Selanjutnya, setiap rilis aplikasi harus menguji bagian yang berbeda dari kunci, sehingga kunci palsu yang didasarkan pada rilis sebelumnya tidak akan berfungsi pada rilis selanjutnya dari perangkat lunak kami.

  • Penting: seharusnya tidak mungkin bagi pengguna yang sah untuk secara tidak sengaja mengetik kunci yang tidak valid yang akan berfungsi tetapi gagal pada versi yang akan datang karena kesalahan ketik.


21

Saya tidak punya pengalaman dengan apa yang sebenarnya orang lakukan untuk menghasilkan kunci CD, tetapi (dengan asumsi Anda tidak ingin pergi ke jalan aktivasi online) di sini adalah beberapa cara orang bisa membuat kunci:

  • Mengharuskan bahwa angka dapat dibagi oleh (katakanlah) 17. Sepele untuk ditebak, jika Anda memiliki akses ke banyak kunci, tetapi mayoritas string potensial akan tidak valid. Serupa akan membutuhkan bahwa checksum dari kunci cocok dengan nilai yang diketahui.

  • Mensyaratkan bahwa paruh pertama kunci, ketika digabungkan dengan nilai yang diketahui, hash turun ke bagian kedua kunci. Lebih baik, tetapi program masih berisi semua informasi yang diperlukan untuk menghasilkan kunci serta memvalidasi mereka.

  • Hasilkan kunci dengan mengenkripsi (dengan kunci pribadi) nilai yang diketahui + bukan. Ini dapat diverifikasi dengan mendekripsi menggunakan kunci publik yang sesuai dan memverifikasi nilai yang diketahui. Program sekarang memiliki informasi yang cukup untuk memverifikasi kunci tanpa dapat menghasilkan kunci.

Ini semua masih terbuka untuk diserang: programnya masih ada dan dapat ditambal untuk memotong cek. Cleverer mungkin mengenkripsi bagian dari program menggunakan nilai yang diketahui dari metode ketiga saya, daripada menyimpan nilai dalam program. Dengan begitu Anda harus menemukan salinan kunci sebelum Anda bisa mendekripsi program, tetapi masih rentan disalin setelah didekripsi dan meminta satu orang mengambil salinan resmi mereka dan menggunakannya untuk memungkinkan orang lain mengakses perangkat lunak.


9
Saya benar-benar berharap siapa pun yang datang dengan 'nomor digunakan sekali' hal tidak memilih Nonce sebagai nama, mengingat konotasi negatif ahem yang membuat saya tertawa setiap kali seseorang menyarankan mengenkripsi satu.
Ed James

2
Perhatikan bahwa opsi ketiga tidak bekerja dengan kunci sandi simetris karena penyerang hanya bisa membalikkan tes pada teks biasa, menghasilkan sesuatu yang lewat dan kemudian mengenkripsi dengan kunci (dikenal) dan sandi (dikenal). Menggunakan cypher minuman rumahan bukanlah solusi karena jika Anda dapat melakukannya sendiri, Anda harus mendapatkan pekerjaan di NSA.
BCS

@BCS: Maaf, saya seharusnya lebih jelas tentang menggunakan kunci publik kripto.
Andrew Aylett

Gunakan skema tanda tangan, bukan skema enkripsi untuk versi kunci publik. (Tanda tangan RSA terlihat sedikit seperti "enkripsi dengan kunci publik", tetapi tidak sepenuhnya sama. Ada skema tanda tangan lain yang tidak memiliki skema enkripsi yang terkait, seperti DSA.)
Paŭlo Ebermann

Masalah dengan kunci publik kripto adalah kunci (dan karenanya serial) harus panjang. Keypair RSA 512-bit tidak sulit untuk retak hari ini. Bandingkan dengan kunci WinXP (5 grup dengan 5 karakter alfanumerik) yang hanya memiliki 128 bit entropi tetapi masih sulit untuk mengetik.
finnw

17

CD-Keys tidak terlalu aman untuk hal-hal non-jaringan, jadi secara teknis mereka tidak perlu dibuat dengan aman. Jika Anda menggunakan .net, Anda hampir dapat menggunakan Guid.NewGuid ().

Penggunaan utama mereka saat ini adalah untuk komponen Multiplayer, di mana server dapat memverifikasi Kunci CD. Untuk itu, tidak penting seberapa aman itu dihasilkan saat bermuara pada "Cari apa saja yang dilewatkan dan periksa apakah orang lain sudah menggunakannya".

Yang sedang berkata, Anda mungkin ingin menggunakan algoritme untuk mencapai dua tujuan:

  • Miliki semacam checksum. Itu memungkinkan Pemasang Anda untuk menampilkan pesan "Kunci tidak tampak valid", semata-mata untuk mendeteksi kesalahan ketik (Menambahkan tanda centang pada pemasang sebenarnya berarti bahwa menulis Generator Kunci sepele karena peretas memiliki semua kode yang ia butuhkan. Tidak memiliki periksa dan hanya mengandalkan penonaktifan sisi-server penonaktifan yang memeriksa, dengan risiko mengganggu pelanggan hukum Anda yang tidak mengerti mengapa server tidak menerima CD Key mereka karena mereka tidak mengetahui kesalahan ketik)
  • Bekerja dengan subset karakter yang terbatas. Mencoba mengetikkan Kunci CD dan menebak, "Apakah ini 8 atau B? A 1 atau I? A Q atau O atau 0?" - dengan menggunakan subset karakter / angka non-ambigus Anda menghilangkan kebingungan itu.

Yang sedang berkata, Anda masih ingin distribusi besar dan keacakan untuk menghindari bajak laut hanya menebak kunci yang valid (itu valid dalam database Anda tetapi masih dalam kotak di rak toko) dan mengacaukan pelanggan yang sah yang kebetulan membeli kotak itu .


mudah dipecahkan oleh layanan pelanggan yang baik - Bidikan kotak + Bukti Pembelian = Kunci pengguna ilegal, Berikan Akses Pengguna Kedua.
alexanderpas

1
berikut adalah beberapa pemikiran tambahan tentang kunci CD codinghorror.com/blog/2007/12/software-registration-keys.html
Richard Chambers

10

Jika Anda tidak terlalu peduli dengan panjang kunci, metode yang cukup dicoba dan benar adalah penggunaan enkripsi kunci publik dan pribadi.

Pada dasarnya memiliki beberapa jenis tanda tangan dan tetap.

Misalnya: 0001-123456789

Di mana 0001 adalah milik Anda dan 123456789 adalah tanda tangan tetap Anda.

Kemudian mengenkripsi ini menggunakan kunci pribadi Anda untuk mendapatkan kunci CD Anda yang kira-kira seperti: ABCDEF9876543210

Kemudian sebarkan kunci publik dengan aplikasi Anda. Kunci publik dapat digunakan untuk mendekripsi kunci CD "ABCDEF9876543210", yang kemudian Anda verifikasi bagian tandatangan tetap.

Ini kemudian mencegah seseorang menebak-nebak apa kunci CD untuk nonce 0002 karena mereka tidak memiliki kunci pribadi.

Satu-satunya kelemahan utama adalah bahwa kunci CD Anda akan cukup panjang ketika menggunakan kunci pribadi / publik berukuran 1024-bit. Anda juga harus memilih waktu yang cukup lama sehingga Anda tidak mengenkripsi sejumlah informasi sepele.

Sisi baiknya adalah metode ini akan berfungsi tanpa "aktivasi" dan Anda dapat menggunakan hal-hal seperti alamat email atau nama pemegang lisensi sebagai yang pertama.


1
Harap perhatikan bahwa contoh saya terlalu meremehkan panjang kunci Anda. Skema ini biasanya memerlukan pengodean dan penyalinan / penyalinan base64, tetapi memungkinkan untuk hampir tidak mungkin menebak kunci yang tidak terikat pada mesin dan tidak memerlukan aktivasi (dua hal yang sangat penting bagi banyak jenis pelanggan)
userx

3
Alih-alih menggunakan RSA, Anda dapat menggunakan kurva Elliptic. Mereka menggunakan kunci yang lebih pendek, dan panjang blok mereka lebih kecil. Membaca Wiki, tampaknya ECC 256 bit
seaman

Harap dicatat bahwa tanda tangan digital dan "enkripsi dengan kunci pribadi" bukan hal yang sama. Di RSA mereka terlihat serupa (meskipun tidak, karena skema padding berbeda), skema tanda tangan lain bahkan tidak memiliki skema enkripsi yang sesuai.
Paŭlo Ebermann

@xanatos, 256 bit masih terlalu panjang untuk diketik dengan tangan. Pertimbangkan kunci 25-karakter yang digunakan oleh WinXP - mereka hanya memiliki 128 bit entropi.
finnw

1
@ Mark - Tanda tangan biasanya hanya hash terenkripsi. Anda dapat menggunakan enkripsi atau penandatanganan, metode saya berfungsi sama. Anda hanya mencoba membuat kunci lisensi yang tidak dapat dengan mudah dibuat tanpa kunci pribadi dan dapat diverifikasi oleh kunci publik. Ini bisa berupa seluruh pesan yang dienkripsi (dan Anda memverifikasi bahwa sebagian isinya cocok dengan sesuatu yang ajaib) atau hanya pesan yang ditandatangani (dan Anda memverifikasi bahwa tanda tangannya valid). Terserah implementasi Anda.
userx

9

Sistem kunci harus memiliki beberapa properti:

  • kunci sangat sedikit harus valid
  • kunci yang valid tidak boleh diturunkan meskipun diberikan segala yang dimiliki pengguna.
  • kunci yang valid pada satu sistem bukan kunci yang valid pada yang lain.
  • lainnya

Salah satu solusi yang akan memberi Anda ini adalah dengan menggunakan skema penandatanganan kunci publik . Mulailah dengan "hash sistem" (katakan ambil mac pada NIC, diurutkan, dan info CPU-ID, ditambah beberapa hal lain, gabungkan semuanya bersama-sama dan ambil MD5 dari hasilnya (Anda benar-benar tidak ingin menjadi menangani informasi yang dapat diidentifikasi secara pribadi jika Anda tidak harus)) menambahkan nomor seri CD dan menolak untuk mem-boot kecuali beberapa kunci registri (atau beberapa datafile) memiliki tanda tangan yang valid untuk gumpalan. Pengguna mengaktifkan program dengan mengirimkan gumpalan kepada Anda dan Anda mengirim kembali tanda tangan.

Masalah potensial termasuk bahwa Anda menawarkan untuk menandatangani hampir semua hal sehingga Anda perlu mengasumsikan seseorang akan menjalankan teks biasa yang dipilih dan / atau serangan ciphertext yang dipilih . Itu dapat dikurangi dengan memeriksa nomor seri yang disediakan dan menolak untuk menangani permintaan dari yang tidak valid serta menolak untuk menangani lebih dari jumlah kueri yang diberikan dari s / n yang diberikan dalam suatu interval (katakanlah 2 per tahun)

Saya harus menunjukkan beberapa hal: Pertama, penyerang yang terampil dan bertekad akan dapat mem-bypass setiap dan semua keamanan di bagian-bagian yang mereka memiliki akses tidak terbatas ke ( yaitu segala sesuatu di CD), yang terbaik yang dapat Anda lakukan pada akun itu adalah membuatnya lebih sulit untuk mendapatkan akses tidak sah daripada mendapatkan akses yang sah. Kedua, saya bukan ahli sehingga bisa ada kelemahan serius dalam skema yang diusulkan ini.


1

Ada juga perilaku DRM yang menggabungkan beberapa langkah ke proses. Salah satu contoh paling terkenal adalah salah satu metode Adobe untuk memverifikasi pemasangan Creative Suite mereka. Metode CD Key tradisional yang dibahas di sini digunakan, kemudian jalur dukungan Adobe disebut. Kunci CD diberikan kepada perwakilan Adobe dan mereka memberikan kembali nomor aktivasi untuk digunakan oleh pengguna.

Namun, meskipun telah dipecah menjadi beberapa langkah, ini menjadi mangsa metode cracking yang sama yang digunakan untuk proses normal. Proses yang digunakan untuk membuat kunci aktivasi yang diperiksa terhadap kunci CD asli dengan cepat ditemukan, dan generator yang menggabungkan kedua kunci dibuat.

Namun, metode ini masih ada sebagai cara bagi pengguna yang tidak memiliki koneksi internet untuk memverifikasi produk. Ke depan, mudah untuk melihat bagaimana metode ini akan dihilangkan karena akses internet menjadi di mana-mana.


1

Semua CD hanya menyalin algoritma perlindungan ketidaknyamanan pengguna jujur ​​sambil tidak memberikan perlindungan terhadap pembajakan apa pun.

"Bajak laut" hanya perlu memiliki akses ke satu cd yang sah dan kode aksesnya, ia kemudian dapat membuat n salinan dan mendistribusikannya.

Tidak masalah seberapa aman Anda secara kriptografis membuat kode, Anda harus menyediakan ini dengan CD dalam teks biasa atau pengguna yang sah tidak dapat mengaktifkan perangkat lunak.

Skema yang paling aman melibatkan pengguna yang memberikan rincian peranti kepada pemasok perangkat lunak yang akan menjalankan peranti lunak tersebut (nomor seri cpu, alamat mac, alamat Ip, dll.), Atau, memerlukan akses online untuk mendaftarkan perangkat lunak di situs web pemasok dan sebagai imbalannya menerima token aktivasi. Opsi pertama membutuhkan banyak administrasi manual dan hanya layak untuk perangkat lunak bernilai sangat tinggi, opsi kedua dapat dipalsukan dan benar-benar menyebalkan jika Anda memiliki akses jaringan terbatas atau Anda terjebak di balik firewall.

Secara keseluruhan jauh lebih mudah untuk membangun hubungan saling percaya dengan pelanggan Anda!


0

Anda dapat menggunakan dan menerapkan API Lisensi Aman dari ( https://www.nuget.org/packages/SystemSoulLicense/ ) dengan sangat mudah di Proyek Perangkat Lunak Anda menggunakannya, (Anda perlu mengunduh aplikasi desktop untuk membuat lisensi aman dari https: / /www.systemsoulsoftwares.com/ ) 1. Membuat UID unik untuk perangkat lunak klien berdasarkan Sistem Perangkat Keras (CPU, Motherboard, Hard-drive) (UID bertindak sebagai Kunci Pribadi untuk sistem unik itu) 2. Memungkinkan untuk mengirim string lisensi Terenkripsi dengan sangat mudah ke sistem klien, Ia memverifikasi string lisensi dan hanya bekerja pada sistem tertentu 3. Metode ini memungkinkan pengembang perangkat lunak atau perusahaan untuk menyimpan lebih banyak informasi tentang perangkat lunak / pengembang / layanan distributor / fitur / klien 4. Metode ini memberikan kontrol untuk mengunci dan membuka kunci fitur perangkat lunak klien, menghemat waktu pengembang untuk membuat lebih banyak versi untuk perangkat lunak yang sama dengan fitur yang berubah-ubah. 5. Memperhatikan versi uji coba juga selama beberapa hari 6. Ini mengamankan garis waktu Lisensi dengan Memeriksa DateTime online saat pendaftaran 7. Ini membuka semua informasi perangkat keras kepada pengembang 8.Ia memiliki semua fungsi pra-bangun dan kustom yang dapat diakses pengembang di setiap proses perizinan untuk membuat kode aman yang lebih kompleks

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.