Page 1 sur 2

bien comprendre la fonction crypt

Posté : 08 avr. 2014, 00:51
par foetus69
Kikoo,

Après de nombreuses recherches il semblerait que la fonction crypt soit la meilleure solution pour stocker les mots de passe. Right ?

Autrement je voudrais savoir comment l'utiliser car j'ai fait ceci mais ça ne marche pas :(
$mdp = crypt($_POST["mdp"]);
$MyQuery = "SELECT * FROM clients WHERE nom = '".$_POST["nom"]."' AND mdp = '".$mdp."'";
Les echos m'affichent des trucs différents :-k

Merci de votre aide et bonne nuit ou journée :)

Re: bien comprendre la fonction crypt

Posté : 08 avr. 2014, 08:00
par moogli
Salut,

As tu regarde, la doc de la fonction ? http://www.lephpfacile.com/cours/8-recu ... ormulaires
Les exemples sont assez explicite.

Celle ci recommandé aussi d'utiliser password_hash ;)

Pour info on ne met pas le mot de passe dans le select.
On sélectionne le mdp crypté et comparé en php. (Question d'habitude et tu es certain d'avoir un retour cela permet de savoir si le compte utilisateur existe ou pas ;)

@+

Re: bien comprendre la fonction crypt

Posté : 08 avr. 2014, 08:49
par sirakawa
parce que, sans deuxième paramètre semence, chaque fois la fonction crypt crée une nouvelle semence aléatoire.
http://us2.php.net/manual/fr/function.crypt.php

voir aussi:
http://www.openwall.com/phpass/

Re: bien comprendre la fonction crypt

Posté : 08 avr. 2014, 12:53
par foetus69
Salut les garçons,

En fait je pensais que le sel généré par défaut permettait de retomber sur ses pattes mais je comprends mieux la problématique.

Un petit exemple :
$hashed_password = crypt('mypassword','poivre');
echo $hashed_password;
Du coup j'ai une petite série de questions :

1) Est-ce fort ou faible comme mdp ? Je ne suis pas experte, j'me rends pas bien compte...
2) Pourquoi et comment ne pas mettre le mdp dans le select ? Du coup tu fais comment moogli ?
3) password_hash n'est valable qu'à partir d'une version très récente de php. Si on a pas, on fait quoi, du sha1, md5 ou crypt ?

Merci à vous les loulous.

Re: bien comprendre la fonction crypt

Posté : 08 avr. 2014, 16:30
par sirakawa
pour développer moogli:
Connexion : l'utilisateur fournit son identifiant et son mot de passe.($my_pass)
La requete ressemble à ça :
select identifiant, mot_de_passe from table where identifiant = mysql-real_escape($identifiant) ;
Si tu obtiens un résultat non vide ( 1 ou plusieurs lignes) si une des lignes contient $my_pass : connexion acceptée.

La force du mot de passe dépend de sa conception etnil faut uhne semence relativement longue, qu'il faut strocker quelque part.

iL EXISTE UNE AUTRE SOLUTION :
/**
 * creer_hachage($mot)
* \brief hache le mot de passe
* \version adaptée de la fonction de simans dot net sur fr2.php.net/manual
* \param $mot string le mot à crypter
* \return le mot crypté(60 cars)) et la semence (22 cars)) utilisée concaténée à la fin.
 */
function creer_hachage($mot )
{
	$force = "08";
	$semence = "";
	for ($i = 0; $i < 22; $i++)
	{
		$semence .= substr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 61), 1);
	}
	return crypt($mot, "$2a$".$force."$".$semence).$semence;
}
ET
/*vERIFIER_HACHAGE*/
Function verifier_hachage($mot_clair, $mot_code)
 {
 	$force = "08";
 	if (substr ($mot_code, 0, 60) == crypt($mot_clair, "$2a$".$force."$".substr($mot_code, 60)))
 	{
 		return true;
 	}
 	else
 	{
 		return false;
 	}
}

Re: bien comprendre la fonction crypt

Posté : 08 avr. 2014, 17:54
par foetus69
Merci siramoogli :)

Tu veux dire que tu interroges le mot de passe qu'après ? Qu'au moment où tu "whilefetcharrayes" du verbe bien connu "whilefetcharrer" :boire4:

+1 pour l'alternative sécurité ;)

Re: bien comprendre la fonction crypt

Posté : 08 avr. 2014, 19:40
par sirakawa
Oui, l'idée est de ne pas envoyer le mot de passe par internet à partir du formulaire :
ça limite les risques d'injection (d'où les mysql_real_escape)
On ne s'occupe du mot de passe que si l'identifiant existe.

Je pense que cette habitude tient surtout au cas où le passe est codé par mysql
UPDATE mysql.user SET Password=PASSWORD('newpass')
-> WHERE User='bob' AND Host='%.loc.gov';
car le mot de passe est envoyé en clair dans ce cas.

Re: bien comprendre la fonction crypt

Posté : 08 avr. 2014, 23:16
par moogli
Une note toutes fois : la sécurité ne vaut que ce vaut le point le plus faible de la chaîne.

En clair si tu as un coffre fort avec des parois d'un mètre d'épaisseur et une combinaison a 18 caractères et que 3 combinaisons erronées a la suite, si tu laisse le code a côté de la porte ça sert a rien ;)

Donc la dans le cas qui nous intéresse le bash du mot de passe c'est bien si l'on a accès a ta base parce que les n'y seront pas en clair.
Par contre danse contextes globale le maillon c'est généralement entre le client le serveur car les formulaires de connections sont rarement sur https et du coup tout circule en clair sur le réseau et donc récupérable ;)

Sinon pour répondre a ta question oui un sha-xxx est utilisable (perso sha-512).
J'essai aussi d'utiliser un alto qui est utilisable sur le sgbd afin de pouvoir changer les mdp directement sur la base mais ceci est facultatif.

@+

Re: bien comprendre la fonction crypt

Posté : 14 avr. 2014, 23:17
par foetus69
Coucou,

Je reviens vers vous car je ne comprends pas bien la fonction "verifier_hachage" et surtout les paramètres passés.

Sur ma page courante j'ai créé le mot de passe suivant "monmotdepasse" //$2a$08$MxV8DBhMdgC4thdgIPRbOevi30Csn1dCxlI0gw0P4SBnGY/meHzQGMxV8DBhMdgC4thdgIPRbOq

Quelle valeur est stockée en bdd ?

Comment utiliser la fonction de vérification ?

echo verifier_hachage("monmotdepasse","c'est quoi le mot_code ?"); //Si je mets la valeur en commentaire le script couine :(

Merci à vous

Re: bien comprendre la fonction crypt

Posté : 15 avr. 2014, 10:18
par sirakawa
à la création du compte:
//$passe_souhaite est en clair
$passe_code = creer_hachage ( $passe_souhaite );
		$requete = "INSERT into $table_u set `nom` = '$identifiant',`pass`='$passe_code', `email` ='$adresse_electronique', `niveau`='1' ";
		$resultat = $mysqli->query ( $requete );
à la vérification:
$passe = isset($_POST['passe']) ? $_POST['passe']:"";
$nom = isset($_POST['nom']) ? $_POST['nom']:"";

/**$entree boolean true si l'identifiant et le mot de passe sont exacts*/
$entree= false; //entree est un booléen exploité par le suite par défaut à false pour limiter les entrées non souhaiteées 
$mysqli = connexion($ServeurMysql, $RootMysql,$PassRootMysql);
$nom_table = $NomBdd.".kalig_utilisateurs";
$requete = "select * from $nom_table where `nom` = '$nom'";
$resultat = $mysqli->query($requete);
$ligne = $resultat->fetch_object();
if ($ligne == NULL)//_______________________________________________________________le nom n'existe pas
{
	exit(0);
}
//ici le nom existe
$passe_base = $ligne->pass; //mot de passe enreistré dans la BDD (codé par conséquent)
$entree = verifier_hachage ($passe, $passe_base)
;

Re: bien comprendre la fonction crypt

Posté : 15 avr. 2014, 12:43
par foetus69
Kikoo et merci !

C'est bien ce que j'ai fait puisque : $2a$08$MxV8DBhMdgC4thdgIPRbOevi30Csn1dCxlI0gw0P4SBnGY/meHzQGMxV8DBhMdgC4thdgIPRbOq = "monmotdepasse"

Seulement quand je mets
verifier_hachage("$passe_post","$passe_code");

qui revient à faire

verifier_hachage("monmotdepasse","$2a$08$MxV8DBhMdgC4thdgIPRbOevi30Csn1dCxlI0gw0P4SBnGY/meHzQGMxV8DBhMdgC4thdgIPRbOq")

Il interprète mon $ du $2a$08...comme une variable. Bizarre, enfin non, c'est quoi l'astuce ? :priere:

Fée

Re: bien comprendre la fonction crypt

Posté : 15 avr. 2014, 14:19
par sirakawa
quand tu écris "$2a.." tu indiques une variable de ce nom; si tu mets un nom de variable, ça fonctionne; il suffit de regarder l'exemple...
Tout n'est pas équivalent de tout.
Si tu n'y parviens pas, tu devrais pouvoir remplacer dans les deux fonctions "$2a$" par une suite de 4 signes ne commençant pas par $

Re: bien comprendre la fonction crypt

Posté : 22 avr. 2014, 23:21
par foetus69
Bonsoir,

Je reviens vers vous car le script me plait bien mais je n'arrive pas à le faire fonctionner.
$passe_souhaite = "sirakawa";
$passe_code = creer_hachage ( $passe_souhaite );
echo $passe_code;

/* me renvoie $2a$08$uiVy44ggh4zD3FRRWf7lp.IU16oubWF3uZd.zQDtQBoh.FHgvrqW6
si je fais F5 $2a$08$ZSZHbVvxk426aXn5KisjTOzZgsK3sxZsTc/xhhD5adnv8XkpF42sG
...en somme jamais pareil */
mais je stocke une de ces valeurs dans mon varchar en base (que j'arrive à sortir en requêtant echo $rows...)

Quand j'appelle la fonction de vérification verifier_hachage($_POST["password"],$mavaleurenbase);

C'est toujours égal à KO :'(

svp :priere:

Re: bien comprendre la fonction crypt

Posté : 23 avr. 2014, 08:31
par moogli
As tu tester le contenu de ta fonction pas a pas ?
Que retourne les substr ?
Que retourne la fonction crypt ?
Il faut que tu debogue cette fonction pour arriver a tes fins ;)

@+

Re: bien comprendre la fonction crypt

Posté : 23 avr. 2014, 11:07
par sirakawa
Ces fonctions fonctionnent parfaitement :
La fonction crypt crée une semence aléatoire à partir de laquelle elle crée un mot crypté de longueur fixe à la fin duquel se trouve la semance.
Le mot de passe crypté est stocké dans la BDD.
Lorsque l'utilisateur se connecte, il donne son identifiant et son mot de passe en clair. La BDD est consultée pour voir si l'identifiant existe et la fonction de vérification extrait la semence du mot de passe crypté provenant de la BDD et crypte avec cette semence le mot de passe en clair : les deux mots cryptés doivent être identiques.