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:
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:
Yanıtlar:
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. :-)
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:
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;)
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-pqrst
ve 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.
Ö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.
Oldukça çılgınca bir şey yapacağımı itiraf etmeliyim.
LicenseCheck'i bulup kaldırdıklarında, DLL segmentasyon hatası oluşturmaya başladığında ne eğlenceli olacak .
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.
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.
Ü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
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.
İş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ı
Bunun için bazı araçlar ve API'ler mevcuttur. Ancak, ücretsiz bir tane bulacağınızı sanmıyorum;)
Örneğin OLicense paketi var: http://www.olicense.de/index.php?lang=en
LicenseSpot'u kontrol edebilirsiniz . Şunları sağlar:
@ 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:
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.
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();