Comment les clés de licence logicielle sont-elles générées?

361

Les clés de licence sont la norme de facto comme mesure anti-piratage. Pour être honnête, cela me semble être (in) Security Through Obscurity , bien que je ne sache vraiment pas comment les clés de licence sont générées. Qu'est-ce qu'un bon exemple (sécurisé) de génération de clé de licence? Quelle primitive cryptographique (le cas échéant) utilise-t-elle? Est-ce un condensé de message? Si oui, quelles données hacheraient-ils? Quelles méthodes les développeurs utilisent-ils pour empêcher les crackers de construire leurs propres générateurs de clés? Comment sont fabriqués les générateurs clés?

tour
la source
8
+1 question intéressante, peut-être qu'un répondeur peut publier des liens vers de bonnes ressources sur ce sujet pour une lecture plus approfondie? s'il vous plaît :)
Jacob
44
Tous les schémas DRM sont essentiellement des schémas d'obscurité, car tout le code et les données nécessaires au fonctionnement du programme ont été fournis à l'utilisateur. Le schéma peut être rendu arbitrairement obscurci pour rendre le correctif difficile, mais il est certain que le code peut être corrigé pour éviter toute vérification.
caf
5
Les clés de CD sont en effet la sécurité grâce à l'obscurité. Il existe plusieurs façons de les créer, mais toutes reposent nécessairement sur l'incorporation d'un secret dans le programme qui est nécessaire pour vérifier la clé.
Nick Johnson
4
On les appelle maintenant clés de produit ou clés de licence , car la plupart des logiciels qui les utilisent sont plus susceptibles d'être livrés en ligne que sur CD.
Joel Coehoorn
4
J'aimerais faire une application un jour où je devrais m'inquiéter de ce rêve d'enfance en quelque sorte. Les applications Web ne suffisent pas.
Znarkus

Réponses:

268

Pour les clés de CD à l'ancienne, il s'agissait simplement de créer un algorithme pour lequel les clés de CD (qui pourraient être n'importe quelle chaîne) sont faciles à générer et à vérifier, mais le rapport entre les clés de CD valides et les CD invalides -keys est si petit qu'il est peu probable que deviner des clés de CD au hasard vous en obtienne une valide.

MANIÈRE INCORRECTE DE LE FAIRE:

Starcraft et Half-life ont tous deux utilisé la même somme de contrôle, où le 13e chiffre a vérifié les 12 premiers. Ainsi, vous pouvez entrer n'importe quoi pour les 12 premiers chiffres, et deviner le 13e (il n'y a que 10 possibilités), conduisant à l'infâme1234-56789-1234

L'algorithme de vérification est public et ressemble à ceci:

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

BONNE FAÇON DE LE FAIRE

Windows XP prend un certain nombre d'informations, les chiffre et met l'encodage des lettres / chiffres sur un autocollant. Cela a permis à MS de vérifier votre clé et d' obtenir en même temps le type de produit (résidentiel, professionnel, etc.). De plus, il nécessite une activation en ligne.
L'algorithme complet est assez complexe, mais bien décrit dans cet article (complètement légal!), Publié en Allemagne.

Bien sûr, peu importe ce que vous faites, à moins que vous n'offriez un service en ligne (comme World of Warcraft ), tout type de protection contre la copie n'est qu'un blocage: malheureusement, si c'est un jeu qui vaut la peine, quelqu'un va casser (ou du moins contourner) ) l'algorithme de clé CD et toutes les autres protections de copyright.

VRAIE FAÇON CORRECTE DE LE FAIRE:

Pour les services en ligne, la vie est un peu plus simple, car même avec le fichier binaire, vous devez vous authentifier auprès de leurs serveurs pour en faire usage (par exemple, avoir un compte WoW). L'algorithme de clé CD pour World of Warcraft - utilisé, par exemple, lors de l'achat de cartes de jeu - ressemble probablement à ceci:

  1. Générez un très grand nombre aléatoire cryptographiquement sécurisé.
  2. Conservez-le dans notre base de données et imprimez-le sur la carte.

    Ensuite, lorsque quelqu'un entre un numéro de carte de jeu, vérifiez s'il se trouve dans la base de données et s'il l'est, associez ce numéro à l'utilisateur actuel afin qu'il ne puisse plus jamais être utilisé.

Pour les services en ligne, il n'y a aucune raison de ne pas utiliser le schéma ci-dessus; utiliser autre chose peut entraîner des problèmes .

