OVH Cloud OVH Cloud

mot de passe crypte

5 réponses
Avatar
Thierry
Bonjour à tous,

J'ai une table user dans mysql avec un champs password. Je voudrais
crypter cette colonne.

Est ce que je dois le faire dans php ou est ce que mysql fournit la
fonction. Dans les deux cas, comment est ce que àa s'utilise ?

Pour l'instant je fais juste ça :

$sql = "SELECT * FROM enduser WHERE login='$login' AND
password='$password'";
$requete = mysql_query($sql) or die("Impossible d executer la
requete:".mysql_error());
$enduser = null;
while ($row = mysql_fetch_object($requete)) {

5 réponses

Avatar
Thuwe
Bonjour à tous,


Bonjour

J'ai une table user dans mysql avec un champs password. Je voudrais
crypter cette colonne.


Assez normal

Est ce que je dois le faire dans php ou est ce que mysql fournit la
fonction. Dans les deux cas, comment est ce que àa s'utilise ?


Il me semble que Mysql le permet avec la fonction password

Pour l'instant je fais juste ça :


La requete devrait ressembler a ca :

$sql = "SELECT * FROM enduser WHERE login='$login' AND
password= password ('$password'");

Il faut egalement gerer les insertm update & co...

Julien

Avatar
ftc
Est ce que je dois le faire dans php ou est ce que mysql fournit la
fonction. Dans les deux cas, comment est ce que àa s'utilise ?



Il me semble que Mysql le permet avec la fonction password



Ne jamais utiliser la fonction password de MySQL, l'algorithme peut être
changé à tout moment, il l'a d'ailleurs été entre les versions 4.0 et 4.1.

Il faut lui préférer md5, sha1 ou une fonction de ce genre.

Personellement, je préfère travailler avec la fonction crypt de PHP en
forçant l'utilisation de l'algo md5.


Avatar
Thierry

Est ce que je dois le faire dans php ou est ce que mysql fournit la
fonction. Dans les deux cas, comment est ce que àa s'utilise ?




Il me semble que Mysql le permet avec la fonction password



Ne jamais utiliser la fonction password de MySQL, l'algorithme peut être
changé à tout moment, il l'a d'ailleurs été entre les versions 4.0 et 4.1.

Il faut lui préférer md5, sha1 ou une fonction de ce genre.

Personellement, je préfère travailler avec la fonction crypt de PHP en
forçant l'utilisation de l'algo md5.


Ah d'accord, je comprend.

Aurais-tu du code à me proposer pour md5 (sha1 ou autre) ?

Titi



Avatar
Yann PIQUET


Est ce que je dois le faire dans php ou est ce que mysql fournit la
fonction. Dans les deux cas, comment est ce que àa s'utilise ?





Il me semble que Mysql le permet avec la fonction password



Ne jamais utiliser la fonction password de MySQL, l'algorithme peut
être changé à tout moment, il l'a d'ailleurs été entre les versions
4.0 et 4.1.

Il faut lui préférer md5, sha1 ou une fonction de ce genre.

Personellement, je préfère travailler avec la fonction crypt de PHP en
forçant l'utilisation de l'algo md5.



Ah d'accord, je comprend.

Aurais-tu du code à me proposer pour md5 (sha1 ou autre) ?

Titi


Bonjour,

Pour md5, en utilisant la version de php (disponible depuis PHP 3):

$password = md5($password);
$sql = "SELECT * FROM enduser WHERE login='$login' AND
password='$password'";
$requete = mysql_query($sql) or die("Impossible d executer la
requete:".mysql_error());
$enduser = null;
while ($row = mysql_fetch_object($requete)) {

Et en utilisant la version de MySQL:

$sql = "SELECT * FROM enduser WHERE login='$login' AND
password=MD5('$password')";
$requete = mysql_query($sql) or die("Impossible d executer la
requete:".mysql_error());
$enduser = null;
while ($row = mysql_fetch_object($requete)) {

Pour sha1, en passant par php (disponible depuis PHP 4.3.0):

$password = sha1($password);
$sql = "SELECT * FROM enduser WHERE login='$login' AND
password='$password'";
$requete = mysql_query($sql) or die("Impossible d executer la
requete:".mysql_error());
$enduser = null;
while ($row = mysql_fetch_object($requete)) {


Et en utilisant la version de MySQL à nouveau:

$sql = "SELECT * FROM enduser WHERE login='$login' AND
password=SHA1('$password')";
$requete = mysql_query($sql) or die("Impossible d executer la
requete:".mysql_error());
$enduser = null;
while ($row = mysql_fetch_object($requete)) {

Note: md5 génère des hashages de 32 caractères, et sha1 de 40...
attention à la taille des varchars si il y à lieu ;)

http://www.nexen.net/docs/mysql/annotee/encryption-functions.php?lien=sha1
pour les fonction de cryptage mysql (pas trouvé de liens récapitulant
celles pour php, désolé... mais on compte entre autres:

str_rot13
http://www.nexen.net/docs/php/annotee/function.str-rot13.php?lien=rot

md5 http://www.nexen.net/docs/php/annotee/function.md5.php

sha1 http://www.nexen.net/docs/php/annotee/function.sha1.php

crypt http://www.nexen.net/docs/php/annotee/function.crypt.php (celle-ci
les résume plus ou moins toutes, mais je ne l'apprecie personnellement
qu'assez peu... question de gout, je suppose)

et toute la librairie mcrypt, bien sur:

http://www.nexen.net/docs/php/annotee/ref.mcrypt.php?lien=mcrypt

J'en oublie surement certaines, mais bon...

Bonne journée,

Aramiil

Ps: Désolé d'avoir répondu à la place de ftc... :s je sais pas si je
pouvais, mais j'aime bien ce secteur...




Avatar
dmetzler
Une chose que je fais désormais, c'est d'inclure dans le stockage du
mot de passe l'algorithme utilisé pour le stocker à la manière de
LDAP : les champs dans MySQL sont de la forme
{MD5}fqlsdfjmalkjfapoizjfqmsazfqsf== ou {SHA1}qsldfkjqmsljkmqsqsdfl

Il y a beaucoup d'avantages à utiliser cela :
1°) tu peux choisir ton encodage dans un fichier de conf
2°) si tu choisis de changer d'encodage un jour, ça ne pose pas de
problème, la transition se fera en douceur au fur et à mesure que les
utilisateurs changeront leur mot de passe.
3°) c'est compatible avec LDAP, donc si un jour tu veux stocker tes
utilisateurs dans un arbre LDAP, ya pas de problème pour la migration.

L'inconvénient, c'est que ça te demande de faire un petit module
dédié à ça.

Comme il a été dis plus haut : ne surtout pas utiliser la fonction
PASSWORD de MySQL qui n'est là que pour crypter les mots de passe de
la base elle même.

Ce que je fais afin d'éviter certains problèmes, c'est que je
n'utilise pas de requête du genre select * from user where login='yyy'
and password='xxxx'. C'est propice aux injections SQL et comme
généralement l'authentification est la porte d'entrée, autant la
blinder.

Une des solutions que j'utilise est de faire un 'SELECT password from
user where login='yyy'. Je blinde la vérification du login passé en
paramètre (que des alpha, pas d'espace).
Ensuite, je compare avec PHP la valeur qui m'est retournée à la
valeur passée dans le champ password du formulaire d'autentification
(après l'avoir cryptée avec la méthode associée bien sûr)


Enfin, tu trouveras sur la liste un lien vers un document de John
Gallet sur la sécurité qui explique les (mauvaises ?) raisons de
crypter ses mots de passe en base. En gros, ça évite de tenter un
admin de chopper tous les mots de passe, mais ce n'est pas en soi une
mesure de sécurité. Il y parle aussi des problèmes d'injections SQL.