Question

Comment créer une clé de produit pour mon application C #?

Je dois créer une clé de produit (ou de licence) que je mets à jour annuellement. De plus, je dois en créer un pour les versions d'évaluation.

  

Connexes:

     
Était-ce utile?

La solution

Vous pouvez par exemple créer un enregistrement contenant les données que vous souhaitez authentifier auprès de l'application. Cela peut inclure tout ce que vous voulez - par exemple fonctionnalités du programme pour activer, date d'expiration, nom de l'utilisateur (si vous souhaitez le lier à un utilisateur). Puis chiffrez cela en utilisant un algorithme de chiffrement avec une clé fixe ou hachez-le. Ensuite, il vous suffit de le vérifier dans votre programme. Un moyen de distribuer le fichier de licence (sous Windows) consiste à le fournir sous la forme d’un fichier qui met à jour le registre (en évitant à l’utilisateur de le saisir).

Attention toutefois au faux sentiment de sécurité: tôt ou tard, quelqu'un corrigera simplement votre programme pour ignorer cette vérification et distribuera la version corrigée. Ou bien, ils travailleront sur une clé qui passe toutes les vérifications et la distribueront, ou antidater l'horloge, etc. Peu importe la complexité de votre stratagème, tout ce que vous ferez pour cela sera finalement une sécurité par l'obscurité et ils seront toujours être capable de cela. Même s'ils ne peuvent pas, quelqu'un le fera et distribuera la version piratée. La même chose s'applique même si vous fournissez un dongle - si quelqu'un le souhaite, il peut également corriger le chèque. Signer numériquement votre code ne vous aidera pas, ils peuvent supprimer cette signature ou la démissionner.

Vous pouvez compliquer un peu les choses en utilisant des techniques pour empêcher le programme de s'exécuter dans un débogueur, etc., mais même ceci n'est pas à l'épreuve des balles. Donc, vous devriez juste rendre assez difficile qu'un utilisateur honnête n'oublie pas de payer. Veillez également à ce que votre système ne devienne pas gênant pour les utilisateurs payants. Il est préférable d’en avoir des copies arrachées plutôt que de permettre à vos clients payants de ne pas utiliser ce pour quoi ils ont payé.

Une autre option consiste à effectuer une vérification en ligne. Il suffit de fournir à l'utilisateur un identifiant unique, de vérifier en ligne les fonctionnalités que cet identifiant doit avoir et de le mettre en cache pendant un certain temps. Les mêmes mises en garde s’appliquent cependant: les gens peuvent éviter ce genre de situation.

Prenez également en compte les coûts de support liés aux utilisateurs qui ont oublié leur clé, etc.

modifier: je veux juste ajouter quelque chose, n’investissez pas trop de temps dans ce domaine ou ne pensez pas que votre stratagème compliqué sera différent et insaisissable. Ce ne sera pas, et cela ne sera pas possible tant que les gens contrôleront le matériel et le système d'exploitation sur lequel votre programme est exécuté. Les développeurs ont essayé de mettre au point des systèmes de plus en plus complexes, pensant que s'ils développaient leur propre système, il ne serait connu que par eux et donc "plus sûr". Mais c’est vraiment l’équivalent en programmation d’essayer de construire une machine à mouvement perpétuel. : -)

Autres conseils

À qui faites-vous confiance?

J'ai toujours jugé ce domaine trop important pour faire confiance à un tiers pour gérer la sécurité d'exécution de votre application. Une fois que ce composant est fissuré pour une application, il l'est pour toutes les applications. Il est arrivé à Discret en cinq minutes, une fois qu'ils ont opté pour une solution de licence tierce pour 3ds Max il y a des années ... De bons temps!

Sérieusement, envisagez de lancer le vôtre pour avoir le contrôle total de votre algorithme. Si vous le faites, envisagez d’utiliser des composants dans votre clé selon les lignes suivantes:

  • Nom de la licence - nom du client (le cas échéant) sous licence. Utile pour la gestion des déploiements d’entreprise: donnez-leur l’impression d’avoir un service "personnalisé". nom dans les informations de licence que vous leur fournissez.
  • Date d'expiration de la licence
  • Nombre d'utilisateurs à exécuter sous la même licence. Cela suppose que vous disposiez d'un moyen de suivre les instances en cours d'exécution sur un site, de manière serveur-ish
  • Codes de fonction - pour vous permettre d'utiliser le même système de licence pour plusieurs fonctionnalités et pour plusieurs produits. Bien sûr, si un produit est fissuré, il l'est pour tous.

Ensuite, contrôlez l’enfer et ajoutez le cryptage (réversible) de votre choix pour le rendre plus difficile à craquer.

Pour créer une clé de licence d'évaluation, il vous suffit de définir les valeurs ci-dessus traduites en "mode d'évaluation".

Et comme il s’agit probablement du code le plus important de votre application / société, envisagez plutôt de placer les routines de déchiffrement dans un fichier DLL natif au lieu de / obscurcir et simplement P / Invoke .

