Sécurité Token d'Authentification

Fermé
Nox - 17 mai 2018 à 19:26
astuces72 Messages postés 7722 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 17 avril 2024 - 22 mai 2018 à 16:08
Bonjour à tous,

Je développe actuellement une application mobile avec le framework Ionic, et j'ai tout mon backoffice en PHP.
Je voudrais sécuriser la connexion des utilisateurs, et en cherchant pendant pas mal de temps sur le web, il semblerait que l'utilisation d'un token soit une solution de choix. Ne comprenant pas bien comment s'implémente une solution très utilisée comme JWT, j'ai décidé de tenter de me débrouiller, et j'en suis arrivé à une méthode, laquelle j'aimerais que vous commentiez, afin de savoir si c'est suffisamment sécurisé, ou à défaut, comment l'améliorer.

Pour ceux qui ne connaissent pas Ionic, les pages sont faites en HTML/CSS, et la partie "fonctionnelle" est en TypeScript, cette dernière permettant des requête HTTP POST vers un fichier PHP héberger sur serveur.

Page Connexion :
Lorsque l'utilisateur entre ses infos, une requête POST est faite vers PHP, qui en se connectant à la BDD, vérifie si l'utilisateur existe bien, et que son mot de passe est correct. A ce stade, les infos ne sont pas cryptées, c'est seulement le fichier PHP qui cryptera le mot de passe reçu en POST avec sha1(), pour vérifier la correspondance du mot de passe déjà crypté dans la BDD.
Si tout est ok, alors PHP récupère dans la BDD le reste des infos, et les stocke dans un objet, puis je stocke l'heure de connexion (fonction time()), et la fin de validité (time() + 3600), dans des variables $timeinit et $timeend.
Ensuite, je veux transformer tout ça en un token undéchiffrable pour un gens malintentionné.
J'exécute une fonction de ce style :


$obj = serialize($obj);
$obj = base64_encode($obj);
$time = $timeinit.'-'.$timeend;
$time = base64_encode($time);

$chaine1 = 'une chaîne de 17 caractères aléatoires';
$chaine2 = 'une chaîne de 12 caractères aléatoires';
$chaine3 = 'une chaîne de 8 caractères aléatoires';

$token = $chaine1.$obj.$chaine2.$time;
$token = base64_encode($token);
$token = $token.$chaine3;
$token = base64_encode($token);


Ensuite, ce token est envoyé en réponse à l'appli, dans le fichier TypeScript. On l'enregistre dans le storage du téléphone, puis on redirige vers la page home.

En arrivant sur la page home, et sur chacune des autres pages de l'appli, on renverra en POST le token stocké dans le téléphone pour qu'un fichier PHP du serveur le décrypte (connaissant la fonction du cryptage), et qu'en fonction des données décodées, ce fichier PHP exécute diverses requêtes avec la BDD, et autres fonctions, afin de retourner à l'appli des infos et du contenu en fonction de l'utilisateur identifié.

Que pensez-vous de cette méthode ? Est-ce sécurisé ? Devrais-je changer quelque chose ?

Enfin, pour la suite de l'utilisation de l'appli, si la validité du token est dépassée ($timeend < new time()), alors comment décider de ressigner le token ? Est-ce que je dois garder les infos, et rajouter du temps (ex. 3600s de plus), ou bien dois-je demander une reconnexion ? Si l'utilisateur a coché 'se souvenir de moi', son login et mot de passes sont stockés dans le téléphone, est-ce viable d'aller les chercher automatiquement pour ressigner le token ?

Enfin, à travers toute cette méthode, pour ce qui est des infos sensibles (n° de Tel, n° de CB,...), y'a-t-il un danger ?

Merci pour votre lecture, et merci d'avance pour vos réponses :)

2 réponses

yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
Modifié le 17 mai 2018 à 20:21
bonsoir, as-tu envisagé d'utiliser https (pour encrypter les données échangées) et le concept de session (pour contrôler la validité des sessions)?
ma première impression est que tu essaies de réinventer la roue.
0
Merci pour ta réponse !
Je n'essaie pas de réinventer la roue, j'essaie juste de faire ce qui a l'air de plus en plus incontournable. Je me perd parmi les multiples solutions, si bien que je mélange sûrement un peu les choses, et ne comprend pas tout.
Pour ce qui est du protocole HTTPS, d'après ce que j'ai déjà pu lire, il s'agirait d'un certificat obtenu. Mais donné par qui ? Sous quelles conditions ? Y'a-t-il quelque chose à changer dans mon code/ma façon de coder ? Que peux-tu me dire à ce sujet ?
Ensuite, concernant les sessions, je dois avouer que quelques mois en arrière, lorsque je découvrais le framework Ionic pour développer l'application mobile, j'ai eu du mal à intégrer une partie serveur, du moins, à établir une communication entre le dur le l'application, et la BDD hébergée sur le serveur. Lorsque j'ai réussi, j'ai tenté d'utiliser les sessions (que j'ai d'ailleurs toujours utilisées sur les différents site web que j'ai pu développé), mais ce n'était pas concluant, les sessions ne restaient pas actives, puis j'ai remis ça à plus tard, en utilisant un système de connexion des plus basiques, le temps de développer toute la structure de l'application.
Je réessaierai donc, j'ai fait du chemin avec ce framework depuis, peut-être m'en sortirai-je mieux. En attendant, si tu as d'autres infos complémentaires, d'autres pistes, etc... je suis toujours preneur !
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Nox
18 mai 2018 à 08:40
A propos de https, peux-tu décrire où et comment ta solution est-elle hébergée?
En général, utiliser https au lieu de http n'est pas visible par l'application, sauf, éventuellement, si elle veut refuser d'utiliser http.
0
Pas certain de comprendre la question, mais.. c'est un hébergement web avec domaine chez OVH.
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Nox
18 mai 2018 à 12:48
je pense que ovh t'offre https comme une option de configuration.
0
Je viens de réessayer pour les sessions.
Pendant une exécution d'un même script PHP, avec session_start() au début, puis une initialisation de variable ($_SESSION['test'] = 'test'; alors la variable est toujours existante en fin de script.
Mais si je change de page dans l'appli, et envoie une nouvelle requête POST, même en ayant session_start() en début de script PHP, la variable $_SESSION['test'] renvoie null.
Je pense que cela est dû au principe de l'application qui se comporte comme un navigateur, mais ne peut peut-être pas utiliser les cookies de session ou autre support sur lequel les sessions PHP s'appuient.
0
astuces72 Messages postés 7722 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 17 avril 2024 1 637
Modifié le 19 mai 2018 à 17:08
slt

rien a voir avec ta question, mais le hachage avec la fonction sha1() n'est pas/plus sécurisé, alors toi qui cherche à faire bien, déjà c'est mal parti :D
https://www.php.net/manual/fr/function.sha1.php
0
Haha merci, j'avais lu que les dictionnaires n'étaient pas une menace dans le cas où j'utilise des Salts, mais la description que le monsieur fait dans ton lien me laisse perplexe... Du coup je me mettrai volontier à jour, que conseilles-tu ?
0
astuces72 Messages postés 7722 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 17 avril 2024 1 637
22 mai 2018 à 16:08
slt

Moi je fais comme préconisé:
http://php.net/manual/fr/function.password-hash.php
0