Protection d'application, un système de licence simple
Publié le 12/11/2008 Dans Programmation
Théorie
Le principe théorique est simple et très connu. Il s'agit du principe de la signature numérique, basée sur la cryptographie à clé publique, clé privée.
Petit rappel:

Soit une fonction de hashage HASH(x) = x' tel qui n'existe pas de fonction IHASH tel que

IHASH(x') = x,


Soit

-un algorithme cryptographique à clé privée, clé publique ENC,
-une clé publique Ppub
-une clé privée Ppriv

Tel que

Il n'existe pas de fonction F tel que F(Ppub) = Ppriv
et ENC(Ppriv, x) = x'
et ENC(Ppub, x') = x

La signature numérique sig d'un message msg s'exprime sous la forme:

ENC(Ppriv, HASH(msg)) = sig


En français, cela donne que la signature numérique d'un message est le résultat de l'encryptage du résultat d'une fonction de hashage par un algorithme à clé publique clé publique/clé privée au moyen de la clé privée.

Il est dès lors évident que la vérification de ce type de signature est aisé, il suffit de vérifier que:

ENC(Ppub, sig) = HASH(msg)


Notre système va utiliser ces principes pour signer un fichier de licence qui contient du texte décrivant les droits octroyés par la licence. Par exemple, on peut imaginer un fichier de licence contenant:

ExpirationDate: 31/08/2010
LicenceOwner: Joe Bar
Fonctions: FUNC1, FUNC2, FUNC3


Comme vous pouvez le constater, il s'agit de simple lignes de texte contenant un ensemble de clés/valeurs.

Evidemment, nous ne pouvons utiliser ce fichier comme licence car il suffirait de le modifier pour obtenir d'autres fonctionnalités ou supprimer la date d'expiration.

Pour empêcher la modification de ce fichier, nous allons le signer au moyen d'une clé privée que nous aurons préalablement générée et que nous garderons secrète. Ensuite, nous ajouterons à la fin du fichier de licence final une ligne contenant la signature du fichier.

Example:


ExpirationDate: 31/08/2010
LicenceOwner: Joe Bar
Fonctions: FUNC1, FUNC2, FUNC3
Sig: DnQSMdzq1d89o0gYgoSZXBHr167sCvMjzV1p8w4hJriU7VdrLTaGtc
faF4DVuExWCfq5wHY/NP8J6gj3TK+OMPviyPQH4nR4mBFkiNfiklKWgfuzZQQLf+ayB2nDzD67NwFLzAL4hpJ/5bi5IooKTQCciJ0OE+eAfLrIRaWsSmk=


La valeur de la clé Sig est simplement la valeur en Base64 de la signature numérique du fichier original au moyen des algorithmes Sha-512 (hashage) et RSA (encryptage).
Donc, pour vérifier que notre fichier de licence est correct et n'a pas été modifié, il suffit de lire la valeur de la clé Sig dans le fichier de licence et de vérifier que cette signature correspond bien au contenu du fichier original (çad toutes les données avant la clé Sig). Et ceci au moyen de la clé publique liée à notre clé privée.
Commentaires
Editer  Citer
Protection d'application, un système de licence simple
Si je peux me permettre quelques remarques...

La clé privée ne doit se trouver que dans le programme qui crée la license. Le programme qui la vérifie ne doit contenir que la clé publique (sinon il n'y a aucun intérêt à utiliser la crypto à clé publique).

Le link statique avec openssl est très lourd: le programme license que tu donnes fait chez moi 854kB à lui tout seul (strippé), et une version qui ne fait que la vérification ajoute 660kB au programme que tu veux protéger. Il existe des librairies crypto beaucoup plus légères qui seraient plus adaptées au link statique (matrixssl, libtomcrypt, ...)

Les exe protect dont tu parles, tu en as sous linux ? Parce que les clés en format ASCII armor comme tu les fais sont excessivement faciles à trouver et à remplacer dans un exécutable ELF... Il faut donc effectivement protéger l'exécutable contre toute modification.

Sinon, joli tuto :wink: J'embrayerais bien sur une version light...
Par philfr, Publié le 13/11/2008 @ 14:30:08
Editer  Citer
Protection d'application, un système de licence simple
Si je peux me permettre quelques remarques...

La clé privée ne doit se trouver que dans le programme qui crée la license. Le programme qui la vérifie ne doit contenir que la clé publique (sinon il n'y a aucun intérêt à utiliser la crypto à clé publique).

Le link statique avec openssl est très lourd: le programme license que tu donnes fait chez moi 854kB à lui tout seul (strippé), et une version qui ne fait que la vérification ajoute 660kB au programme que tu veux protéger. Il existe des librairies crypto beaucoup plus légères qui seraient plus adaptées au link statique (matrixssl, libtomcrypt, ...)

Les exe protect dont tu parles, tu en as sous linux ? Parce que les clés en format ASCII armor comme tu les fais sont excessivement faciles à trouver et à remplacer dans un exécutable ELF... Il faut donc effectivement protéger l'exécutable contre toute modification.

Sinon, joli tuto :wink: J'embrayerais bien sur une version light...


Pour la clé privée, je l'ai noté dans le tuto :wink:

C'est vrai que le link static est très lourd, mais je ne connaissais pas vraiment d'autres lib. Je vais regarder du coté des libs que tu as renseigné tiens.

Pour ce qui est de la protection des exécutables ELF, ça existe, j'en suis sûr. Je n'ai pas de nom en tête la mais un bête UPX (un peu bidouillé) pourrait faire l'affaire.

Mais si je te dis que je lis pour le moment les specs ELF ... tu comprendras quel pourrait être le contenu du prochain article :wink:
Par rfr, Publié le 13/11/2008 @ 17:46:42

Poster un commentaire
Vous devez être identifié pour accéder à cette fonctionnalité

Utilisateur
Mot de passe
 
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?