BlueRaja - Danny Pflughoeft
la source
47
Mathematica a un processus intéressant. Le produit est livré avec une clé unique et le fichier d'installation génère une deuxième clé unique (basée sur votre matériel). Ces deux clés doivent être saisies dans un formulaire en ligne avec votre nom et vos informations d'enregistrement, puis elles vous envoient la vraie clé basée sur ces deux clés qui déverrouille réellement le logiciel, mais uniquement pour cette clé de produit spécifique et sur votre matériel spécifique.
Dan
18
Hé, je n'ai jamais connu la 1234-56789-1234clé Starcraft, mais je me souviens qu'il n'a fallu que cinq minutes environ pour "forcer brutalement" le vérificateur en écrasant le clavier et en réessayant.
fmark
18
Je me souviens également de certains produits Microsoft dans le passé qui vous permettaient d'utiliser 111-1111111 comme clé de CD valide (Visual Studio 6.0)
hannson
25
Je n'ai jamais connu 1234-56789-1234. Au lieu de cela, nous en avons utilisé treize! 3333333333333
ErikTJ
33
Le problème de l'activation en ligne est que nous sommes tous foutus si / quand l'éditeur cesse ses activités. Veuillez ne pas faire ça. Cela se produit et peut / arrivera même à Microsoft un jour.
Brad
56

Lorsque j'ai écrit cette réponse à l'origine, c'était sous l'hypothèse que la question concernait la validation «hors ligne» des clés de licence. La plupart des autres réponses concernent la vérification en ligne, qui est beaucoup plus facile à gérer (la plupart de la logique peut être effectuée côté serveur).

Avec la vérification hors ligne, la chose la plus difficile est de garantir que vous pouvez générer un grand nombre de clés de licence uniques, tout en conservant un algorithme solide qui n'est pas facilement compromis (comme un simple chiffre de contrôle)

Je ne connais pas très bien les mathématiques, mais cela m'a frappé qu'une façon de le faire est d'utiliser une fonction mathématique qui trace un graphique

La ligne tracée peut avoir (si vous utilisez une fréquence suffisamment fine) des milliers de points uniques, vous pouvez donc générer des clés en choisissant des points aléatoires sur ce graphique et en encodant les valeurs d'une manière ou d'une autre

entrez la description de l'image ici

Par exemple, nous tracerons ce graphique, choisirons quatre points et encoderons dans une chaîne comme "0, -500; 100, -300; 200, -100; 100,600"

Nous allons crypter la chaîne avec une clé connue et fixe (horriblement faible, mais cela sert à quelque chose), puis convertir les octets résultants via Base32 pour générer la clé finale

L'application peut ensuite inverser ce processus (base32 en nombre réel, décrypter, décoder les points) puis vérifier que chacun de ces points se trouve sur notre graphe secret.

C'est une assez petite quantité de code qui permettrait de générer un grand nombre de clés uniques et valides

C'est cependant beaucoup la sécurité par l'obscurité. Quiconque prend le temps de démonter le code pourrait trouver la fonction graphique et les clés de chiffrement, puis simuler un générateur de clés, mais c'est probablement très utile pour ralentir le piratage occasionnel.

PaulG
la source
6
Non, Erik ne le ferait pas. X est un entier et Y est le plancher de la fonction.
Joshua
Ce n'est pas différent de l'ancien fonctionnement de la navigation par satellite pré-GPS! youtube.com/watch?v=BBOsQBuCJfs
Brad
34

Consultez cet article sur la vérification partielle des clés qui couvre les exigences suivantes:

  • Les clés de licence doivent être assez faciles à saisir.

  • Nous devons être en mesure de mettre sur liste noire (révoquer) une clé de licence en cas de rétrofacturation ou d'achats avec des cartes de crédit volées.

  • Pas de «phoning home» pour tester les clés. Bien que cette pratique soit de plus en plus répandue, je ne l'apprécie toujours pas en tant qu'utilisateur, donc je ne demanderai pas à mes utilisateurs de l'accepter.

  • Il ne devrait pas être possible pour un cracker de démonter notre application publiée et d'en produire un «keygen» fonctionnel. Cela signifie que notre application ne testera pas entièrement une clé pour vérification. Seule une partie de la clé doit être testée. De plus, chaque version de l'application doit tester une partie différente de la clé, de sorte qu'une clé bidon basée sur une version antérieure ne fonctionnera pas sur une version ultérieure de notre logiciel.

  • Important: il ne devrait pas être possible pour un utilisateur légitime de taper accidentellement une clé non valide qui semblera fonctionner mais échouera sur une future version en raison d'une erreur typographique.

Le Surrican
la source
21

