Comparer des résultats de crypt(...)

Résolu/Fermé
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 24 déc. 2014 à 02:17
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 13 févr. 2015 à 14:53
Bonsoir

il s'agit de changer le mot de passe d'accès à un répertoire web protégé. Celui-ci est protégé avec .htacess et les mots de passe sont rangés dans .htpasswd ; le changement se fait sans un script PHP avec :
$ligne = $_SERVER["login"] . ":" . crypt($_SERVER["passwd1"]); // la ligne sera écrite dans .htpasswd

'passwd1' parce qu'il y a 'passwd1' (saisie du mot de passe) et 'passwd2' (confirmation).
NB: la comparaison des deux se fait avant le cryptage, au niveau de javascript).

Jusque là, tout va bien, il n'y a pas de problème pour l'écriture dans le fichier et le mot de passe crypté est bien enregistré et est fonctionnel pour les accès suivants.

Là où je coince mais je pense qu'il n'y a pas vraiment de solution (mais j'espère fort me tromper) c'est la vérification de l'ancien mot de passe.

J'ai constaté qu'exécuter 3 ou 4 fois de suite crypt($str) donnera trois ou quatre résultats différents mais tous opérationnels pour accéder au répertoire protégé. Or, je souhaite dans la page de changement de mot de passe faire la saisie de l'ancien et le comparer à l'ancien, celui qui a été enregistré précédemment (mais crypté) dans .htpasswd.

Ma question est : comment faire pour, après avoir lu le mot de passe (crypté) dans le fichier .htpasswd, le comparer avec l'ancien mot de passe saisi (pour vérification et crypté lui aussi) afin de valider le changement ?

Je crois que, d'une part il n'y a pas moyen de déchiffrer un mot de passe crypté (i.e. retrouver le mot de passe en clair) et d'autre part les cryptages se suivent mais ne se ressemblent pas. Alors comment comparer les deux ?

Si le même mot de passe peut donner des cryptages différents, comment fait Apache pour vérifier si le mot de passe saisi est conforme à celui qui a été crypté et enregistré ?

Merci pour vos réponses.




A voir également:

2 réponses

kangourouxxx Messages postés 71 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 6 mars 2015 2
Modifié par kangourouxxx le 13/02/2015 à 09:29
Deux possibilités :
1) tu as une version de PHP >= à 5.6 :
https://www.php.net/manual/fr/function.hash-equals.php

2) tu donne un SALT à ta fonction crypt(), un exeple simple :

//Exemple d'utilisation de crypt() avec un salt :
<?php
 $Salt = "Une superbe pharse de cryptage ! Tu ne trouve pas mon Hash ? c'est normal %*!";
 
 //Simule le password de ton fichier
 $hashed_password = crypt('mypassword', $Salt);

 //maintenant on peut les comparer !
if ($hashed_password == crypt('mypassword', $Salt)){
   echo "Password OK";
}else{
 echo "Bad Password";
}
?>


kangouroux
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
13 févr. 2015 à 14:40
Merci beaucoup pour ta réponse. Je vais essayer et donner ici le résultat des tests avant de clore le fil de discussion.
0
Bonjour,

voila comment je procède à chaque fois.
Ma base contient une table USERS : id / login / password / level ...

le champ password contient le mdp crypté. Au retour du formulaire de connexion

if( ! empty($_POST)) {

 // recuperer les variables du formulaire 
 if (isset($_POST['login']) && isset($_POST['password'])) {
  $log=htmlspecialchars($_POST['login']);
  $pass=$_POST['password'];
 }

 if (isset($_POST['rester_connecte'])) {
  $_SESSION['rester_connecte'] = $_POST['rester_connecte'];
 }

 // traiter Modele
 $connexion_bd= $this->connect_bd();
 $this->data=$connexion_bd->query("SELECT * FROM utilisateurs WHERE login='".$log."'");
 $this->data_vue = $this->data->fetch();

 $crypted_pass = trim($this->data_vue['password']);

 $_SESSION['login'] = $log; 
 $_SESSION['password'] = $pass; 
 $_SESSION['logged-as-admin'] = false;

 // si login ok, initialiser session
 if (crypt($pass,$crypted_pass)==$crypted_pass) 
 {

  $_SESSION['logged-as-admin'] = true;

  if ($this->data_vue['level'] == 1) {
   $_SESSION['logged-as-super-admin'] = true;
  }

  header("Location: " .$_SESSION['lastUrl']);
  die();

 }
 else {
  ?>
  <br/><span class="alerte">Votre identification n'est pas valide</span><br/>
  <?php
 }
}



Les lignes 6, 18 et 25 pourront peut être t'aider : )

Le seul " inconvénient " est qu'il faut indiquer à l'internaute qu'en cas d'oubli de son mdp il ne sera pas possible de le lui renvoyer ..

[Edit] code tiré de mon CMS maison ... il faut se connecter pour modifier le contenu du site, raison pour laquelle toute personne connectée est considérée comme " Administrateur ". Seul un " Super Administrateur " peut accéder à la gestion de la table USERS ^^

Cdt
En informatique 99% des problèmes se situent entre le fauteuil et le clavier
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
13 févr. 2015 à 14:53
Merci beaucoup pour ta réponse. Il est en effet normal de ne pas pouvoir renvoyer le mot de passe car même en étant administrateur d'un site, on n'a pas à connaître le mot de passe des utilisateurs et celui-ci doit être enregistré crypté. Au besoin on prépare une page de réinitialisation du mot de passe dont l'url est envoyée par mail. Mais si on n'a pas à connaître le mot de passe, on a quand même besoin de savoir sans le connaître si le mot de passe est changé par le bon utilisateur d'où vérifier si ce qui deviendra l'ancien mot de passe est le bon. D'où ma question.

Tu as probablement d'autres besoins qui nécessite l'utilisation de MySQL et je ne pense pas créer une table avec un seul utilisateur, juste pour cette vérification mais ces deux réponses m'ont bien éclairé et je viendrai clore le fil prochainement, après les tests effectués.

Merci à tous deux.
0