C # uygulamam için nasıl ürün anahtarı oluşturabilirim?


91

C # Uygulamam için nasıl ürün anahtarı oluşturabilirim?

Yıllık olarak güncellediğim bir ürün (veya lisans) anahtarı oluşturmam gerekiyor. Ayrıca deneme sürümleri için bir tane oluşturmam gerekiyor.

İlişkili:



J3r3myK sorusunu gönderdikten sonra gönderilen @stukelly ...
Dozer789

Yanıtlar:


83

Uygulamada kimliğini doğrulamak istediğiniz verileri içeren bir kayıt oluşturmak gibi bir şey yapabilirsiniz. Bu, istediğiniz her şeyi içerebilir - örneğin, etkinleştirilecek program özellikleri, son kullanma tarihi, kullanıcının adı (bir kullanıcıya bağlamak istiyorsanız). Daha sonra bunu sabit bir anahtarla bir kripto algoritması kullanarak şifreleyin veya ona hash hale getirin. Ardından, bunu programınızda doğrularsınız. Lisans dosyasını (Windows'ta) dağıtmanın bir yolu, onu kayıt defterini güncelleyen (kullanıcıyı yazmak zorunda bırakmayan) bir dosya olarak sağlamaktır.

Yine de yanlış güvenlik duygusuna dikkat edin - er ya da geç birisi bu denetimi atlamak ve yamalı sürümü dağıtmak için basitçe programınıza yama uygulayacaktır. Veya, tüm kontrollerden geçen ve onu dağıtan veya saati geriye doğru güncelleyen bir anahtar bulacaklar. Planınızı ne kadar karmaşık yaparsanız yapın, bunun için yaptığınız her şey nihayetinde belirsizlik yoluyla güvenlik olacak ve her zaman bunu yapabilmek. Birileri yapamazlarsa bile, hacklenmiş sürümü dağıtacak ve dağıtacaktır. Bir dongle tedarik etseniz bile aynı şey geçerlidir - biri isterse, bunun için de çeki ekleyebilir. Kodunuzu dijital olarak imzalamak yardımcı olmaz, bu imzayı kaldırabilir veya iptal edebilir.

Programın bir hata ayıklayıcıda vb. Çalışmasını engelleyen teknikler kullanarak işleri biraz daha karmaşık hale getirebilirsiniz, ancak bu bile kurşun geçirmez değildir. Dürüst bir kullanıcının ödemeyi unutmaması için işi yeterince zorlaştırmalısınız. Ayrıca, planınızın ödeme yapan kullanıcıları rahatsız etmemesine çok dikkat edin - ödeme yapan müşterilerinizin ödedikleri parayı kullanamamaktansa, kopyalarını koparmak daha iyidir.

Diğer bir seçenek de çevrimiçi bir kontrole sahip olmaktır - sadece kullanıcıya benzersiz bir kimlik sağlayın ve bu kimliğin hangi özelliklere sahip olması gerektiğini çevrimiçi olarak kontrol edin ve bir süre önbelleğe alın. Yine de aynı uyarılar geçerlidir - insanlar bunun gibi her şeyi atlatabilir.

Anahtarını unutan kullanıcılarla uğraşmak zorunda kalmanın destek maliyetlerini de göz önünde bulundurun.

edit: Sadece eklemek istiyorum, buna çok fazla zaman harcamayın veya bir şekilde kıvrımlı planınızın farklı ve kırılmaz olacağını düşünmeyin. Olmaz ve insanlar programınızın üzerinde çalıştığı donanımı ve işletim sistemini kontrol ettiği sürece olamaz. Geliştiriciler bunun için her zamankinden daha karmaşık planlar bulmaya çalışıyorlar, bunun için kendi sistemlerini geliştirirlerse bunun yalnızca kendileri tarafından bilineceğini ve dolayısıyla 'daha güvenli' olacağını düşünüyorlar. Ama bu gerçekten bir sürekli hareket makinesi oluşturmaya çalışmanın programlama eşdeğeridir. :-)


1
Güzel özet. CheatEngine'e bakmanın basit olduğuna inanmayan biri varsa, programcı olmayanların bunu yapmasını kolaylaştırır. Bu katmanı basitleştirmek en iyisi.
Kelly