Plusieurs entreprises pour lesquelles j'ai travaillé ont adopté des approches généralisées à cet égard avec beaucoup de succès. Ou peut-être que les produits ne valaient pas la peine d'être craqués;)

Si vous posez des questions sur les clés que vous pouvez saisir, telles que les clés de produit Windows, elles sont basées sur certaines vérifications. Si vous parlez des clés que vous devez copier coller, elles sont basées sur une signature numérique (cryptage par clé privée).

Une simple logique de clé de produit pourrait être de commencer par dire que la clé de produit est constituée de quatre groupes de 5 chiffres, comme abcde-fghij-kljmo-pqrst , puis de spécifier des relations internes. comme f + k + p doit être égal à a, ce qui signifie que les premiers chiffres des groupes 2, 3 et 4 doivent totaliser a. Cela signifie que 8xxxx-2xxxx-4xxxx-2xxxx est valide, donc 8xxxx-1xxxx-0xxxx-7xxxx. Bien sûr, il y aurait également d'autres relations, y compris des relations complexes telles que, si le deuxième chiffre du premier groupe est impair, alors le dernier chiffre du dernier groupe devrait également l'être. De cette façon, il y aurait des générateurs pour les clés de produit et la vérification des clés de produit vérifierait simplement si elle correspond à toutes les règles.

Le chiffrement est normalement la chaîne d'informations sur la licence chiffrée à l'aide d'une clé privée (== signée numériquement) et convertie en Base64 . La clé publique est distribuée avec l'application. Lorsque la chaîne Base64 arrive, elle est vérifiée (== déchiffrée) par la clé publique et, si elle est jugée valide, le produit est activé.

Que ce soit trivial ou difficile à résoudre, je ne suis pas sûr que cela fasse une grande différence.

La probabilité que votre application soit fissurée est bien plus proportionnelle à son utilité qu’à la puissance de la manipulation de la clé de produit.

Personnellement, je pense qu’il existe deux classes d’utilisateurs. Ceux qui paient. Ceux qui ne le font pas. Ceux qui le feront le feront probablement avec la protection même la plus triviale. Ceux qui n'attendront pas une fissure ou regarder ailleurs. De toute façon, cela ne vous rapportera plus d'argent.

Je dois admettre que je ferais quelque chose d'assez fou.

  1. Recherchez un goulot d'étranglement de l'unité centrale et extrayez-le dans un fichier DLL P / Invokeable .
  2. Comme action de post-génération, chiffrez une partie du fichier DLL avec un XOR clé de cryptage.
  3. Sélectionnez un schéma de clé publique / privée, incluez la clé publique dans le fichier DLL
  4. Faites en sorte que le déchiffrement de la clé de produit et le XORing des deux divise en deux la valeur de chiffrement de la DLL.
  5. Dans le code DllMain de la DLL, désactivez la protection (PAGE_EXECUTE_READWRITE) et décryptez-le avec la clé.
  6. Créez une méthode LicenseCheck () qui effectue une vérification de la validité du clé de licence et les paramètres, puis checksums tout le fichier DLL, jetant violation de licence sur l'un ou l'autre. Oh, et faire une autre initialisation ici.

Quand ils trouveront et retireront le LicenseCheck, quel plaisir suivra au démarrage de la DLL, présente une faute sur la segmentation .

Il existe également l'option Services de gestion et de gestion des licences logicielles (SLP). Après avoir lu quelque chose à ce sujet, j'aimerais vraiment pouvoir l'utiliser.

J'aime beaucoup l’idée de bloquer des parties de code basées sur la licence. Hot stuff, et le plus sécurisé pour .NET. Une lecture intéressante même si vous ne l'utilisez pas!

  

Microsoft & # 174; Licence de logiciel et   Services de protection (SLP) est un   service d'activation de logiciel qui   permet aux vendeurs de logiciels indépendants   (ISV) à adopter des licences flexibles   termes pour leurs clients. Microsoft   SLP Services emploie un unique   méthode de protection qui aide à sauvegarder   votre application et licence   informations vous permettant d'arriver à   marché plus rapidement tout en augmentant   conformité client.

Remarque: c’est le seul moyen de publier un produit avec un code sensible (tel qu’un algorithme précieux).

Si vous souhaitez une solution simple pour créer et vérifier les numéros de série, essayez Ellipter . Il utilise la cryptographie à courbes elliptiques et dispose d'une "Date d'expiration". afin que vous puissiez créer des versions d’essai ou des clés d’enregistrement limitées dans le temps.

Un autre outil bon marché pour les clés de produit et les activations est un produit appelé InstallKey. Jetez un coup d’œil à www.lomacons.com

Une méthode simple consiste à utiliser un identificateur global unique (GUID). Les GUID sont généralement stockés en tant que valeurs 128 bits et sont généralement affichés sous forme de 32 chiffres hexadécimaux avec des groupes séparés par des traits d'union, tels que {21EC2020-3AEA-4069-A2DD-08002B30309D} . . .

Utilisez le code suivant en C # avec 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}", "<*>/")); // And use this to separate every four digits with a "/".

J'espère que cela vous aidera.