Je n'ai aucune expérience de ce que les gens font réellement pour générer des clés de CD, mais (en supposant que vous ne voulez pas emprunter la voie de l'activation en ligne), voici quelques façons de créer une clé:

  • Exigez que le nombre soit divisible par (disons) 17. Pratique à deviner, si vous avez accès à de nombreuses clés, mais la majorité des chaînes potentielles ne seront pas valides. De même, il faudrait que la somme de contrôle de la clé corresponde à une valeur connue.

  • Exiger que la première moitié de la clé, lorsqu'elle est concaténée avec une valeur connue, hache jusqu'à la seconde moitié de la clé. Mieux, mais le programme contient toujours toutes les informations nécessaires pour générer des clés ainsi que pour les valider.

  • Générez des clés en chiffrant (avec une clé privée) une valeur connue + nonce. Cela peut être vérifié en déchiffrant à l'aide de la clé publique correspondante et en vérifiant la valeur connue. Le programme dispose désormais de suffisamment d'informations pour vérifier la clé sans pouvoir générer de clés.

Ceux-ci sont toujours ouverts aux attaques: le programme est toujours là et peut être corrigé pour contourner la vérification. Plus intelligent pourrait être de crypter une partie du programme en utilisant la valeur connue de ma troisième méthode, plutôt que de stocker la valeur dans le programme. De cette façon, vous devez trouver une copie de la clé avant de pouvoir décrypter le programme, mais il est toujours vulnérable à la copie une fois décryptée et à ce qu'une personne prenne sa copie légitime et l'utilise pour permettre à tous les autres d'accéder au logiciel.

Andrew Aylett
la source
9
Je souhaite vraiment que celui qui était venu avec le « numéro utilisé une fois » chose n'a pas choisi Nonce comme le nom, étant donné les ahem connotations négatives de qui me font rigoler chaque fois que quelqu'un suggère un cryptage.
Ed James
2
Notez que la troisième option ne fonctionne pas avec les cyphers à clé symétrique car l'attaquant pourrait simplement inverser l'ingénierie du test sur le texte brut, générer quelque chose qui réussit, puis le chiffrer avec la clé (connue) et le chiffrement (connu). L'utilisation d'un cryptage à domicile n'est pas une solution car si vous pouvez le faire vous-même, vous devriez obtenir un emploi à la NSA.
BCS
@BCS: Désolé, j'aurais dû être plus clair sur l'utilisation de la cryptographie à clé publique.
Andrew Aylett
Utilisez un schéma de signature, pas un schéma de chiffrement pour la version à clé publique. (La signature RSA ressemble un peu au "cryptage avec la clé publique", mais ce n'est pas totalement la même chose. Il existe d'autres schémas de signature qui n'ont pas de schéma de cryptage associé, comme DSA.)
Paŭlo Ebermann
Le problème avec la cryptographie à clé publique est que les clés (et donc les séries) doivent être longues. Une paire de clés RSA 512 bits n'est pas difficile à casser de nos jours. Comparez avec les clés de WinXP (5 groupes de 5 caractères alphanumériques) qui n'ont que 128 bits d'entropie mais toujours une difficulté à taper.
finnw
17

Les clés de CD ne sont pas vraiment une sécurité pour tout ce qui n'est pas en réseau, donc techniquement, elles n'ont pas besoin d'être générées en toute sécurité. Si vous êtes sur .net, vous pouvez presque utiliser Guid.NewGuid ().

De nos jours, leur utilisation principale est le composant multijoueur, où un serveur peut vérifier la clé CD. Pour cela, il est sans importance de savoir comment il a été généré en toute sécurité car il se résume à "Rechercher tout ce qui est transmis et vérifier si quelqu'un d'autre l'utilise déjà".

Cela étant dit, vous voudrez peut-être utiliser un algorhithme pour atteindre deux objectifs:

  • Ayez une somme de contrôle quelconque. Cela permet à votre installateur d'afficher le message "La clé ne semble pas valide", uniquement pour détecter les fautes de frappe (l'ajout d'une telle vérification dans l'installateur signifie en fait que l'écriture d'un générateur de clé est triviale car le pirate dispose de tout le code dont il a besoin. vérifier et s'appuyer uniquement sur la validation côté serveur désactive cette vérification, au risque de déranger vos clients légaux qui ne comprennent pas pourquoi le serveur n'accepte pas leur clé de CD car ils ne connaissent pas la faute de frappe)
  • Travaillez avec un sous-ensemble limité de personnages. Essayer de taper une clé de CD et deviner "Est-ce un 8 ou un B? Un 1 ou un I? Un Q ou un O ou un 0?" - en utilisant un sous-ensemble de caractères / chiffres non ambigus, vous éliminez cette confusion.