Aynı sorunu yaşıyorum, uygulamam için son kullanma tarihi ve doğrulama için son günlüğe kaydetme tarihi ile bir lisans anahtarı yaptım, ancak sorun şu ki, son günlüğe kaydedilen tarihi güncellemek için dosyayı düzenlemek için özel anahtarı eklemem gerekiyor. anahtarı koda koymanın akıllıca bir yolu değil. herhangi bir tavsiye ?
Doicare

16

Kime güveniyorsun?

Bu alanı her zaman uygulamanızın çalışma zamanı güvenliğini yönetmek için üçüncü bir tarafa güvenmek için çok kritik düşündüm. Bu bileşen bir uygulama için kırıldığında, tüm uygulamalar için kırılır. Yıllar önce 3ds Max için üçüncü taraf bir lisans çözümüne gittiklerinde, Discreet'e beş dakika içinde oldu ... İyi zamanlar!

Cidden, algoritmanız üzerinde tam kontrole sahip olmak için kendinizinkini yuvarlamayı düşünün. Bunu yaparsanız, anahtarınızdaki bileşenleri şu satırlar boyunca kullanmayı düşünün:

  • Lisans Adı - lisansladığınız müşterinin adı (varsa). Şirket dağıtımlarını yönetmek için kullanışlıdır - onlara sağladığınız lisans bilgilerinde "kişiselleştirilmiş" bir ada sahip olmaları için kendilerini özel hissetmelerini sağlayın.
  • Lisans sona erme tarihi
  • Aynı lisans altında çalıştırılacak kullanıcı sayısı. Bu, bir sitede çalışan örnekleri sunucuya benzer bir şekilde izlemenin bir yoluna sahip olduğunuzu varsayar.
  • Özellik kodları - aynı lisans sistemini birden çok özellikte ve birden çok üründe kullanmanıza olanak tanır. Elbette bir ürün için kırılırsa, herkes için kırılır.

Sonra bunların hepsini kontrol edin ve kırılmasını zorlaştırmak için istediğiniz (tersine çevrilebilir) şifrelemeyi ekleyin.

Bir deneme lisans anahtarı oluşturmak için, yukarıdaki değerler için "deneme modu" olarak çevrilen değerleri ayarlamanız yeterlidir.

Ve bu artık muhtemelen uygulamanızdaki / şirketinizdeki en önemli kod olduğundan, gizleme yerine / yerine şifre çözme yordamlarını yerel bir DLL dosyasına koymayı ve basitçe P / Çağırmayı düşünün .

Çalıştığım birçok şirket, bunun için genelleştirilmiş yaklaşımları büyük bir başarıyla benimsedi. Ya da belki ürünler kırılmaya değmezdi;)


3
Bilginize şifreleme her zaman tersine çevrilebilir, şifrelenmiş olanı okuyamamanın yararı olmaz. Hashing, düşünebileceğiniz tek yol 'şifrelemedir'.
Samuel

Bruce Scheier'den olduğunu düşündüğüm "kendi kripto planınızı devretmeyin" (emin değilim), gidilecek yol. Bu yanıta bir göz atmak isteyebilirsiniz: security.stackexchange.com/questions/2202/…
Shadok

"..P / Çağır" konusunu detaylandırır mısınız? Bağlantılı sayfaya baktım ama bu beni daha akıllı yapmadı: - /
MrCalvin

11

Windows ürün anahtarları gibi yazabileceğiniz anahtarlar hakkında soru soruyorsanız, bunlar bazı kontrollere dayanmaktadır. Kopyalamanız gereken anahtarlardan bahsediyorsanız, bunlar dijital bir imzaya (özel anahtar şifreleme) dayanmaktadır.

