259 votes

Comment générer et valider une clé de licence logicielle?

Je suis actuellement impliqué dans le développement d'un produit (développé en C#) qui sera disponible pour télécharger et installer gratuitement mais aussi, dans une version limitée. Pour avoir accès à toutes les fonctionnalités de l'utilisateur doit payer une redevance de licence et de recevoir une clé. Cette clé sera ensuite entré dans l'application pour "déverrouiller" la version complète.

Comme à l'aide d'une clé de licence, comme c'est d'habitude, je me demandais :

  1. Comment est-ce généralement résolu?
  2. Comment puis-je générer la clé et comment peut-il être validé par l'application?
  3. Comment puis-je éviter d'avoir une clef publié sur Internet et utilisé par d'autres qui n'ont pas payé la licence (une clé qui, fondamentalement, n'est pas "leur").

Je suppose que je devrais aussi attacher la clé de la version de l'application d'une certaine manière il sera donc possible de charger de nouvelles touches en fonction des versions.

Autre chose que je devrais penser dans ce scénario?

134voto

Brent.Longborough Points 4945

Mise en garde: vous ne pouvez pas empêcher les utilisateurs de piratage, mais seulement le rendre plus facile pour les usagers honnêtes de faire la bonne chose.

En supposant que vous ne voulez pas faire une compilation spéciale pour chaque utilisateur, puis:

  • Générez vous-même une clé secrète pour le produit
  • Prendre le nom de l'utilisateur
  • Concatentate les noms d'utilisateurs, et la clé secrète et de hachage (par exemple) SHA1
  • Déballez le hash SHA1 comme une chaîne alphanumérique. C'est la "Clé de Produit"
  • Dans le programme, faire le même hash, et comparez-la avec la clé de produit. En cas d'égalité, OK.

Mais, je le répète: cela n'empêche pas le piratage


J'ai lu récemment que cette approche n'est pas chiffrée de manière très saine. Mais cette solution est déjà faible (comme le logiciel lui-même doit inclure la clé secrète quelque part), donc je ne pense pas que cette découverte invalide la solution comme il va.

Juste pensé que je dois vraiment parler de cela, cependant, si vous avez l'intention de tirer quelque chose d'autre de ce, méfiez-vous.

116voto

Catalin S. Points 219

Il existe de nombreuses façons de générer des clés de licence, mais très peu de ces manières sont vraiment sécurisé. Et c'est dommage, parce que pour les entreprises, les clés de licence ont presque la même valeur que de l'argent réel.

Idéalement, vous voulez que vos clés de licence pour avoir les propriétés suivantes:

  1. Seulement votre entreprise devrait être en mesure de générer des clés de licence de vos produits, même si quelqu'un de complètement inverse ingénieurs de vos produits (ce qui VA se passer, je parle d'expérience). Obscurcissement de l'algorithme ou de cacher une clé de chiffrement au sein de votre logiciel, c'est pas vraiment la question si vous êtes sérieux au sujet de contrôle de la concession de licences. Si votre produit est un succès, quelqu'un va faire un générateur de clé dans une affaire de jours à partir de la version.

  2. Une clé de licence doit être utilisable sur un seul ordinateur (ou au moins vous devriez être en mesure de contrôler ce très serré)

  3. Une clé de licence doit être court et facile à taper ou de dicter au téléphone. Vous ne voulez pas que chaque client d'appeler le support technique car ils ne savent pas si la clé contient un "l" ou un "1". Votre service de soutien pourraient vous remercier pour ce faire, et vous aurez une réduction des coûts dans ce domaine.

Alors, comment vous résoudre ces difficultés ?

  1. La réponse est simple, mais techniquement difficile: les signatures numériques à l'aide de la cryptographie à clé publique. Vos clés de licence doit être en effet signé "documents", contenant certaines données utiles, signé avec votre entreprise clé privée. Les signatures doivent être une partie de la clé de licence. Le produit doit valider les clés de licence avec la clé publique correspondante. De cette façon, même si quelqu'un a un accès complet à votre produit de la logique, ils ne peuvent pas générer des clés de licence parce qu'ils n'ont pas la clé privée. Une clé de licence devrait ressembler à ceci: BASE32(CONCAT(DONNÉES, PRIVATE_KEY_ENCRYPTED(HASH(DATA)))) Le plus grand défi ici est que le classique à clés publiques, les algorithmes de grande signature tailles. RSA512 a un 1024 bits de signature. Vous ne voulez pas que vos clés de licence pour avoir des centaines de personnages. L'un des plus puissants approches est l'utilisation de la cryptographie à courbe elliptique (avec attention les implémentations pour éviter les brevets existants). ECC touches sont comme 6 fois plus courtes que les clés RSA, pour la même force. Vous pouvez réduire la signature tailles à l'aide d'algorithmes comme le Schnorr algorithme de signature numérique (brevet a expiré en 2008 - bon :) )

  2. Ceci est possible par l'activation de produit Windows (Windows est un bon exemple). En gros, pour un client avec une clé de licence valide, vous avez besoin de générer des "données d'activation", qui est un message signé de l'incorporation du matériel de l'ordinateur id que les données signées. Ceci est généralement fait sur internet, mais une seule FOIS: le produit envoie la clé de licence et le matériel de l'ordinateur de l'id d'un serveur d'activation, et l'activation du serveur renvoie le message signé (qui peut également être fait à court et facile à dicter au téléphone). À partir de ce moment, le produit ne vérifie pas la clé de licence au démarrage, mais les données d'activation, qui a besoin de l'ordinateur pour être le même dans le but de valider (dans le cas contraire, les DONNÉES sont différentes et la signature numérique ne serait pas de valider). Notez que l'activation de la vérification des données ne nécessitent pas de vérification sur Internet: il suffit de vérifier la signature numérique des données d'activation avec la clé publique qui est déjà intégrée dans le produit.

  3. Eh bien, il suffit d'éliminer redondant de caractères comme "1", "l", "0", "o" de vos clés. Diviser la chaîne de clé de licence dans des groupes de caractères.

78voto

schooner Points 1602

Simple réponse - quel que soit le système que vous utilisez, il peut être craqué.

Ne pas punir les clients honnêtes avec un système destiné à empêcher les pirates, les pirates vont craquer, peu importe.

Un simple hased code lié à leur e-mail ou similaire est probablement assez bon. Le matériel en fonction des Id de toujours devenir un problème lorsque les gens ont besoin de réinstaller ou de mettre à jour hadrware.

Bon thread sur la question: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34

58voto

shoosh Points 34322

N’oubliez pas lors de la génération de la clé concaténer la version et construire le nombre à la chaîne sur que vous calculez le hachage. De cette façon il n’y aura une seule clé qui ouvre toutes les tout vous jamais sorti.

Après vous trouverez quelques clés ou correctifs flottant sur Astalavista , vous saurez que vous avez réussi à faire quelque chose de populaire assez que quelqu'un pris la peine de craquer. Réjouissez-vous !

50voto

Henk Holterman Points 153608

Si vous voulez obtenir un peu plus sophistiqué, vous pouvez utiliser un système asymétrique de la clé de chiffrement (RSA). C'est ce qui est utilisé pour le public-clés jeton (signature).NET assemblées.

  1. Générer votre propre paire de clés (sn.exe)
  2. Faire un Hash forme de nom d'utilisateur, etc
  3. Coder la valeur de Hachage avec votre clé privée
  4. Navire de la clé publique de votre au programme, pas besoin de le cacher.
  5. D'exécution, de décoder la valeur de Hachage avec la la clé publique et de la comparer avec une générés localement version

Ce ne sera pas faire quelque chose si quelqu'un pouvez modifier votre programme, mais il sera très difficile de générer des touches qui fonctionnent avec inchangée binaires.

Un inconvénient est que, même avec la plus petite clé RSA, vous aurez une assez longue code de navire (384 bits), ne convient pas pour les par téléphone ou même en tapant dans.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X