Cela étant dit, vous voulez toujours une grande distribution et un peu d'aléatoire pour éviter qu'un pirate ne devine simplement une clé valide (qui est valide dans votre base de données mais toujours dans une boîte sur une étagère de magasin) et visser un client légitime qui arrive à acheter cette boîte .

Michael Stum
la source
facilement résolu par un bon service client - Box shot + Preuve d'achat = Verrouiller l'utilisateur illégal, donner un accès au deuxième utilisateur.
alexanderpas
1
voici quelques réflexions supplémentaires sur les clés de CD codinghorror.com/blog/2007/12/software-registration-keys.html
Richard Chambers
10

Si vous n'êtes pas particulièrement préoccupé par la longueur de la clé, une méthode assez éprouvée est l'utilisation du cryptage des clés publiques et privées.

Ont essentiellement une sorte de nonce et une signature fixe.

Par exemple: 0001-123456789

Où 0001 est votre nonce et 123456789 est votre signature fixe.

Ensuite, chiffrez-le à l'aide de votre clé privée pour obtenir votre clé CD qui ressemble à: ABCDEF9876543210

Ensuite, distribuez la clé publique avec votre application. La clé publique peut être utilisée pour déchiffrer la clé de CD "ABCDEF9876543210", dont vous vérifiez ensuite la partie de signature fixe de.

Cela empêche alors quelqu'un de deviner quelle est la clé CD pour le nonce 0002 car il n'a pas la clé privée.

Le seul inconvénient majeur est que vos clés de CD seront assez longues lors de l'utilisation de clés privées / publiques de 1024 bits. Vous devez également choisir un nonce assez long pour ne pas crypter une quantité triviale d'informations.

Le côté positif est que cette méthode fonctionnera sans "activation" et vous pouvez utiliser des choses comme une adresse e-mail ou le nom du titulaire de licence comme nonce.