Le truc, c’est d’avoir un algorithme que vous seul connaissez (tel qu’il puisse être décodé à l’autre bout).

Il existe des éléments simples tels que "Choisissez un nombre premier et ajoutez-y un nombre magique"

Des options plus complexes telles que l’utilisation du chiffrement asymétrique d’un ensemble de données binaires (pouvant inclure un identifiant unique, les numéros de version, etc.) et la distribution des données chiffrées sous forme de clé.

Cela pourrait également valoir la peine de lire les réponses à la question .

Certains outils et API sont disponibles pour cela. Cependant, je ne pense pas que vous en trouverez un gratuitement;)

Il y a par exemple la suite OLicense: http://www.olicense.de/index.php?lang=en

Vous pouvez vérifier LicenseSpot . Il fournit:

  • Composant de licence libre
  • Activation en ligne
  • API pour intégrer votre application et votre boutique en ligne
  • Génération de numéro de série
  • Révoquer les licences
  • Gestion des abonnements

Je vais revenir un peu sur l'excellente réponse de @frankodwyer et approfondir un peu les licences en ligne. Je suis le fondateur de Keygen , une API REST de gestion des licences conçue pour les développeurs.

Depuis que vous avez indiqué vouloir 2 "types" de licences pour votre application, c'est-à-dire une "version complète". et une "version d'évaluation", nous pouvons simplifier cela et utiliser un modèle de licence de fonctionnalité dans lequel vous accordez une licence à des fonctionnalités spécifiques de votre application (dans ce cas, il existe un ensemble de fonctionnalités "complet" et "version d'évaluation".

Pour commencer, nous pouvons créer 2 types de licence (appelés stratégies dans Keygen). Chaque fois qu'un utilisateur enregistre un compte, vous pouvez générer un " essai " une licence leur permettant de commencer (la licence "essai" met en œuvre notre stratégie relative aux fonctionnalités "d'essai"), que vous pouvez utiliser pour effectuer diverses vérifications dans l'application, par exemple. L'utilisateur peut-il utiliser Trial-Feature-A et Trial-Feature-B .

Et en tirant parti de cela, chaque fois qu'un utilisateur achète votre application (que vous utilisiez PayPal, Stripe, etc.), vous pouvez générer une licence mettant en œuvre le programme "complet". stratégie de fonctionnalité et associez-la au compte de l'utilisateur de l'utilisateur. Désormais, dans votre application, vous pouvez vérifier si l'utilisateur dispose d'un message "complet". licence pouvant exécuter Pro-Feature-X et Pro-Feature-Y (en faisant quelque chose comme user.HasLicenseFor (FEATURE_POLICY_ID) ). / p>

J'ai mentionné la possibilité d'autoriser vos utilisateurs à créer des comptes d'utilisateurs & # 8212; qu'est-ce que je veux dire par là? Je suis entré dans les détails dans a Quelques autres réponses , mais voici un bref aperçu des raisons pour lesquelles j'estime qu'il s'agit d'un moyen supérieur d'authentifier et d'identifier vos utilisateurs:

  1. Les comptes d'utilisateur vous permettent d'associer plusieurs licences et plusieurs machines à un utilisateur unique , vous permettant ainsi de mieux comprendre le comportement de votre client et pour les inviter à effectuer des "achats intégrés", c'est-à-dire à acheter votre compte "complet". version (un peu comme les applications mobiles).
  2. Nous ne devrions pas demander à nos clients de saisir de longues clés de licence, qui sont fastidieuses à saisir et difficiles à suivre , c’est-à-dire qu’elles se perdent facilement. (Essayez de chercher "clé de licence perdue" sur Twitter!)
  3. Les clients sont habitués à utiliser un email / mot de passe ; Je pense que nous devrions faire ce que les gens ont l'habitude de faire pour pouvoir offrir une bonne expérience utilisateur (UX).

Bien sûr, si vous ne voulez pas gérer les comptes d'utilisateurs et si vous voulez que vos utilisateurs saisissent des clés de licence, c'est très bien (et Keygen prend également en charge cette opération ). Je vous propose simplement un autre moyen de gérer cet aspect de la gestion des licences et, espérons-le, de proposer une bonne expérience utilisateur à vos clients.

Enfin, puisque vous avez également indiqué que vous souhaitiez mettre à jour ces licences une fois par an, vous pouvez définir une durée dans vos stratégies de manière à ce que "complet" les licences expireront après un an et "essai". Les licences durent 2 semaines, obligeant vos utilisateurs à acheter une nouvelle licence après son expiration.

Je pourrais creuser davantage, en associant des machines à des utilisateurs, etc., mais je me suis dit que j'essaierais de garder cette réponse courte et de me concentrer sur l'octroi de licences à des fonctionnalités uniquement à vos utilisateurs.

Veuillez vérifier cette réponse: https://stackoverflow.com/a/38598174/1275924

L’idée est d’utiliser Cryptolens comme serveur de licences. Voici un exemple pas à pas (en C # et VB.NET). J'ai également joint un extrait de code pour la vérification de la clé ci-dessous (en 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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top