8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,
Voilà j'ai voulu créer une table 'users' avec les champs (id, login, password). Sauf que là je me suis rendu compte que c'était pas très sérieux tout ça car tous les password seront donc visible ... Smiley lol
J'ai un peu cherché par ci par là et j'ai lu qu'il fallait utilisé MD5 ou encore SHA1 qui était plus efficace. Le problème c'est que je comprend pas comment utilisé ce "truc" là. Par exemple quand je fais ma table je sélectionne quand même le type "text" ?
Je suis un peu perdu ... Smiley cligne

Merci pour votre aide. Smiley smile
Bonjour,

Crypter les mots de passe est indispensable niveau sécurité, voici comment mettre en place avec un cryptage md5 :

On part du principe que le mot de passe est "mypassword", si on crypte ce password avec md5 en faisant md5('mypassword') on obtiendra "34819d7beeabb9260a5c854bc85b3e44".

Pour la structure de la table, il vaut mieux avoir un VARCHAR de taille 32.

Par exemple, lors de l'inscription : (le code n'est pas du tout sécurisé, c'est juste pour l'exemple)

if(isset($_POST['ident'], $_POST['password'])) {
$passwordMd5 = md5($_POST['password']);

mysql_query("INSERT INTO users(login, password) VALUES('".$_POST['ident']."', '".$passwordMd5."')");

}

Il suffit ensuite de stocker l'identifiant et le mot de passe dans un cookie et vérifier ensuite sa valeur, par exemple le cookie pourra contenir "Lossius30=34819d7beeabb9260a5c854bc85b3e44" et "=" sera le séparateur.

J'espère t'avoir éclairé Smiley smile
Ok merci lossius.
Donc pour crypté via MD5 il suffit juste de mettre MD5 devant la variable et ça le fait automatiquement.
Par contre j'ai lu beaucoup de mauvaise remarque sur MD5, beaucoup de personnes affirment qu'il est préférable d'utiliser SHA1. J'imagine que ça fonctionne pareil, je met SHA1 devant la variable et voilà.
Et donc quand un membre veut se connecté, je prend le mot de passe rentré par l'utilisateur, je le transforme en mot de passe codé via MD5 ou SHA1 et ensuite je compare avec la valeur de la bdd.

Merci beaucoup ! Smiley biggrin
Salut Smiley biggrin
Permettez moi d'apporter 2 petites précisions.

Tout d'abord concernant la fonction md5()
Elle est nativement disponible en language SQL.
Le code qui a été proposé plus haut peut être raccourci.

$passwordMd5 = md5($_POST['password']);
mysql_query("INSERT INTO users(login, password) VALUES('".$_POST['ident']."', '".$passwordMd5."')");

devient alors :

mysql_query("INSERT INTO users(login, password) VALUES('".$_POST['ident']."', MD5(".md5($_POST['password'])."))");

Voilà, bon c'est pas une ENORME optimisation mais çà t'évite de déclarer une variable inutile.
C'est toujours çà de gagné Smiley biggol

Ensuite deuxième point, méfiez vous du SHA-1, il a été cracké récemment.
Du moins je ne sait pas si c'est la première fois qu'un hacker parviens à décrypter un hash SHA-1 mais le fait est qu'aujourd'hui, bruteforcer du SHA-1 ne prends plus que quelques minutes Smiley sweatdrop

Voilà l'article qui m'a mis la puce à l'oreille :
http://www.developpez.com/actu/23970/Les-pirates-ont-ils-compris-avant-les-autres-les-avantages-du-Cloud-Un-hacker-exploite-AmazonEC2-pour-casser-l-algorithme-SHA-1

Allez bye bye...
Salut,

encore 2 petites remarques :

* que tu utilises md5 ou sha1 il faut l'utiliser en combinaison avec un salt : cela évite que des mots de passe très simples soient retrouvés à l'aide de tables de comparaison ou de dictionnaires. Il y a plusieurs façons de générer un salt mais au final on se retrouve avec une suite de caractères "exotiques" qu'il faudra utiliser au moment de l'INSERT et de la vérification comme par exemple :
$salt = '7G8fdY045pA8473c';
$password = md5($salt.$password);
Du coup on ne le retrouvera pas à l'aide d'une table arc en ciel (Rainbow Table) ou d'un dictionnaire. Par contre cela ne protège pas d'une attaque "Brute Force" qui consiste à essayer toutes les combinaisons possibles jusqu'à trouver la bonne : pour cela il faut limiter le nombre de tentatives de connexion (par IP et/ou par durée : après 5 tentatives d'une même IP le même jour on n'effectue plus le contrôle en base par exemple).
* dans tous les cas dès qu'on interroge une base mysql il faut protéger les variables alphanumériques des injections SQL : avec mysql_query il faut utiliser mysql_real_escape_string et avec PDO des requêtes préparées (ou à défaut PDO::quote).

@Twist0 > merci pour l'article. Smiley cligne