userx
la source
1
Veuillez noter que mon exemple sous-estime fortement la longueur de votre clé. Ces schémas nécessitent généralement un encodage base64 et un déploiement copier / coller, mais permettent des clés presque impossibles à deviner qui ne sont pas liées à une machine et ne nécessitent pas d'activation (deux choses très importantes pour de nombreux types de clients)
userx
3
Au lieu d'utiliser RSA, vous pouvez utiliser des courbes elliptiques. Ils utilisent des clés plus courtes et leur longueur de bloc est plus petite. En lisant le Wiki, il semble qu'un ECC 256 bits soit aussi sécurisé que AES 128.
xanatos
Veuillez noter que les signatures numériques et le "cryptage par clé privée" ne sont pas la même chose. Dans RSA, ils se ressemblent (bien qu'ils ne le soient pas, en raison de différents schémas de remplissage), d'autres schémas de signature n'ont même pas de schéma de cryptage correspondant.
Paŭlo Ebermann
@xanatos, 256 bits est encore trop long pour être tapé à la main. Considérez les clés de 25 caractères utilisées par WinXP - elles n'ont que 128 bits d'entropie.
finnw
1
@Mark - Une signature n'est généralement qu'un hachage chiffré. Vous pouvez utiliser le cryptage ou la signature, ma méthode fonctionne de la même manière. Vous essayez simplement de créer une clé de licence qui ne peut pas être facilement générée sans la clé privée et qui peut être vérifiée par la clé publique. Il peut s'agir de l'intégralité du message crypté (et vous vérifiez qu'une partie de son contenu correspond à quelque chose de magique) ou simplement d'un message signé (et vous vérifiez que la signature est valide). Cela dépend de votre implémentation.
userx
9

Le système de clés doit avoir plusieurs propriétés:

  • très peu de clés doivent être valides
  • les clés valides ne doivent pas être dérivables même compte tenu de tout ce que possède l'utilisateur.
  • une clé valide sur un système n'est pas une clé valide sur un autre.
  • autres

Une solution qui devrait vous les fournir serait d'utiliser un schéma de signature à clé publique . Commencez avec un "hachage système" (par exemple, récupérez les macs sur n'importe quelle carte réseau, triés et les informations sur l'ID du processeur, ainsi que d'autres éléments, concaténez le tout ensemble et prenez un MD5 du résultat (vous ne voulez vraiment pas être gérer les informations personnellement identifiables si vous n'êtes pas obligé)) d'ajouter le numéro de série du CD et de refuser de démarrer à moins qu'une clé de registre (ou un fichier de données) ait une signature valide pour le blob. L'utilisateur active le programme en vous expédiant le blob et vous renvoyez la signature.

Les problèmes potentiels incluent que vous proposez de signer pratiquement n'importe quoi, vous devez donc supposer que quelqu'un exécutera un texte brut et / ou des attaques de texte chiffré choisis . Cela peut être atténué en vérifiant le numéro de série fourni et en refusant de traiter les demandes de personnes invalides ainsi qu'en refusant de traiter plus d'un nombre donné de requêtes à partir d'un s / n donné dans un intervalle (disons 2 par an)

Je dois souligner quelques points: premièrement, un attaquant qualifié et déterminé sera en mesure de contourner toutes les sécurités dans les parties auxquelles il a un accès illimité ( c'est- à- dire tout ce qui se trouve sur le CD), le mieux que vous puissiez faire pour ce compte est il est plus difficile d'obtenir un accès illégitime que d'obtenir un accès légitime. Deuxièmement, je ne suis pas un expert, il pourrait donc y avoir de graves lacunes dans ce projet.

BCS
la source
1

Il existe également des comportements DRM qui intègrent plusieurs étapes au processus. L'un des exemples les plus connus est l'une des méthodes d'Adobe pour vérifier une installation de leur Creative Suite. La méthode traditionnelle de clé CD discutée ici est utilisée, puis la ligne d'assistance d'Adobe est appelée. La clé CD est remise au représentant Adobe et celui-ci donne un numéro d'activation à utiliser par l'utilisateur.

Cependant, en dépit d'être divisé en étapes, cela tombe en proie aux mêmes méthodes de fissuration utilisées pour le processus normal. Le processus utilisé pour créer une clé d'activation vérifiée par rapport à la clé CD d'origine a été rapidement découvert et des générateurs incorporant les deux clés ont été créés.

Cependant, cette méthode existe toujours comme moyen pour les utilisateurs sans connexion Internet de vérifier le produit. À l'avenir, il est facile de voir comment ces méthodes seraient éliminées à mesure que l'accès à Internet deviendrait omniprésent.

Sean
la source
1

Tous les algorithmes de protection contre la copie sur CD ne gênent pas les utilisateurs honnêtes tout en n'offrant aucune protection contre le piratage.

Le "pirate" n'a besoin que d'avoir accès à un cd légitime et à son code d'accès, il peut alors faire n copies et les distribuer.

Peu importe la sécurité cryptographique du code, vous devez le fournir avec le CD en texte brut ou un utilisateur légitime ne peut pas activer le logiciel.

La plupart des systèmes sécurisés impliquent que l'utilisateur fournisse au fournisseur du logiciel certains détails de la machine qui exécutera le logiciel (numéros de série du processeur, adresses mac, adresse Ip, etc.), ou, nécessite un accès en ligne pour enregistrer le logiciel sur le site Web du fournisseur et en retour, recevez un jeton d'activation. La première option nécessite beaucoup d'administration manuelle et ne vaut que pour les logiciels de très grande valeur, la deuxième option peut être usurpée et est absolument exaspérante si vous avez un accès réseau limité ou si vous êtes coincé derrière un pare-feu.

Dans l'ensemble, il est beaucoup plus facile d'établir une relation de confiance avec vos clients!

James Anderson
la source
0

Vous pouvez utiliser et implémenter l'API Secure Licensing à partir de ( https://www.nuget.org/packages/SystemSoulLicense/ ) très facilement dans vos projets logiciels en l'utilisant (vous devez télécharger l'application de bureau pour créer une licence sécurisée à partir de https: / /www.systemsoulsoftwares.com/ ) 1. Crée un UID unique pour le logiciel client basé sur le matériel système (CPU, carte mère, disque dur) (l'UID agit comme clé privée pour ce système unique) 2. Permet d'envoyer très facilement la chaîne de licence cryptée au système client, Il vérifie la chaîne de licence et ne fonctionne que sur ce système particulier 3. Cette méthode permet aux développeurs de logiciels ou à l'entreprise de stocker plus d'informations sur les logiciels / développeurs / services de distribution / fonctionnalités / client 4. Elle permet de contrôler le verrouillage et le déverrouillage des fonctionnalités du logiciel client, ce qui fait gagner du temps aux développeurs pour faire plus de version pour le même logiciel avec des fonctionnalités changeantes 5. Il faut aussi se soucier de la version d'essai pendant un certain nombre de jours 6. Il sécurise la chronologie de la licence en vérifiant DateTime en ligne lors de l'enregistrement 7. Il déverrouille toutes les informations matérielles pour les développeurs 8.Il a toutes les fonctions de pré-construction et personnalisées auxquelles le développeur peut accéder à chaque processus de licence pour créer un code sécurisé plus complexe

Prashant Manjule
la source