IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Cryptage de mot de passe


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Cryptage de mot de passe
    Bonjour,

    Je suis un jeune étudiant qui va commencer seulement l'année prochaine des études d'informatique. Donc je "bricole" des sites internet si je peux appeler sa comme ça, enfin bref vu que mes études seront basées sur la construction du site internet, j'ai décidé de commencer à coder pour avoir de l'avance et avoir deux trois bases quand j'arriverai au lycée l'année prochaine.

    Jusque-là aucun souci car avec les tutoriels que l'on trouve sur le net c'est relativement simple d'apprendre en autodidacte. Mais aujourd'hui j'ai malheureusement une question qui ne trouve pas de réponse (google ne m'a absolument pas aidé :/), donc je me suis tourné vers des professionnels pour tenter de répondre à ma question.

    Donc enfaite un ami à un serveur privé de jeu, et il m'a demandé de lui construire un site internet, j'ai déjà pas mal avancé j'ai créé la base du site, c'est-à-dire page d'accueil, classement des joueurs, pages d'informations ainsi que le forum. Là où je bloque c'est pour la page d'inscription, c'est le système de mot de passe qui me bloque.

    Voici ce que j'ai trouvé sur internet pour une page d'inscription :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    if(isset($_POST['name']) and isset($_POST['email']) and isset($_POST['mdp']) and $CONFIG['inscription'] == 1) 
    {
    	$tpl->assign('envoie_form', '1');
     
    	$pseudo=mysql_real_escape_string($_POST['name']);        
    	$mdp=mysql_real_escape_string($_POST['mdp']);
    	$email=mysql_real_escape_string($_POST['email']);
     
    	$errors = '';
     
    	if(preg_match('#^[a-zA-Z0-9_\.-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$#', $email))
    	{
    		if (strlen(trim($pseudo)) > 5 && strlen(trim($pseudo)) < 11)
    		{
    			if (strlen(trim($mdp)) > 5 && strlen(trim($mdp)) < 11)
    			{
    				mysql_select_db("account");
    				$sql = mysql_query("SELECT COUNT(*) AS nb_pseudo FROM `account` WHERE name='$pseudo'");
    				if (mysql_result($sql, 0, 'nb_pseudo') == 0)
    				{
     
    					$sql="INSERT INTO account (name, password, email) VALUES ('$name', password ('$mdp'), '$email')";
    					mysql_query($sql) or die (mysql_error());
     
    				}
    				else { $errors =5; }//5: pseudo est deja utilise
    			}
    			else { $errors =4; }//4: le mot de passe doit etre compris entre 6 et 10 caracteres
    		}
    		else { $errors =3; }//3:le name doit etre compris entre 6 et 10 caracteres
    	}
    	else { $errors =2; }//2: email invalide
    Ça fonctionne bien, mais le problème c'est que le mot de passe ne ce crypte pas de la façon dont le jeu utilise.

    Voici le mot de passe "testmdp" issu du code ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *BE19D2CF958FCC313C82A64EC01249FFBC595299
    Et voici le même mot de passe "testmdp" mais crypté de la façon qu'utilise le jeu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0Rr7gtBnq2QHKce2G4qjtw85SQ0=
    M'on ami m'a dit que le jeu utilise le cryptage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    base64_encode(pack("H*",sha1(utf8_encode)))
    A vrai dire la je suis lessivé je comprends pas comment changer le script ci-dessus pour prendre en compte ce type de cryptage.

    Pouvez-vous m'aider ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    J'ai repris ton code parce que tout ce que tu trouves sur internet n'est pas à prendre pour argent comptant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?php
     
    if (isset($_POST['name'], $_POST['email'], $_POST['mdp']) && ($CONFIG['inscription'] == 1))
    {
        $tpl->assign('envoie_form', '1');
     
        // plusieurs saisies peuvent être en erreur
        $errors = array();
     
        // PHP fait nativement la validation des emails
        if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false)
        {
            $errors[] = 2; // email invalide
        }
     
        $len = strlen(trim($_POST['name']));
        if (($len < 5) || ($len > 11))
        {
            $errors[] = 3;  // nom entre 6 et 10 caractères :: ça fait pas beaucoup !
        }
     
        $len = strlen(trim($_POST['mdp']));
        if (($len < 5) || ($len > 11))
        {
            $errors[] = 4;  // mot de passe entre 6 et 10 caractères :: limite totalement inutile 
        }
     
        // on continue que s'il n'y pas d'erreurs
        if (empty($errors))
        {
            mysql_select_db('account');
     
            // unicité du pseudo
            $sql = "SELECT COUNT(*) AS nb_rec FROM `account` WHERE name='".mysql_real_escape_string(utf8_encode($_POST['name']))."'";
            $qry = mysql_query($sql);
            $nb  = mysql_result($qry, 0);
     
            if ($nb)
            {
                $errors[] = 5; // pseudo déjà utilisé
            }
            else
            {
                // création du compte
                $sql = "INSERT INTO `account` (name, password, email) VALUES ("
                       . "'".mysql_real_escape_string(utf8_encode($_POST['name']))."'"
                       . "'".mysql_real_escape_string(base64_encode(pack('H*', sha1(utf8_encode($_POST['mdp'])))))."'"
                       . "'".mysql_real_escape_string(utf8_encode($_POST['email']))."')";
     
                mysql_query($sql) or die (mysql_error());
            }
        }
    }
     
    ?>
    Quelques remarques :
    - Faire un utf8_encode() veut dire qu'il y a des différences entre les encodages (scripts, html, base de données) : c'est déjà pas simple le bordel des encodages alors ce n'est pas nécessaire d'en rajouter une couche. Pour éviter toute mauvaises suprises et pour dormir sur tes deux oreilles tu dois être homogène sur toute la ligne : tes scripts PHP doivent être encodés en UTF-8 sans BOM, la base de données en UTF-8 et le charset HTML : UTF-8. Une fois que t'es raccord, tu utilises les fonction de traitement php commençant par mb_*, comme mb_strlen() par exemple.

    - Les fonctions mysql_* sont obsolètes, tu dois passer aux fonctions mysqli_* ou à PDO

    - La gestion des erreurs est insuffisante tant au niveau du contrôle de la saisie des utilisateurs qu'au niveau des erreurs système. On ne fait jamais un or die (mysql_error()) dans un code en production.

    - La gestion de la sécurité du mot de passe est nulle : il faut "saler" les mots de passe (ici) pour déjouer les attaques par dictionnaire. La longueur devrait être laissée libre vu que de toute façon tu ne devrais stocker que la hash qui est toujours de longueur fixe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $a = hash('whirlpool', 'mot_de_passe_et_le_sel');
    $b = strlen($a); // 128 caractères
     
    $c = hash('whirlpool', 'mot_de_passe_et_le_sel_et_le_poivre');
    $d = strlen($c); // 128 caractères
    Allez bon courage pour la suite

  3. #3
    Développeuse forum
    Avatar de Atomya Rise
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Février 2009
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2009
    Messages : 443
    Points : 1 407
    Points
    1 407
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    - Les fonctions mysql_* sont obsolètes
    Seulement à partir de PHP 5.5, qui n'est pas encore sortie

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Certes, mais depuis combien de temps n'est-elle plus maintenue ?

  5. #5
    Développeuse forum
    Avatar de Atomya Rise
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Février 2009
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2009
    Messages : 443
    Points : 1 407
    Points
    1 407
    Par défaut
    Ah ben ça, ça fais longtemps ^^ mais cela ne l'empêche pas de fonctionner, pour moi, cela reste du code stable

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci à vous de m'aider,

    j'ai remplacé le code trouvé sur le net par le votre, est malheureusement ça ne fonctionne pas enfaite des que je clique sur valider, rien ne ce passe la requête n'est même pas envoyé dans la base de donnée.

    Voici le code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    <?php
     
    if (isset($_POST['name'], $_POST['email'], $_POST['mdp']), $_POST['mdp2']) && ($CONFIG['inscription'] == 1))
    {
        $tpl->assign('envoie_form', '1');
     
        // plusieurs saisies peuvent être en erreur
        $errors = array();
     
        // PHP fait nativement la validation des emails
        if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false)
        {
            $errors[] = 2; // email invalide
        }
     
        $len = strlen(trim($_POST['name']));
        if (($len < 5) || ($len > 21))
    	{
    		$errors[] = 3;  // nom entre 6 et 20 caractères :: ça fait pas beaucoup ! (rectifie)
    	}
     
        $len = strlen(trim($_POST['mdp2']));
        if (($len < 5) || ($len > 66))
    	{
    		$errors[] = 4;  // mot de passe entre 6 et 65 caractères la colonne password_decrypt est en varchar (65)
    	}
     
        $len = strlen(trim($_POST['mdp']));		//desactive la limite de caractere (enfin je pense) la colonne password est en varchar (65)
    //	if (($len < 5) || ($len > 11))
    //	{
    //		$errors[] = 5;  // mot de passe entre 6 et 10 caractères :: limite totalement inutile 
    //	}
     
        // on continue que s'il n'y pas d'erreurs
        if (empty($errors))
        {
            mysql_select_db('account_login');
     
            // unicité du pseudo
            $sql = "SELECT COUNT(*) AS nb_rec FROM `account_player` WHERE name='".mysql_real_escape_string(utf8_encode($_POST['name']))."'";
            $qry = mysql_query($sql);
            $nb  = mysql_result($qry, 0);
     
            if ($nb)
            {
                $errors[] = 5; // pseudo déjà utilisé
            }
            else
            {
                // création du compte
                $sql = "INSERT INTO `account_data` (name, password_decrypt, password, email) VALUES ("
                       . "'".mysql_real_escape_string(utf8_encode($_POST['name']))."'"
                       . "'".mysql_real_escape_string(utf8_encode($_POST['mdp2']))."'"
                       . "'".mysql_real_escape_string(base64_encode(pack('H*', sha1(utf8_encode($_POST['mdp'])))))."'"
                       . "'".mysql_real_escape_string(utf8_encode($_POST['email']))."')";
     
                mysql_query($sql) or die (mysql_error());
            }
        }
     
    	if($errors == '') //l'inscription a fonctione
    		{ $tpl->assign('valid_form', '1'); }
     
    	else //sinon chargement des erreurs
    		{ $tpl->assign('valid_form', $errors); }
    }
    else 
    {
    	$tpl->assign('envoie_form', '0');
     
    	if($CONFIG['inscription'] == 0) {$tpl->assign('conf_inscription', '0');} //inscription desactive
    	else {$tpl->assign('conf_inscription', '1');} //inscription active
    }
    $tpl -> parse('public/inscription.tpl');
    ?>
    J'ai ajouté une colonne password_decrypt pour voir le mot de passe non crypté, pour un accès au compte des joueurs pour facilité le travaille de l'équipe de jeu.

    J'ai testé avant et après cet modification cela ne change rien :/

    Merci d'avance.

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    à quel moment tu te connectes à la base de données ?
    Et sinon, pour faire tes essais je te conseille d'activer la remontée de toutes les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(-1);

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Pour la connexion à la base de données, j'utilise un petit fichier php nommé : config.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    	$host = "localhost";
    	$username = "root";
    	$password = "jFOppv5m59ginq";
    ?>
    Dont il est référencé dans la page d'index du site à l'aide de la fonction :

    Je vais essayer cette après midi d'activer la remontée d'erreurs comme vous me l'avez conseillé, je vous tient au courant.

    Encore merci de votre aide.

Discussions similaires

  1. Cryptage de mot de passe
    Par DJBORIE dans le forum Access
    Réponses: 3
    Dernier message: 17/02/2006, 15h10
  2. cryptage de mot de passe
    Par chti_juanito dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 07/02/2006, 23h29
  3. Oracle 9i - Cryptage de mots de passe sous sql
    Par momo9237 dans le forum Oracle
    Réponses: 2
    Dernier message: 04/01/2006, 11h11
  4. [VB.NET] cryptage de mot de passe.
    Par leSeb dans le forum Windows Forms
    Réponses: 16
    Dernier message: 28/05/2005, 14h06
  5. [cryptage] cryptage de mot de passe
    Par LoLoSS dans le forum Sécurité
    Réponses: 5
    Dernier message: 11/05/2004, 12h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo