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)) {
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
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:
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)
Ps: Désolé d'avoir répondu à la place de ftc... :s je sais pas si je pouvais, mais j'aime bien ce secteur...
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:
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)
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:
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)
Ps: Désolé d'avoir répondu à la place de ftc... :s je sais pas si je pouvais, mais j'aime bien ce secteur...
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.
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.
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.