IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Générer license application


Sujet :

Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut Générer license application
    Bonjour,

    Est-ce que quelqu'un sait comment faire pour que mon application java ne puisse être exécutée que sur une seule machine ? J'aimerais créer des licenses avec date d'expiration pour les utilisateurs de mon logiciel.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Une méthode simple, c'est de stocker toutes ces informations dans une chaine de caractère en clair (date d'expiration, utilisateur, nombre de licences, etc). Ton application vérifie ces données un peu partout dans ton code. Ensuite, il te faut une paire de clé publique/privées (cryptographie). Java supporte très bien la cryptographie, autant t'en servir. Tu utilise ta clé privée que tu ne distribue jamais pour encoder cette chaine de caractères (une chaine différente pas client donc). Tu obtiens ainsi un code binaire crypté, que tu transfère à tes clients. Ton application, elle, contient la clé publique, elle l'utilise pour décoder le fichier et obtenir ca chaine de données, qu'elle utilise partout dans son code.


    L'utilisation de clés publiques/privée garanti qu'un utilisateur ne pourra pas générer de fausse licence, elle n'empechera jamais de tripatouiller ton code pour faire sauter la protection.

    Edit: regarde peut etre aussi du coté de truelicence:

    https://truelicense.dev.java.net/

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Merci ça a l'air intéressant, je vais y jeter un coup d'oeil.

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Bonjour tchize, j'ai lu un peu partout sur le net divers articles sur la cryptographie, mais étant assez novice en la matière, pourriez-vous m'expliquer par où je dois commencer ? Avez-vous un bon tuto en ce qui concerne la génération de licenses pour mon application ?

    Merci d'avance.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    J'ai lu tous les liens que tu as postés et cela m'a permis de comprendre un peu mieux.
    Pour mon problème de génération de license, dois-je donc commencer par la génération d'une pair de clés privée/publique ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
        // Générer une paire de clef RSA
        public static KeyPair generateKeyPair() throws CryptoException
        {
            try
            {
                KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
                SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
                keyPairGen.initialize(2048, rand);
                KeyPair keyPair = keyPairGen.generateKeyPair();
     
                return keyPair;
            }
            catch (NoSuchAlgorithmException ex)
            {
                throw new CryptoException("Probleme lors de la création de la pair de clef : "+ex.getMessage());
            }
            catch (InvalidParameterException ex)
            {
                throw new CryptoException("Probleme lors de la création de la pair de clef : "+ex.getMessage());
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        // Crypter avec la clef publique
        public static byte[] cryptWithRSAPublicKey(byte[] plainText,RSAPublicKey clefPublique)
        {
            BigInteger msgEnBigInteger = new BigInteger(plainText);
            BigInteger msgCrypte = msgEnBigInteger.modPow(clefPublique.getPublicExponent(), clefPublique.getModulus());
            return msgCrypte.toByteArray();
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        // Décrypter avec la clef privé
        public static byte[] decryptWithRSAPrivateKey(byte[] cipherText,RSAPrivateKey clefPrivee)
        {
            BigInteger msgADecrypteEnBigInt = new BigInteger(cipherText);
            BigInteger msgDecrypteEnBigInt = msgADecrypteEnBigInt.modPow(clefPrivee.getPrivateExponent(), clefPrivee.getModulus());
            return msgDecrypteEnBigInt.toByteArray();
        }
    Et après ?
    Dois-je maintenant créer un certificat ? et un keystore pour stocker mes clés ? Je suis un peu confus

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si tu part sur les clés publiques / privées, tu va devoir faire ceci

    de ton coté (et en dehors du code de ton application)

    créer une paire clé publique / clé privée

    ces deux clés peuvent se résumer à deux byte[]

    stocker un de ces byte[] chez toi, ce sera la clé privée
    stocker l'autre byte[] dans ton application

    tu va devoir te faire ensuite un petit code qui utilise ton byte[] privé pour générer des fichiers de licences (donc chez toi)

    et tu va devoir du coté application décoder ces fichiers de licence en utilisant le byte[] de la clé pubique.

    Le keystore c'est un moyen simple de stocker la clé (publique par exemple). Trop simple dans ton cas. Si l'utilisateur veut faire ses propres ficheir de licence il aura qu'à "cracker" ton application en injectant simplement dans le key store sa propre clé publique, beaucoup d'efforts pour pas grand chose finalement. Par contre tu peux éventuellement l'utilisé coté privé pour protéger ta clé privée avec un mot de passe.

    Donc tu va devoir jouer au plus fin pour planquer la clé quelque part dans ton code et éparpiller un peu partout el code de vérification. Bref faire exactement le contraire de ce qu'on préconise en programmant habituellement . Les obfuscateurs pourront aussi, à la fin, t'aider à cacher un peu plus ton code ^^

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup pour tes explications très fructueuses.
    J'ai réussi à créer une clé privée et une clé publique.
    J'ai sauvé la clé privée dans un keystore.
    Pour tester, j'ai crypté un String que j'ai nommé "license" à l'aide de ma clé privée comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] licCrypt = cryptWithRSAPrivateKey("licence", privKey);
    Ca a l'air correct vu que j'ai un code bizarre comme résultat.

    Ensuite, je crée un fichier avec cette license cryptée à l'aide de la clé privée comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FileOutputStream fos = new FileOutputStream("License.lic");
    fos.write(licCrypt);
    fos.close();
    Ca va jusque là ?
    Si j'ai bien compris, je dois donner ce fichier au client, et le décoder dans mon application à l'aide de ma clé publique ?
    Je dois donc stocker dans mon appli le String "license" et la clé publique, et le résultat du décodage du fichier de license à l'aide de cette clé publique doit être égal à mon String "license", c'est bien ça ?

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    dans l'idée c'est ça oui, sauf qu'on se content pas du String "licence" d'habitude, on stocke quelque chose d'un peux plus évolué, genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Ceci est un fichier de licence
    Application: nom de l'application
    Version: versions de l'application pour laquelle c'est valable
    Expiration: éventuellement date de fin de licence
    Utilisateur: nom du client"
    Et dans ton code tu parse la string pour extraire ces information. A la moindre erreur tu présume que le fichier est corrompu ou invalide

    Ca permet d'individualiser les clés pour chaque client

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    En fait le String "license" c'était juste un exemple évidemment
    Sinon, comment générer une license propre à une machine ? Parce que je n'aimerais pas que l'application soit utilisée par quelqu'un d'autre qui l'aurait copiée avec la license. Quel serait le meilleur moyen pour limiter la license à une machine ?

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    là ca se complique Et je connais pas beaucoup d'outils commerciaux qui fassent ce genre de vérification

  12. #12
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    J'utilise System.getProperty("user.name") et je créé un fichier dans System.getProperty("user.home") avec le nom de l'appli.

    Ainsi le programme ne fonctionne que sur cette machine et une copie du programme avec ou sans cette signature ne fonctionne pas sur d'autre machine.

    C'est une protection suffisante contre la copie courante d'appli étant entendu que rien ne résiste au hackage.

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Salut tchize_,
    J'ai trouvé le moyen d'avoir le numéro de série du disque dur.
    En résumé, j'ai fait un petit utilitaire qui me permet de créer un fichier de license pour le client.
    Je complète des jTextField avec le num et le nom de l'entreprise du client, le nom et la version de mon application, la date de début et de fin de la license.
    Je concatène le tout avec le SN du HDD du client et j'obtiens un String que je chiffre avec la clé privée extraite de mon KeyStore.
    Le résultat de ce chiffrement est un code que je stocke dans un fichier "licence.lic" qui se trouvera dans le répertoire de l'application sur le pc du client.
    Jusque là tout va bien ???

    Comment faire après ?
    Comment stocker la clé publique dans l'application du client ?
    Dois-je créer un keystore chez le client avec uniquement la clé publique, puis mon application extraira cette clé de ce keystore afin de déchiffrer le contenu du fichier "license.lic" ???
    Dois-je donc alors stocker mon String concaténé "en clair" dans mon application pour la comparaison ?

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Salut william,

    Je connais un peu System.getProperty, mais pourrais-tu m'expliquer ton procédé un peu plus en détails ? Ca a l'air intéressant.

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Comment stocker la clé publique dans l'application du client ?
    L'imagination est reine dans ce domaine là, à toi de trouver un moyen tordu pour la stocket pas trop visiblement
    Dois-je créer un keystore chez le client avec uniquement la clé publique, puis mon application extraira cette clé de ce keystore afin de déchiffrer le contenu du fichier "license.lic" ???
    Tu peux, mais un keystore c'est facilement remplacable, t'aura fait tout ce boulot pour rien si il suffit à ton utilsiateur de fournir son propre store pour tout casser
    Dois-je donc alors stocker mon String concaténé "en clair" dans mon application pour la comparaison ?
    A priori, tu extrait les données et tu les compare (la date de validité est-elle dépassé, le numéro de série du disque correspond-il bien à celui de la machine actuelle, ....)

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Oui mais je dois aussi déchiffrer à l'aide de la clé publique le code contenu dans le fichier "license.lic", et comparer le résultat de ce déchiffrement qui doit être égal à mon String concaténé que j'ai créé, non ?
    C'était ça le but quand même ou je me trompe ?

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le but c'est d'avoir un fichier licence.lic crypté qui contient (décrypté)

    "user
    machine
    midsque dur
    blabla
    dates
    etc"
    (bref ce que tu veux), de le décrypter puis de prendre un à un ces champs et comparer leur valeur avec ce qu'il y a réellement sur la machine (date dépassée? disque dur correct?)

  18. #18
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Je vois, une sorte de fichier Properties (clé = valeur) que je crypte avec ma clé privée de mon côté, et que je décrypte avec la clé publique du côté client, et ensuite comparer toutes ces données, c'est bien ça ?

  19. #19
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Cela est relativement simple je concatene le nom du logiciel + le user.name
    je crypte cela me donne un code spécifique à l'application sur cet ordi particulier

    Pour l'enregistrement de la licence j'affiche le code crypté et je propose la saisie de la clé cryptée.

    Lors de la saisie je décrypte la clé et le code s'il sont égaux la licence est valide. j'enregistre le code dans un fichier dans le user.home avec comme nom de fichier le nom du logiciel.

    En exploitation si le fichier est présent et est valide alors l'application est débridée.

  20. #20
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par william44290 Voir le message
    Pour l'enregistrement de la licence j'affiche le code crypté et je propose la saisie de la clé cryptée.

    Que veux-tu dire par "la saisie de la clé cryptée" ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/09/2013, 10h35
  2. Réponses: 2
    Dernier message: 03/07/2009, 08h15
  3. Réponses: 3
    Dernier message: 04/05/2009, 14h56
  4. Réponses: 2
    Dernier message: 05/02/2008, 13h29
  5. [EDI] Editeur de haut niveau pour générer une application Web en PHP/MySQL
    Par Speezaker dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 14/12/2007, 18h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo