Génération et affichage d'une clé d'activation en fonction de la date du jour.

KarLTkT Messages postés 8 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 8 février 2010 - 5 févr. 2010 à 12:24
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 - 11 févr. 2010 à 09:41
Bonjour,

Je cherche le moyen de générer des clés d'activation en fonction de la date du jour, après validation d'un formulaire.
Concrètement, l'utilisateur installe un programme Visual Basic, qui lui demande une clé pour être activé. L'utilisateur rempli donc un formulaire html sur un page web, puis la validation du formulaire lui donne une clé après une opération simple sur la date du jour. L'utilisateur entre donc le code créé dans le programme qui connait également la même formule opérée pour la date, pour vérifier le code et activer son application.

La partie "application" est déjà faite et fonctionnelle, c'est plutot le moyen de générer des clés en fonction de la date que je ne connais pas. (je ne cherche pas à contrôler l'identification d'un utilisateur, comme je l'ai souvent trouvé dans le forum, mais uniquement à afficher un code en fonction de la date).

On peut donc imaginer un formulaire html, qui mène ensuite vers une page en php qui génère le code automatiquement. Je ne veux biensûr pas stocker les clés, puisqu'elles sont créés en fonction de la date.

J'espère que j'ai été assez clair,

Merci d'avance à qui voudra bien m'aider !

15 réponses

syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
5 févr. 2010 à 13:11
Un code MD5 sur la date en chaine ??
Ca ne te va pas ??
S.
0
KarLTkT Messages postés 8 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 8 février 2010
5 févr. 2010 à 13:18
Hem... désolé je dois sans doute être vraiment trop novice mais je ne comprends pas très bien ton post...
MD5 ?

En gros-le degré de protection m'importe peu-je veux pouvoir faire deux ou 3 opérations sur la date pour obtenir un truc du genre : XXX-XXX-XXX ou XXXX-XXXX-XXXX-XXXX.

Le problème c'est que je ne vois pas très bien comment coder cela... Et que je veux pouvoir avoir le même algorithme dans l'application pour vérification.

La page ainsi créee sera positionnée à la place de l'habituelle page de validation du formulaire. (La page "merci d'avoir rempli...") Pour obtenir : "merci d'avoir rempli ce formulaire, voici votre code d'activation... "
0
KarLTkT Messages postés 8 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 8 février 2010
5 févr. 2010 à 13:19
J'ai oublié de préciser : je ne suis pas le développeur de l'application, mais d'après lui insérer l'algorithme ne pose pas de problème tant qu'on se limite à quelques opérations sur la date.
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
5 févr. 2010 à 13:34
Alors je t'ai parlé de MD5, tu es sur le forum PHP. Donc là ou tu aurais pu aller te renseigner était le lien: http://fr.php.net/manual/en/function.md5.php
Et voila..
Pour découper la chaine de caractère je te laisse chercher des infos sur substr.
S.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KarLTkT Messages postés 8 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 8 février 2010
5 févr. 2010 à 13:49
Ok merci pour ces infos.

Si je comprends bien, la fonction MD5 permet de crypter des données, et substr d'identifier certaines valeurs dans ma date pour ensuite faire des opérations dessus.

Donc je vois l'intérêt de ces deux fonction pour créer mon opération sur ma date. Mais qu'est-ce qui me permet de récuperer la date du jour, et enfin d'afficher le code ?

En clair, quelle tête aurait mon code utilisant ces deux fonctions ?

Je le répète, j'arrive à me débrouiller en html par contre je suis novice en PHP.

Merci d'avance,

K.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
5 févr. 2010 à 18:18
Salut,

Mais qu'est-ce qui me permet de récuperer la date du jour, et enfin d'afficher le code ?

... peut être qu'en entrant simplement "date" sur le site que t'a gentiment indiqué Syndrael tu aurais une réponse.

Petit rappel au cas où :
Nous sommes ici pour aider, pas pour faire du code tout fait, surtout lorsque l'on sent qu'il n'y a pas un minimum d'efforts ("php date" sur google => 163 000 000 résultats)

En plus de MD5(), substr() et date() tu peux également jeter un oeil à wordwrap() pour générer les "-" de la clé.

