web-dev-qa-db-fra.com

Vous recherchez un algorithme de clé de licence

Il y a beaucoup de questions relatives aux clés de licence posées sur Stack Overflow. Mais ils ne répondent pas à cette question.

Quelqu'un peut-il fournir un algorithme simple de clé de licence indépendant de la technologie et ne nécessitant pas de diplôme en mathématiques pour comprendre?

L'algorithme de clé de licence est similaire au cryptage à clé publique. J'ai juste besoin de quelque chose de simple qui puisse être implémenté dans n'importe quelle plate-forme .NET/Java et qui utilise des données simples comme des caractères. 

Les réponses écrites sous forme de pseudo-code sont parfaites.

Ainsi, si une personne présente une chaîne, une chaîne complémentaire pouvant être générée est le code d'autorisation. Vous trouverez ci-dessous un scénario courant pour lequel il serait utilisé.

  1. Le client télécharge un logiciel qui génère une clé unique lors du démarrage/de l’installation initiale.
  2. Le logiciel s'exécute pendant la période d'essai.
  3. À la fin de la période d'essai, une clé d'autorisation est requise.
  4. Le client se rend sur le site Web désigné, entre son code et obtient un code d'autorisation pour activer le logiciel, après avoir payé :)

N'ayez pas peur de décrire votre réponse comme si vous parliez à un homme de 5 ans, car je ne suis pas mathématicien.

30
angryITguy

Il n'y a pas d'algorithme de licence fiable. Vraiment. Pas un seul. Pour les logiciels propriétaires les plus populaires et les plus coûteux que vous puissiez acheter, vous pouvez également trouver des "générateurs de clés" et des versions piratées ne nécessitant pas de licence.

Au lieu de vous soucier de le rendre "incassable", faites simplement quelque chose de simple. Un mécanisme populaire consiste à demander, lors de l'achat, le nom de l'utilisateur, puis à lui donner une clé de licence dérivée d'un hachage cryptographique (par exemple, somme MD5) du nom de l'utilisateur, ou d'une variante de celui-ci. Ensuite, dans le logiciel, vous demandez à nouveau son nom, ainsi que la clé d’enregistrement (cette chose dérivée de MD5); vous vérifiez qu'ils correspondent, ce qui active le logiciel.