Basit bir ürün anahtarı mantığı, ürün anahtarının dört adet 5 basamaklı gruptan oluştuğunu söylemekle başlayabilir abcde-fghij-kljmo-pqrstve ardından f + k + p a eşit olmalıdır, yani 2'nin ilk basamakları gibi iç ilişkileri belirtmeye devam edebilir. , 3 ve 4 grup toplamı a. Bu, 8xxxx-2xxxx-4xxxx-2xxxx'in geçerli olduğu anlamına gelir, yani 8xxxx-1xxxx-0xxxx-7xxxx de geçerlidir. Elbette, karmaşık ilişkiler de dahil olmak üzere başka ilişkiler de olacaktır, örneğin birinci grubun ikinci rakamı tuhafsa, son grubun son rakamı da tuhaf olmalıdır. Bu şekilde, ürün anahtarları için oluşturucular olur ve ürün anahtarlarının doğrulanması, tüm kurallara uyup uymadığını kontrol eder.

Şifreleme, normalde özel bir anahtar kullanılarak (== dijital olarak imzalanmış) şifrelenen ve Base64'e dönüştürülen lisans hakkındaki bilgi dizisidir . Genel anahtar uygulama ile birlikte dağıtılır. Base64 dizesi geldiğinde, genel anahtar tarafından doğrulanır (== şifresi çözülür) ve geçerli bulunursa ürün etkinleştirilir.


9

Önemsiz ya da kırılması zor olsun, gerçekten büyük bir fark yarattığından emin değilim.

Uygulamanızın kırılma olasılığı, ürün anahtarı işlemenin gücünden çok kullanışlılığıyla orantılıdır.

Şahsen, iki kullanıcı sınıfı olduğunu düşünüyorum. Ödeyenler. Yapmayanlar. Bunu yapanlar muhtemelen en önemsiz korumayla bile yapacaklardır. Bir çatlak beklemeyenler veya başka bir yere bakmayanlar. Her iki durumda da size daha fazla para kazandırmaz.


6

Oldukça çılgınca bir şey yapacağımı itiraf etmeliyim.

  1. Bir CPU darboğazı bulun ve bunu bir P / Invokeable DLL dosyasına ayıklayın .
  2. Bir derleme sonrası eylemi olarak, DLL dosyasının bir bölümünü bir XOR şifreleme anahtarıyla şifreleyin.
  3. Bir genel / özel anahtar şeması seçin, DLL dosyasına ortak anahtarı ekleyin
  4. Ürün anahtarının şifresini çözmek ve iki yarıyı birlikte XORlamak, DLL için şifreleme anahtarı ile sonuçlanacak şekilde düzenleyin.
  5. DLL'nin DllMain kodunda, korumayı devre dışı bırakın (PAGE_EXECUTE_READWRITE) ve anahtarla şifresini çözün.
  6. Lisans anahtarının ve parametrelerin sağlıklı bir şekilde kontrol edilmesini sağlayan bir LicenseCheck () yöntemi oluşturun, ardından tüm DLL dosyasını kontrol ederek her ikisine de lisans ihlali attı. Oh, ve burada başka bir başlangıç ​​yapın.

LicenseCheck'i bulup kaldırdıklarında, DLL segmentasyon hatası oluşturmaya başladığında ne eğlenceli olacak .


Bu durumda DEP'nin devre dışı bırakılması gerekmez mi?
Rowland Shaw

Hayır. PAGE_EXECUTE_READWRITE ayarı, kendi kendini değiştiren kod yazmanın belgelenmiş doğru yoludur ve yalnızca o sayfadaki NX bitini temizler.
Joshua

8
Bu genel teknik 80'lerin sonunda çok popülerdi. Zayıflığı, "gizli" kodun RAM'e şifresinin çözülmesi ve bu da yazılımın çalışan herhangi bir kopyasından çalmayı kolaylaştırmasıydı.
Ray Burns

5

Microsoft Yazılım Lisanslama ve Koruma seçeneği vardır (SLP) Hizmetleri de vardır. Okuduktan sonra gerçekten kullanabilmeyi isterdim.

Lisansa dayalı olarak kod parçalarını engelleme fikrini gerçekten seviyorum. Güncel şeyler ve .NET için en güvenli. Kullanmasanız bile ilginç okuma!

