web-dev-qa-db-fra.com

Comment créer une licence pour mon logiciel Java?

J'ai un très gros problème. C'est "Comment créer une licence pour mon logiciel".

OK, pensez que c'est ma clé de licence - 12345YW

lorsque l'utilisateur entre cette clé de licence, le logiciel doit lui permettre d'utiliser le logiciel. D'accord, une fois que l'utilisateur a entré la clé de licence, mon logiciel doit se rappeler qu'il a entré la clé valide, n'est-ce pas? logiciel pour se souvenir que l'utilisateur avait entré la licence? Dans les applications basées sur Windows, la plupart d'entre elles saisissent une entrée dans le registre Windows. Puis-je faire de même? (Alors qu'en est-il d'Ubuntu et de Mac?)

J'ai pensé à écrire un fichier .txt pour que le logiciel m puisse le lire et savoir si la licence est entrée ou non. Cependant, c'est le système le plus sécurisé auquel je puisse penser.

Donc, si j'entre la clé de licence ci-dessus, comment puis-je faire en sorte que mon logiciel s'en souvienne? Je suis vraiment content si vous pouvez aussi me donner un exemple de code (c'est-à-dire: je ne sais pas comment modifier le registre, en cas de registre Windows, etc.). Aidez-moi, s'il vous plaît...

21
Lemon Juice

Le logiciel de licence n'est pas encore un problème résolu - ou du moins, le faire en toute sécurité, sans gêner vos utilisateurs, et sans investir dans une infrastructure majeure n'est pas résolu.

L'emplacement/le mécanisme par lequel vous stockez l'état de la licence est généralement hors de propos - le registre n'est pas plus sécurisé qu'un fichier texte - il faut quelques secondes pour accéder au contenu, et "masquer" l'entrée dans un remous distant du registre ne fait pas fais pas grand chose pour aider.

Vraisemblablement, votre logiciel a une sorte de persistance (base de données? Système de fichiers?); vous pouvez utiliser ce même mécanisme de persistance pour stocker l'état d'enregistrement.

Bien sûr, tout ce que votre logiciel peut lire/écrire est accessible aux personnes qui tentent d'obtenir un accès non autorisé à votre logiciel. Ainsi, vous pouvez crypter l'enregistrement; alors vous avez le problème de gérer la clé de ce mécanisme de chiffrement; afaik, il n'y a pas de solution robuste à cela pour le moment.

Donc, vous pourriez avoir un "serveur de licences" sur Internet; votre logiciel peut lire un identifiant unique pour votre machine (adresse MAC par exemple), l'envoyer à votre serveur de licences et demander au serveur de renvoyer l'état de la licence. Encore une fois, c'est assez trivial à contourner, et maintenant vous exigez que vos utilisateurs soient en ligne pour utiliser votre logiciel.

Si votre logiciel est attrayant à distance pour les utilisateurs, les pirates briseront la protection de la clé de licence en quelques jours et publieront des instructions détaillées sur Internet. Apple allez à des longueurs extraordinaires pour protéger le logiciel sur l'Iphone/Ipad, et pourtant les applications de jailbreak les déverrouillent.

À mon avis, à moins que votre logiciel ne rapporte des dizaines de millions de dollars, vous devriez rendre la vie aussi facile que possible à vos utilisateurs, et ne pas trop vous soucier de l'aspect sécurité - utilisez quelque chose sur étagère (comme le recommande @bunting) ou choisissez un fichier texte.

Plus précisément, je voudrais:

  • vérifier la présence d'un fichier de licence valide au démarrage de l'application
  • si le fichier de licence n'est pas présent, demandez à l'utilisateur d'entrer une clé de licence
  • comparer cette clé avec votre clé de licence
  • écrire un fichier "valide" dans le système de fichiers, dans le répertoire de votre application; vous pouvez également modifier un fichier de configuration existant.

C'est trivialement facile à casser; afin que vous puissiez aller plus loin.

Tout d'abord, Java sont faciles à décompiler, et un attaquant pourrait facilement lire votre constante de "licence". Vous devriez utiliser un obfuscateur pour rendre cela difficile (mais pas impossible).

Deuxièmement, vous pouvez crypter vos données de licence locale; cela rendrait également plus difficile le pirate totalement décontracté. Vous pouvez inclure des données locales dans le schéma de cryptage afin qu'un pirate ne puisse pas simplement redistribuer votre application avec une clé de licence fonctionnelle (par exemple en multipliant la clé de licence par l'adresse MAC de la machine).

Dans les deux cas, vous "câblez" la licence dans l'application; il y a des babillards où les pirates postent des clés de licence pour les applications, et vous ne seriez pas en mesure de répondre autrement qu'en émettant une nouvelle version de l'application avec une nouvelle clé.

24
Neville Kuyt

Je suis surpris qu'une possibilité ait été négligée. Le moyen le plus simple de protéger les données d'un client non fiable est de ne jamais le laisser en avoir. Plusieurs architectures d'application le permettent: une application Web, un client de bureau RPC sur un serveur distant ou un client léger hautes performances se connectant à un bureau virtualisé sur un serveur distant. Les applications Web sont déjà populaires en raison de leurs avantages dans le domaine de l'installation, de la sauvegarde des données et de la maintenance.

Donc, plutôt que d'essayer d'obtenir un doctorat Comp Sci honoraire en créant un logiciel qui applique une politique de sécurité de l'entreprise à un client malveillant ...

(extrêmement improbable)

... vous placez simplement la propriété intellectuelle sur un serveur de confiance et le client n'a que l'interface utilisateur (et la logique non confidentielle). Cette stratégie a ses propres pièges. Son historique est bien meilleur que la protection contre la copie client.

Remarque: Un bonus est que vous obtenez un flux régulier de revenus pour "gérer" le logiciel pour vos clients.

7
Nick P