Ta manière de générer cette clé me semble un peu bancale; d'une part ce n'est pas très sécurisé, et de l'autre il y a un risque de 'bug' pour l'utilisateur (cas d'une install à 23h59:59)

N'hésite pas à revenir poser tes interrogations, tu auras tout l'aide nécessaire, mais ne demande pas que l'on fasse le code ou les recherches à ta place.


Cordialement,

Kohntark -
0
KarLTkT Messages postés 8 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 8 février 2010
8 févr. 2010 à 11:50
Ok je vous remercie pour ces infos utiles.

Je tiens à clarifier ma demande : je ne demande biensur pas un code "clé en main", mais je souhaitais simplement avoir une idée de la forme à utiliser.

La question de la sécurité m'importe vraiment peu, et celle du bug devrait être assez rare pour que je n'y prête pas attention.

Est-il possible en PHP d'imbriquer les différentes fonctions ?
Du genre :


<?php
$date = date("d-m-Y");
$md5 = ...

Print("votre clé d'activation est : md5($date)");
?>

Je suis en train d'étudier les différentes fonctions dont j'ai besoin (date(), md5(), substr() et wordwrap(), mais je voudrais déjà savoir comment ensuite les utiliser directement dans ce que je dois afficher.

Dois-je à la place les identifier lors de leur définition ?
du genre : $date = md5(date("...")); et ainsi de suite ?

(ça peut paraître idiot de ma part, mais je n'ai aucune base en PHP.)

Merci d'avance pour ces quelques précisions.
Je mettrai biensur mon code obtenu en ligne si jamais il peut être utile à quelqu'un d'autre ensuite.
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
8 févr. 2010 à 13:34
Alors, je vais faire exprès de ne pas répondre à ta question, et vais même t'en poser une..
Pourquoi n'essaierais-tu pas d'imbriquer les fonctions ?
Au mieux ça marche.. youpi. Au pire, tu sais que ça ne marche pas.
S.
0
KarLTkT Messages postés 8 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 8 février 2010
8 févr. 2010 à 13:38
Hehe, j'avoue, là tu marques un point.

Je vais donc "me lancer", et tester tout ça, et vous tiens informés de la suite.

Merci encore.
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
8 févr. 2010 à 15:01
C'est cool.. et ce soir tu te coucheras moins bête. Ca permet toujours de mieux s'endormir quand on apprend un truc dans la journée.. Y'a que moi qui suis capable de me relever pour tester la chose de façon plus approfondie.. ou biscornue.. LOL !!
S.
0
KarLTkT Messages postés 8 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 8 février 2010
8 févr. 2010 à 15:10
Hehe, merci à tous, et surtout à toi Syndrael pour ton soutien,

ça m'a permis de trouver la formule que je veux utiliser, d'apprendre à manier la base du PHP, et surtout de simplifier grandement mon code (au détriment complet de la sécurité : JE SAIS ! lol)

Voici donc mon code : (sans fonctions, sans fioritures, beaucoup plus simple à implémenter dans le code de mon application).

<?php
$date = date("d-m-Y");
$premier = date("d");
$premier2 = (($premier *22)/8)+743;
$premier3 = ceil($premier2);

$deuxieme = date("m");
$deuxieme2 = (($deuxieme *15)/33)+153;
$deuxieme3 = ceil($deuxieme2);

$troisieme = date("Y");
$troisieme2 = (($troisieme *150)/125)+73;
$troisieme3 = ceil($troisieme2);


Print("votre cle d'activation est : $premier3-$deuxieme3-$troisieme3");
?>



Et voilà ! C'est tout simple le PHP ! Enfin quand on prend la peine de s'y mettre 5min ! Merci encore de m'avoir "forcé" à le faire :)

K.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
8 févr. 2010 à 17:43
En voilà une bonne chose, comme quoi quant on veut , ...

Tout en gardant la même façon de faire tu pourrai simplifier :

<?php
$key = ceil((date("d") *22)/8)+743;
$key.= '-'.ceil(((date("m") *15)/33)+153);
$key.= '-'.ceil(((date("Y") *150)/125)+73);

echo 'votre cle d\'activation est : '.$key;
?>


Pour donner une réponse sur ce que tu comptais faire initialement :
<?php
$key = wordwrap(md5(date('Ymd')), 5, "-", true);

echo 'votre cle d\'activation est : '.$key;
?>



Bonne continuation,

Kohntark -
0
roymatthieu Messages postés 112 Date d'inscription jeudi 31 août 2006 Statut Membre Dernière intervention 3 février 2011 1
11 févr. 2010 à 00:16
Salut ne pas faire perdre du temps à certaines personnes qui veulent aider et qui renvoie vers des ébauches de solutions (ce que je comprends, ce que je pousse à faire).

Dans ce cas ci notre ami n'est pas développeur il ne cherchera donc pas et risque de faire un code de merde ce que je n'approuve pas non plus....

Donc, je vais faire gagner du temps à tout le monde...

Alors, il ne vaut mieux pas utiliser md5() car c'est du 128 bits alors qu'sha1(); fait mieux (192 bits) et qu'a ma connaissance il n'a pas encore été cassé ce qui est le cas d'md5()

La seule différence c'est qu'sha1() génère des chaines de 40 caractères alors qu'md5() n'en génère que 32 (il me semble).

Ensuite utiliser date() n'est pas une bonne idée étant donné que deux hash (c'est comme cela que s'appelle la chaine de cartère générée par md5() et sha1()) obtenu avec la même valeur de départ son identique.

Donc avec date() il ne peut y avoir qu'une seule clé d'activation généré par jour... ce qui n'est pas unique et risque de perturber notre ami en créant des doublons.

Nous allons donc utiliser la fonction time() qui elle renvoie le nombre de seconde écoulé depuis le 01/01/1970.

Ce qui est déjà plus précis car il faut que deux hash soient généré à la même seconde pour être identique...

donc :


function generateKey(){

     return sha1(time());
}

$key = generateKey();

... Mémorisation de la clé...



Rien ne sert de découper la chaine sinon, elle risque de ne plus être unique...

Tu stockes le contenu de la variable $key ou tu le souhaite de façon à le récupérer plus tard et à comparer la clé d'activation fournie avec la clé mémorisée.

via la fonction suivante.


function compareKey($key_memory, $key_receive){

     if($key_memory == $key_receive)

          return true;

     return false;
}

$key_receive = la valeur que tu reçois de je ne sais pas ou, cela dépend de ce que tu veux faire et donc d'où elle provient...

$key_memory  = la clé mémorisée lors de la création que tu as conservée là ou tu veux (du moment que c'est facilement récupérable)...

if(compareKey($key_memory, $key_receive))

      echo 'Clé identique';
else

     echo 'Clé différente';



J'espère avoir fait gagner du temps à tout le monde ... sauf moi..
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
11 févr. 2010 à 08:38
Salut Roymatthieu,

La question de la sécurité et des bugs potentiels a déjà été soulevée.
KarLTkT a confirmé ce qu'il énonçait au début :
- pas de stockage de la clé côté serveur
- "La question de la sécurité m'importe vraiment peu"
- "elle du bug devrait être assez rare pour que je n'y prête pas attention. "

A partir de là on ne peut pas forcer quelqu'un à "bien faire", surtout que la mise en place d'une telle gestion est complexe pour un néophyte (et puis il y a l'implémentation VB)

Alors, il ne vaut mieux pas utiliser md5() car c'est du 128 bits alors qu'sha1(); fait mieux (192 bits) et qu'a ma connaissance il n'a pas encore été cassé ce qui est le cas d'md5()

Je pense qu'il faut arrêter de croire qu'md5 n'est pas sécurisé. Dans 90% des cas il convient amplement.
Même une attaque par dictionnaire d'un hash d'une chaîne complexe peut demander un temps énorme ... en y ajoutant un "salt" c'est mission impossible.

Rien ne sert de découper la chaine sinon, elle risque de ne plus être unique...

Pas compris.
Le découpage n'est là que pour faciliter la lecture, il ne remet pas en cause le hash.

J'ai du mal à voir comment tu pourrais implémenter ton ébauche de solution dans ce contexte. Par ailleurs tu risques également d'avoir des doublons au niveau des clés (parce que 1 seconde c'est court, ... mais c'est long)

... je doute que tu ais fait gagner du temps ^^


Cordialement,

Kohntark -
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
11 févr. 2010 à 09:41
Le mieux l'ennemi du bien est..

Yoda.
0
Rejoignez-nous