JeuWeb - Crée ton jeu par navigateur

Version complète : Algo pour passer des données sécurisées au navigateur et les récupérer
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Hello,

Je cherche un système simple pour envoyer des données à un formulaire et les récupérer lors de la submission du formulaire sans que l'utilisateur n'aie pu les modifier (ou du moins pas sans que je le calcule)

Pour le moment, voilà comment je fais :

J'ai un salt inconnu de l'utilisateur,

je sérialise les données à transmettre, et je calcule un hash de cette sérialisation associée au salt.

quand je récupère les données, je sépare mon hash des données et je vérifie que le hash des données et du salt correspond bien aux données.

Le tout est encodé en base64 pour être transmis sans corruption des données.

Mon problème est que base64 n'est pas un cryptage, bien sur l'utilisateur ne connait pas le salt mais je me demande s'il n'y a pas moyen pour lui de me retransmettre facilement des données modifiées. (edit: en fait ça me semble basique mais suffisant)

voici une implémentation, (non testée), si ce n'est pas assez sûr je prends tout ce que vous avez de simple (ruby, scala, python ou autre acceptés)

merci.


<?php

define('secret', 'hsdrnkjngunqsdg');

function encode($data) {
$serialized = serialize($data);
return base64_encode(md5($serialized.secret).$serialized);
}

function decode($data) {
$d = base64_decode($data);
$md5 = substr($d,0,32);
$serialized = substr($d, 32);
if ($md5 == md5($serialized.secret))
return unserialize($serialized);
else
throw new Exception('échec !');
}

edit: je cherche également quelque chose de plus élégant, les substr() ne me plaisent pas

Le second problème est que, comme je l'ai dit, base64 n'est pas un cryptage, n'importe qui peut décoder la chaine, virer les 32 premiers caractères et voir ce que j'ai transmis.
Avez vous une solution pour que l'utilisateur ne puisse pas lire ce que je fais passer dans le formulaire ? je préfère cette solution à un envoi d'id correspondant aux infos stockées côté serveur.
Dans la majorité des cas, un bon cryptage correspond à une longue chaine de caractère, si tes besoins sont peu important ( niveau sécurisation) http://fr.wikipedia.org/wiki/Cryptographie_symétrique sinon il y a http://fr.wikipedia.org/wiki/Cryptographie_asymétrique comme le RSA.
Voici un article que j'ai trouvé sur le RSA en php http://guillaume-affringue.developpez.co...age=5#LV-B à la différence que tu utiliseras la clef public pour chiffrer et ta clef priver pour déchiffrer.
Si tu souhaites aller plus loin : si l'utilisateur est connecté à ton application, de générer à la volé chaque clef.
merci pour les liens, c'est assez interessant.

La différence avec la cryptographie c'est que cette dernière sert à partager de l'information entre deux personnes. or moi je ne cherche à partager les données qu'avec moi même.

Donc je me demande s'il n'y a pas un truc plus simple à faire sur le principe du salt.

sinon je partirais sur ta première idée, en mélangeant les données avec une longue chaine.

Le RSA c'est sympa mais je pense que ça ne vaut pas le coup. En fait, les données que je cherche à cacher sont essentiellement le nom d'une classe et celle d'une méthode. Pas de quoi fouetter un chat si l'utilisateur les découvre.
Pour le salt (sel) pour le md5 ou sha c'est juste à ajouter une chaine avant ou après les données avant d'effectuer le hash.
Le seul intérêt du RSA c'est d'être certain(ou presque il y a plusieurs RSA http://fr.wikipedia.org/wiki/Nombre_RSA) que l'on ne pourra pas le modifier sans le savoir.

Citation :sinon je partirais sur ta première idée, en mélangeant les données avec une longue chaine.
Tu peux aussi utilisé des xor et autres décalages de bit, voir même utilisé un système de chiffrement différent pour chaque type de donnée Smile
Quel peut bien être l'intérêt d'envoyer des données à l'utilisateur pour les récupérer à l'identique ? Y a quelque chose qui m'a l'air boiteux derrière...
je lui envoie le nom du contrôleur qui va récupérer le formulaire , comme quand tu le transmets dans l'attribut action de la balise form

Et pourquoi tu fais ça ? :x
Si c'est comme l'action, on ne vérifie pas que le gars ne change pas l'action, si il la change ça ne marche plus et voilà.
Pareil pour ton cas.
Au pire tu fait un truc plus simple et con. Tu duplique les données tu en fait une somme unique en sha1 ou plus rude du 512 ou ce que tu veux.
Lorsque le form et soumis tu fait également une somme de ce que tu viens de recevoir et tu compare. Si c'est les même c'est ok. Si ce n'est pas bon il y a eu une modif X.
Tu peut sinon crypter ton action sur un hidden et tout récup en GET.
Et la aussi tu compare le nom de l'action crypter à la somme que tu as déjà.
Le hash c'est ce que je fais déjà !

Pourquoi je faisais ça ? Et bien certaines données sont renvoyés à un controlleur générique, notament celui qui sert /comet ou le websocket, et je voulais ensuite pouvoir indiquer une classe/méhode qui va traiter les résultats. ça, ça fonctionne déjà, je voulais aussi pouvoir le faire sans que l'utilisateur puisse lire ces infos, mais bon ça me paraît casse couille pour rien. après tout, tant que c'est signé il ne peut pas le modifier, ça me va.