Cela peut-il être piraté? Absolument. Une fois que quelqu'un a compris comment vous générez les clés de licence, ils peuvent générer les leurs. Mais si vous conservez une base de données des clés de licence "officielles" que vous avez générées jusqu'à présent, vous pourrez au moins identifier les fraudeurs ultérieurement (peut-être lorsqu'ils essaieront de télécharger du contenu "premium" ou autre).

Mais ne vous inquiétez pas trop pour empêcher les pirates de craquer votre code. Cela va arriver, mais ils représentent une part tellement infime du marché que cela n’affectera pas de manière significative vos ventes globales.

42
tylerl

J'utilise un système comme celui-ci:

• créer une chaîne à partir de la clé de licence Windows + date de fin de la période d’essai

• générer un hachage (Sha/md5) à partir de la chaîne

• convertir la date de fin de l’essai en entier (par exemple, nombre de jours)

• la clé devient la date de fin de l'essai + une partie du hachage

• convertir la clé en caractères majuscules uniquement pour faciliter la saisie

ABCD-DEFG-HIJK ...

la validation fonctionne comme

• convertir la clé en octets à nouveau

• extraire la date de fin de l'essai

• créer une chaîne à partir de la clé de licence Windows + date de fin de l’essai

• hash

• comparer le hachage avec le reste de la clé

cela le rend assez difficile pour mon public. 

6
adrianm

En toute honnêteté, ce que vous essayez de faire est inutile. Quelle que soit la durée nécessaire à l'écriture d'un système de validation/cryptage/clé, estimez à peu près la moitié de ce que vous pouvez faire pour le casser. Même si vous chiffrez le fichier exécutable final. Toutefois, comme mesure de retardement ou moyen de réduire les chances que les utilisateurs obtiennent une assistance plus performante pour les copies volées, cela aidera. Aussi pour le suivi simple des acheteurs. Ou pour le plaisir. : p

Quoi qu'il en soit, il y a plusieurs façons de le gérer. Beaucoup de logiciels utilisent des chaînes de nom (et éventuellement de société) et une fonction de hachage pour générer une clé. Cela a l'avantage d'être constant (tant que le nom est le même, le hachage est, et donc la clé est). C'est aussi un système très simple, surtout si vous utilisez un hash bien connu tel que MD5. 

hash = md5(name);

Certaines applications sophistiquées utilisent une fonction interne pour générer un code de validation, et lorsque vous combinez ce nom et son nom, vous pouvez créer (et renvoyer) un hachage.

validCode = getCode(name);
hash = myHash(name ^ validCode);

Quelques-uns utilisent un code basé sur le système (Windows est un bon exemple), dans lequel il échantillonne des éléments de matériel et en crée un identifiant. Si vous pouvez obtenir le nom ou la vitesse du processeur, ou autre chose, vous pouvez exécuter quelque chose comme ça. Le seul problème est que les modifications du système peuvent rendre un code invalide. Vous pouvez donc avertir vos utilisateurs (et donner une partie du processus) ou les laisser découvrir par inadvertance (inacceptable).

sysID = processor_name() | ram_Speed();
hash = md5(sysID & name);

Vous pouvez utiliser n'importe quelle combinaison de fonctions de hachage, d'extraction de données, d'entrées de chaîne, d'opérations booléennes, etc. Une chose à considérer est que vous n'avez pas besoin de pouvoir inverser le processus. Tant que vous pouvez le répliquer avec les mêmes résultats (toute bonne fonction de hachage peut), vous pouvez comparer les résultats hachés les uns aux autres et vous assurer de leur validité. Plus vous en investissez, plus ce sera compliqué, mais plus il sera difficile de craquer. 

Espérons que cela aide avec votre question.

3
ssube

La réponse est non, il n’existe pas d’algorithme de clé de licence sécurisée ne nécessitant pas de diplôme en mathématiques pour être compris.

Les meilleures clés de licence sont celles qui sont signées numériquement avec un algorithme de cryptage asymétrique. Vous signez les données de clé avec une clé de cryptage privée et intégrez la signature dans la clé. La validation de la clé (qui implique notamment la vérification de la signature) est effectuée avec une clé publique. De cette façon, personne ne peut créer de clé de licence à moins d'avoir accès à la clé privée qui est ... privée. Le problème est qu'il existe très peu d'algorithmes (et difficiles) qui ont des tailles de signature suffisamment courtes pour être incorporés dans une clé de produit. RSA n’est pas l’un d’entre eux (la taille de la signature pour RSA512 est de 1024 bits - trop). 

Vous pouvez vérifier le kit de développement logiciel SoftActivate Licensing. Il utilise la cryptographie à courbe elliptique pour générer de courtes clés de licence signées numériquement (le code source C++/C # est disponible).

3
Kevin Levrone

En matière de sécurité, ne pas utiliser un algorithme bien connu et testé et essayer de créer le vôtre (manque de connaissances mathématiques) est suicidal

Divulgation: Je manque complètement du diplôme en mathématique pour créer un tel algorithme, et pour être franc, je ne connais personnellement personne qui l'ait

2
Pablo Fernandez

Comme tout algorithme que vous allez créer va être brisé, je ferais quelque chose de simple, comme ceci:

const string secretMumboJumbo = "sdfkldafskjlfajmkldsfjaewumaskldfladkkldsfklj"

//For you to generate keys
string GenerateLicenceKey(int idNr)
{
    return Sha1Hmac(key=secretMumboJumbo, messageToEncode=idNr)
}

//For clients to check if key is valid, 
bool IsKeyValid(string key)
{
   for(int i=0;i<maxNrOfLicenceKeys;i++)
      if(key == GenerateLicenceKey(i))
         return true;
   return false;
}

Peut-être que la vérification pourrait devenir trop lente car il faut essayer toutes les clés possibles, mais cela pourrait aussi être une bonne chose pour éviter le forçage brutal.

La plupart des frameworks doivent avoir une fonction HMAC pour SHA1 ou une autre fonction de hachage. Dans le pire des cas, vous pourriez le remplacer par md5 (clé + identifiant)

Ne prenez pas cet algorithme trop au sérieux, c'est juste un exemple et il peut probablement être cassé très facilement car la clé de génération doit être incluse dans le client, même si elle est cachée quelque part dans le binaire.

1
bleo

Les clés de licence sont assez inutiles à mon avis.
Qu'est-ce qui empêche votre client de distribuer cette clé à d'autres? Bien sûr, vous pouvez configurer un serveur de clé de licence qui enregistre le nombre d'activations, mais cela coûte de l'argent et que se passera-t-il si le nombre de mises à jour diminue ou disparaît?

De mon point de vue professionnel, créer un logiciel qui porte la marque unique pour un utilisateur (crypté dans le programme bien sûr). Par exemple, si vous avez besoin d'aide -> sur le logiciel, affichez le nom de la personne, son téléphone et éventuellement son adresse. De cette façon, s'ils le téléchargent sur un site pirate, non seulement d'autres personnes connaîtront les informations personnelles de ce type ... mais vous le ferez également pour lui faire payer davantage de licences ou le poursuivre en justice.

0
Natalie Adams