JeuWeb - Crée ton jeu par navigateur
Algo pour passer des données sécurisées au navigateur et les récupérer - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Algo pour passer des données sécurisées au navigateur et les récupérer (/showthread.php?tid=5695)



Algo pour passer des données sécurisées au navigateur et les récupérer - niahoo - 17-09-2011

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.


RE: Algo pour passer des données sécurisées au navigateur et les récupérer - Hideaki - 17-09-2011

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.com/securite/chiffrement/?page=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.


RE: Algo pour passer des données sécurisées au navigateur et les récupérer - niahoo - 17-09-2011

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.



RE: Algo pour passer des données sécurisées au navigateur et les récupérer - Hideaki - 17-09-2011

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



RE: Algo pour passer des données sécurisées au navigateur et les récupérer - nicodd - 17-09-2011

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...


RE: Algo pour passer des données sécurisées au navigateur et les récupérer - niahoo - 18-09-2011

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




RE: Algo pour passer des données sécurisées au navigateur et les récupérer - srm - 15-06-2012

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.


RE: Algo pour passer des données sécurisées au navigateur et les récupérer - demenvil - 15-06-2012

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à.


RE: Algo pour passer des données sécurisées au navigateur et les récupérer - niahoo - 15-06-2012

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.