Microsoft® Yazılım Lisanslama ve Koruma (SLP) Hizmetleri, bağımsız yazılım satıcılarının (ISV'ler) müşterileri için esnek lisans koşullarını benimsemelerini sağlayan bir yazılım etkinleştirme hizmetidir. Microsoft SLP Hizmetleri, uygulamanızın ve lisans bilgilerinizin korunmasına yardımcı olan benzersiz bir koruma yöntemi kullanır ve müşteri uyumluluğunu artırırken pazara daha hızlı girmenizi sağlar.

Not: Bu, hassas kodlu bir ürünü (değerli bir algoritma gibi) yayınlamanın tek yoludur.


İptal edildiğini hatırlayanlar için: SLP yeniden başlatıldı
Michael Olesen

5

Yalnızca seri numaraları oluşturmak ve doğrulamak için basit bir çözüm istiyorsanız, Ellipter'ı deneyin . Eliptik eğri şifrelemesini kullanır ve bir "Son Kullanma Tarihi" özelliğine sahiptir, böylece deneme sürümleri veya zaman sınırlı kayıt anahtarları oluşturabilirsiniz.


2

Ürün anahtarları ve etkinleştirmeleri için bir başka ucuz araç, InstallKey adlı bir üründür. Www.lomacons.com'a bir göz atın


2

Basit bir yöntem, Küresel Olarak Benzersiz Tanımlayıcı (GUID) kullanmaktır. GUID'ler genellikle 128 bitlik değerler olarak depolanır ve genellikle, gibi kısa çizgilerle ayrılmış gruplarla 32 onaltılık basamak olarak görüntülenir {21EC2020-3AEA-4069-A2DD-08002B30309D}.

Aşağıdaki kodu C # ile kullanın 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 "/".

Umut ediyorum bu yardım eder.


1

İşin püf noktası, yalnızca sizin bildiğiniz bir algoritmaya sahip olmaktır (diğer uçta kodu çözülebilecek şekilde).

"Bir asal sayı seçin ve ona sihirli bir sayı ekleyin" gibi basit şeyler vardır.

Bir dizi ikili verinin asimetrik şifrelemesini kullanmak (benzersiz bir tanımlayıcı, sürüm numaraları vb. İçerebilir) ve şifrelenmiş verileri anahtar olarak dağıtmak gibi daha fazla kıvrımlı seçenekler.

Ayrıca verilen yanıtları okuma değerinde olabilir bu soruya yanı


6
"İşin püf noktası, yalnızca sizin bildiğiniz bir algoritmaya sahip olmaktır" - bu, güvenliğin belirsizlikle tanımlanmasıdır ve gerçekten kötü bir fikirdir.
Nick Johnson

3
Tüm lisanslama, sırları içeren bir algoritmadır. Ruhsatlandırma genellikle en iyi "kırılmaz" anahtarlar bulma yarışından ziyade avukatlara yatırım yaparak yaklaşılır
Rowland Shaw

Yasal yollarla lisans yaptırımına ilişkin yorum için +1
Rob

Evet, tüm lisanslar tıpkı DRM gibi zayıftır. Yine de gizli bir algoritmaya güvenmek bariz bir şekilde daha zayıftır .
Nick Johnson

1
İyi bir cevap için sana +1 verdim ve keşke sana bir başka karşı oy verebilseydim. Ne yazık ki dünyada çok olgunlaşmamış bazı bebekler var.
ProfK


0

LicenseSpot'u kontrol edebilirsiniz . Şunları sağlar:

  • Ücretsiz Lisanslama Bileşeni
  • Çevrimiçi Aktivasyon
  • Uygulamanızı ve çevrimiçi mağazanızı entegre etmek için API
  • Seri numarası oluşturma
  • Lisansları iptal edin
  • Abonelik Yönetimi

1
"Bedava" gerçekten özgür değil. Lisanslama bileşenini uygulamanıza yerleştirmek ücretsizdir; uygulamanın lisanslama bileşenini gerçekten kullanması ücretsiz değildir . 10 aktivasyonun ötesinde, aylık bir ücret ödemeniz gerekir. Aktivasyon başına bir yüzde değildir. Düşük hacimli düşük maliyetli .NET uygulamaları için bu fiyatlandırma modeli bir dezavantaj olacaktır. .NET uygulamaları için Apple AppStore gibi değil.
Cheeso

0

@ Frankodwyer'in harika cevabından biraz yararlanacağım ve çevrimiçi tabanlı lisanslamaya biraz daha derinlemesine bakacağım. Geliştiriciler için oluşturulmuş bir lisanslama REST API'si olan Keygen'in kurucusuyum .

Uygulamanız için 2 "tip" lisans, yani "tam sürüm" ve "deneme sürümü" istediğinizden bahsettiğiniz için, bunu basitleştirebilir ve uygulamanızın belirli özelliklerini lisansladığınız bir özellik lisansı modelini kullanabiliriz (bu durumda, bir "tam" özellik seti ve bir "deneme" özellik seti vardır).

Başlangıç ​​olarak, 2 lisans türü oluşturabiliriz ( Keygen'de politikalar olarak adlandırılır ) ve bir kullanıcı bir hesaba kaydolduğunda, başlaması için bir "deneme" lisansı oluşturabilirsiniz ("deneme" lisansı , "deneme" özelliği politikamızı uygular ) , uygulama içinde çeşitli kontroller yapmak için kullanabileceğiniz, örneğin kullanıcı Deneme-Özellik-A ve Deneme-Özellik-B'yi kullanabilir .

Ve buna dayanarak, bir kullanıcı uygulamanızı her satın aldığında (ister PayPal, Stripe, vb. Kullanıyor olun), "tam" özellik politikasını uygulayan bir lisans oluşturabilir ve bunu kullanıcının hesabıyla ilişkilendirebilirsiniz . Artık uygulamanızın içinde, kullanıcının Pro-Feature-X ve Pro-Feature-Y yapabilen (benzer bir şey yaparak user.HasLicenseFor(FEATURE_POLICY_ID)) "tam" bir lisansa sahip olup olmadığını kontrol edebilirsiniz .

Kullanıcılarınızın kullanıcı hesapları oluşturmasına izin vermeyi söyledim - bununla ne demek istiyorum? Bunu birkaç başka yanıtta ayrıntılı olarak ele aldım, ancak bunun neden kullanıcılarınızı doğrulamak ve tanımlamak için daha iyi bir yol olduğunu düşündüğümle ilgili hızlı bir özet:

  1. Kullanıcı hesapları ilişkilendirmek izin birden çok lisans ve birden fazla makine a tek bir kullanıcı size müşterinizin davranışlarını kavramak veren ve "uygulama içi satın alma" için onları teşvik etmek (tür mobil uygulamalar gibi bir) sizin "tam" sürümünü satın yani.
  2. Müşterilerimizden, hem girmesi sıkıcı hem de izlemesi zor olan, yani kolayca kaybolan uzun lisans anahtarlarını girmelerini istememeliyiz. (Twitter'da "kayıp lisans anahtarı" aramayı deneyin!)
  3. Müşteriler bir e-posta / şifre kullanmaya alışkındır ; İyi bir kullanıcı deneyimi (UX) sağlayabilmek için insanların yapmaya alıştıkları şeyi yapmamız gerektiğini düşünüyorum.

Eğer yoksa Tabii ki, istediğiniz kullanıcı hesaplarını ele ve istediğiniz ince tamamen bulunuyor girdi lisans anahtarları, sizin kullanıcılar (ve Keygen desteklerin yanı yapıyor ). Lisanslamanın bu yönünü ele almak için başka bir yol öneriyorum ve umarım müşterileriniz için güzel bir UX sağlar.

Son olarak, bu lisansları yıllık olarak güncellemek istediğinizden de bahsettiğiniz için, politikalarınızda bir süre belirleyerek "tam" lisansların bir yıl sonra ve "deneme" lisanslarının son olarak 2 hafta sonra kullanıcılarınızın yeni bir lisans satın almasını gerektirecek şekilde sona erdikten sonra lisans.

Makineleri kullanıcılarla ve bunun gibi şeylerle ilişkilendirerek daha fazla araştırabilirim, ancak bu cevabı kısa tutmaya çalışacağımı ve kullanıcılarınıza basitçe özellikleri lisanslamaya odaklanacağımı düşündüm.


0

Lütfen şu yanıtı kontrol edin: https://stackoverflow.com/a/38598174/1275924

Buradaki fikir Cryptolens'i lisans sunucusu olarak kullanmaktır . İşte adım adım bir örnek (C # ve VB.NET'te). Ayrıca aşağıda anahtar doğrulama için bir kod parçası ekledim (C # ile):

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.