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

JavaScript Discussion :

Fonction de hashage


Sujet :

JavaScript

  1. #21
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Je comprend pas vu que tu as supprimé le formulaire de ton code. Dans un premier temps j'aimerais bien que tu me montre le code (complet) que tu as fait à partir des éléments que je t'ai donné.

    Pour organiser ton code met tout le php en haut. Dans le html ne mets que le code php (la variable ou le tableau) qui doit être affiché si nécessaire.

    Sur le principe tu vois que dans le formulaire seul le login est en clair. Donc tu fais une requête en fonction du login. Ensuite tu vérifie si le mot de passe concaténé au sel et le tout hashé est égale à $_POST["reponse"]. Y'avait de l'idée dans ton code mais pour concaténer en php il faut utiliser le point '.'

    Fais aussi attention à comparer des choses comparables. Au départ dans le code javascript si on fait hash256 de (identifiant+session_sel+mot de passe), alors dans le code php il faudra comparer à la même chaine hashée.

  2. #22
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    bon avec le "." pour concaténer c'est une affaire qui roule. Mille merci.

    Il faut quand même m'expliquer 2 ou 3 choses.

    1°/ Quand je mets toute la fonction sha256 dans le formulaire ça fonctionne mais si je la met dans une page et que j'appel SHA256.js ça beug???

    2°/ le brouillage du MDP se fait côté client, le contrôle côté serveur?

    3°/ Avant de faire la requête, il faut contrôler les données et échapper les caratères spéciaux?

    Je pense pouvoir clôturer se post qui a fait couler beaucoup d'encre.

    Pour finir, les codes

    formulaire d'identification:
    j'ai passé la réponse "md5" en hidden.

    Code php : 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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    <?php
    session_start()
    ?>
     <?php
       $_SESSION["sel"] = isset($_POST['reponse']) ? $_SESSION["sel"] : hash("sha256",(uniqid(rand(), true)));
       ?>
    <html>
    <head>
      <title>Identification</title>
     
     <script type="text/javascript">
    function SHA256(s){
     
    	var chrsz   = 8;
    	var hexcase = 0;
     
    	function safe_add (x, y) {
    		var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    		var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    		return (msw << 16) | (lsw & 0xFFFF);
    	}
     
    	function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
    	function R (X, n) { return ( X >>> n ); }
    	function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
    	function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
    	function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
    	function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
    	function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
    	function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }
     
    	function core_sha256 (m, l) {
    		var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
    		var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
    		var W = new Array(64);
    		var a, b, c, d, e, f, g, h, i, j;
    		var T1, T2;
     
    		m[l >> 5] |= 0x80 << (24 - l % 32);
    		m[((l + 64 >> 9) << 4) + 15] = l;
     
    		for ( var i = 0; i<m.length; i+=16 ) {
    			a = HASH[0];
    			b = HASH[1];
    			c = HASH[2];
    			d = HASH[3];
    			e = HASH[4];
    			f = HASH[5];
    			g = HASH[6];
    			h = HASH[7];
     
    			for ( var j = 0; j<64; j++) {
    				if (j < 16) W[j] = m[j + i];
    				else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
     
    				T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
    				T2 = safe_add(Sigma0256(a), Maj(a, b, c));
     
    				h = g;
    				g = f;
    				f = e;
    				e = safe_add(d, T1);
    				d = c;
    				c = b;
    				b = a;
    				a = safe_add(T1, T2);
    			}
     
    			HASH[0] = safe_add(a, HASH[0]);
    			HASH[1] = safe_add(b, HASH[1]);
    			HASH[2] = safe_add(c, HASH[2]);
    			HASH[3] = safe_add(d, HASH[3]);
    			HASH[4] = safe_add(e, HASH[4]);
    			HASH[5] = safe_add(f, HASH[5]);
    			HASH[6] = safe_add(g, HASH[6]);
    			HASH[7] = safe_add(h, HASH[7]);
    		}
    		return HASH;
    	}
     
    	function str2binb (str) {
    		var bin = Array();
    		var mask = (1 << chrsz) - 1;
    		for(var i = 0; i < str.length * chrsz; i += chrsz) {
    			bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
    		}
    		return bin;
    	}
     
    	function Utf8Encode(string) {
    		string = string.replace(/\r\n/g,"\n");
    		var utftext = "";
     
    		for (var n = 0; n < string.length; n++) {
     
    			var c = string.charCodeAt(n);
     
    			if (c < 128) {
    				utftext += String.fromCharCode(c);
    			}
    			else if((c > 127) && (c < 2048)) {
    				utftext += String.fromCharCode((c >> 6) | 192);
    				utftext += String.fromCharCode((c & 63) | 128);
    			}
    			else {
    				utftext += String.fromCharCode((c >> 12) | 224);
    				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
    				utftext += String.fromCharCode((c & 63) | 128);
    			}
     
    		}
     
    		return utftext;
    	}
     
    	function binb2hex (binarray) {
    		var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    		var str = "";
    		for(var i = 0; i < binarray.length * 4; i++) {
    			str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
    			hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
    		}
    		return str;
    	}
     
    	s = Utf8Encode(s);
    	return binb2hex(core_sha256(str2binb(s), s.length * chrsz));
     
     
     
    }
    </script>
     
    <script language="javascript">
    <!--
      function doChallengeResponse() {
        str = document.identification.utilisateur.value+'<?php echo $_SESSION["sel"]?>'+document.identification.mot_de_passe.value;
        document.identification.reponse.value = SHA256(str);
        document.identification.mot_de_passe.value = "";
     
      }
    // -->
    </script>
     
    </head>
     
    <body>
     
    <form name="identification" method="post" action="logine.php">
    Utilisateur:
    <input type="text" name="utilisateur" size=32 maxlength=32><br>
    Mot de passe:
    <input type="password" name="mot_de_passe" size=32 maxlength=32><br>
    <input onClick="doChallengeResponse(); return true;" type="submit" name="submitbtn" value="identification"> <input type="hidden" name="reponse"  value="" size=32>
    </form>
     
    </body>
    </html>

    Formulaire de test (je prends pour MDP "azerty") je developperai tento avec la requête et le contrôle de données.

    Code php : 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
    <?php
    session_start()
    ?>
    <?php
    //echo $_POST["reponse"];
    //echo $_POST["utilisateur"];
    //echo  $_SESSION["sel"];
    $P=($_POST["utilisateur"].$_SESSION["sel"]."azerty");
    $A= hash("sha256",($P));
    if($A==$_POST["reponse"]){
    echo "ok";}
    else{
    echo"pas bon";}
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Document sans titre</title>
     
    </head>
     
    <body>
     
     reponse=<?php echo $_POST["reponse"] ;?>
     <br/>
     SHA256($P)=<?php echo $A;?>
    </body>
    </html>

  3. #23
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par hugodu28 Voir le message
    bon avec le "." pour concaténer c'est une affaire qui roule. Mille merci.

    Il faut quand même m'expliquer 2 ou 3 choses.

    1°/ Quand je mets toute la fonction sha256 dans le formulaire ça fonctionne mais si je la met dans une page et que j'appel SHA256.js ça beug???
    sans doute que tu t'y es mal pris mais tu peux tout aussi bien laisser ton javascript dans la même page.
    Citation Envoyé par hugodu28 Voir le message
    2°/ le brouillage du MDP se fait côté client, le contrôle côté serveur?
    Oui c'est le principe même de notre sujet
    Citation Envoyé par hugodu28 Voir le message
    3°/ Avant de faire la requête, il faut contrôler les données et échapper les caratères spéciaux?
    Il faut utiliser mysql_real_escape_string dans ta requête (ou équivalent si tu utilise mysqli ou pdo)


    Pour ton premier script montré, le principe est ok, juste quelques petites choses pourraient être améliorées.

    Pour ton second script montré (formulaire de test), tu peux tout jeter.

  4. #24
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    wouha tu n'y va pas avec le dos de la cuillère, c'était juste une idée de la méthode.
    Enfin bref voici le code presque finalisé.
    Qu'en penses tu?

    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
     
    <?php
    session_start()
    ?>
    //bizare si je ne sépare pas les deux parties php ça beug
    <?php
    include("config.php");
     
    //Vérification que la page est appelée en POST
    if(!$_SERVER["REQUEST_METHOD"]=="POST"){
    	die("Accès non autorisé");
    }
    $input=$_POST['utilisateur'];
    if(ctype_digit(mysql_real_escape_string($input))){
    	//echo "information valide";
    	$utilisateur= $input;
     
    }else{
    	echo "information non valide";}
    //Vérification entrée login et password
    if(strlen($_POST["utilisateur"])<=0 or strlen($_POST["reponse"])<=0){
    	die("Vous devez entrer un nom d'utilisateur et un mot de passe");
    }
     
    //Le cas échéant, on crée les variables et on hashe le password.
     
    $username = $_POST["utilisateur"];
     
    //test identifiant psword
    $check_credentials_query = $mysql->prepare("SELECT * FROM users WHERE user_name=:username");
    $check_credentials = $check_credentials_query->execute(array( 'username' => $username));
     
    if($check_credentials_query->rowCount() == 1) { 
    //en attente de transformation en requete PDO (lol)
     $db = mysql_connect('localhost', 'root', '');  // 1 
    mysql_select_db('tuto',$db);                    // 2 
    $req = ("SELECT * FROM users WHERE user_name='$username'"); 
    //echo $req;
    $base=mysql_query($req);         // 3 
    $resultadm =(mysql_fetch_assoc($base)); 
                // on affiche les résultats 
     
    $mdp=$resultadm['user_password'];  
     
    $P=($_POST["utilisateur"].$_SESSION["sel"].$mdp);
    $A= hash("sha256",($P));
    if($A==$_POST["reponse"]){
     header('Location: test.php');
    }
    else{
    echo"pas bon";}}
    if($check_credentials_query->rowCount() == 0) {
    	echo "Vérifiez votre identifiant.";}
    ?>

  5. #25
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Oui c'est sur la bonne voie

    Quelques petits trucs :

    Le if(ctype_digit(mysql_real_escape_string($input))) fait très exotique

    Pourquoi mysql_real_escape_string ? Quant'à ctype_digit cela ne laisse passer que des chiffres. Un peu hard pour des prénoms.
    Tu peux filtrer plus large et puis tu blinderas avec une requête préparée.

    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $test_login = filter_input(INPUT_POST, 'utilisateur', FILTER_SANITIZE_STRING);
    // 'utf-8' si on travaille en utf-8 (recommandé)
    if(isset($_POST['reponse'],$test_login))
    {
        if($test_login != false && mb_strlen($test_login,'utf-8') == mb_strlen($_POST['utilisateur'],'utf-8'))
        {
           //ok pour la requête préparée
         }
         else
         {
           // On sait ici que le pseudo est incorrect mais pas la peine de donner des infos précises qui pourraient aider le pirate
           $message = "login ou mot de passe incorrect";
         }
    }
    note : si pdo te pose problème tu peux utiliser mysqli, c'est presque pareil que mysql avec globalement la même puissance que pdo. C'est juste un peu moins pratique si tu veux changer de type de bdd.

  6. #26
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Le if(ctype_digit(mysql_real_escape_string($input))) fait très exotique
    C'est à peu près comme ça que c'est codé partout. Dernierment j'ais acheté un magasine spécialisé "web d...." et c'est pareil.

    Le ctype_digit() c'est parcequ'en fait, l'agent est identifié par son matricule (qui est unique).

    Citation Envoyé par ABCIWEB Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if($test_login != false && mb_strlen($test_login,'utf-8') == mb_strlen($_POST['utilisateur'],'utf-8'))
    Peux tu m'expliquer cette condition, je ne comprends pas "!="

  7. #27
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par hugodu28 Voir le message
    C'est à peu près comme ça que c'est codé partout. Dernierment j'ais acheté un magasine spécialisé "web d...." et c'est pareil.
    Pour ctype_digit (qui vérifie qu'une chaîne est un entier) je veux bien te croire, par contre pour "if(ctype_digit(mysql_real_escape_string($input)))" là soit tu as mal interprété, soit c'est une erreur.
    Remarque c'est pas impossible, je viens de me rendre compte qu'il y avait aussi une erreur dans le code javascript que j'avais recopié depuis selfhtml. Tu as d'ailleurs corrigé avec un "return true;" mais ce n'est pas la meilleure façon de faire (je t'en reparlerai)


    Citation Envoyé par hugodu28 Voir le message
    Peux tu m'expliquer cette condition, je ne comprends pas "!="
    C'était par symétrie avec ton code, pour garder une structure conditionnelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filter_input(INPUT_POST, 'utilisateur', FILTER_SANITIZE_STRING);
    va supprimer les balises. Donc si la longueur de la chaine avant et après traitement est différente c'est qu'il y avait des balises qui n'ont rien à faire dans un identifiant.

    note : quand tu ne comprend pas une fonction, tu rentre son nom dans google et la première ligne de résultat te dirigeras dans + de 99% des cas vers l'explication du manuel php qui est la bible du développeur php.

  8. #28
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Bon allez, comme tu as bosser pas mal, je te donne le script de base complet :

    Code php : 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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    <?php
    header('Content-type: text/html; charset=UTF-8');
     
    if (!session_id()) session_start();	
     
    // Définition de variables par défaut
    $_SESSION["sel"] = isset($_POST['reponse'],$_SESSION["sel"]) ? $_SESSION["sel"] : hash("sha256",(uniqid(rand(), true)));
     
    $message = null;
     
     
     
    // Si l'on est déjà enregistré
    if(isset($_SESSION["login"])) 
    {
    	// Désactivé pour l'exemple. Normalement on fait un header de redirection vers une page souhaitée par ex menu
    	/* 
    		header('Location: menu.php');
    		exit;
    	*/
    }
     
     
     
     
    // Si le formulaire est envoyé						  
    if (isset($_POST['reponse'],$_POST['utilisateur']))
    {
     
    	// ici test sur une bdd en local
    	$hostname = "localhost";
    	$database = "mabase";
    	$username = "root";
    	$password = "";
     
    	 // Connexion à la base
    	$connection = mysqli_connect($hostname, $username, $password,$database);
     
     
    	// Sélection du mot de passe correspondant au login (structure pour requête préparée)
    	$query = "SELECT pass, pseudo  FROM membres WHERE pseudo = ?";
     
    	// Préparation de la requête
    	if($stmt = mysqli_prepare($connection, $query)) 
    	{
    		// On lie la variable en indiquant que c'est une chaine de caractères
    		mysqli_stmt_bind_param($stmt,"s",$login);
     
    		$login = filter_input(INPUT_POST, 'utilisateur', FILTER_SANITIZE_STRING);
     
    		// On exécute la requête
    		mysqli_stmt_execute($stmt);
     
    		// Stockage du résultat pour utiliser mysqli_stmt_num_rows dans les meilleures conditions
    		mysqli_stmt_store_result($stmt);	
     
    		// Tant qu'on y est on bind (associe) aussi le résultat
    		mysqli_stmt_bind_result($stmt, $motdepasse, $identifiant);
     
    		// On compte le résultat
    		$nb_res = mysqli_stmt_num_rows($stmt);
     
    		if($nb_res > 0)
    			{
    				if($nb_res == 1)
    				{
    					// Récupération des valeurs. Normalement on fait un while mais ici il n'y a qu'un résultat...
    					mysqli_stmt_fetch($stmt);
     
    					// $motdepasse et $identifiant sont les valeurs définies par mysqli_stmt_bind_result
    					$mpd = $motdepasse;
    					$login = $identifiant;
     
    					// Contrôle devant correspondre à la méthode de hashage javascript
    					$chaine = $login.$_SESSION["sel"].$mpd;
    					$hash = hash("sha256",$chaine);
     
    					if ($hash == $_POST['reponse'])
    					{
    						// On redémarre une autre session et l'on efface la précédente par sécurité (à faire uniquement si l'éventuelle session en cours peut être effacée).
    						session_regenerate_id(true);
    						$_SESSION = array();
     
    						$message = "Vous êtes maintenant connecté";
     
    						// déclaration de l'identifiant de session (on attribue souvent le login)
    						$_SESSION["login"] = 1;	
     
    						// Désactivé pour l'exemple. Normalement on fait un header de redirection vers une page souhaitée par ex menu
    						/* 
    							header('Location: menu.php');
    							exit;
    						*/	
    					}
    					else
    					{
    						// On sait ici que c'est le mot de passe qui est incorrect mais pas la peine de donner des infos précises qui pourraient aider le pirate
    						$message = "login ou mot de passe incorrect";
    					}
    				}
    				else if($nb_res > 1) 
    				{
    					$message = "Il existe plus d'un utilisateur ayant ce même login (pb dans la conception de la base de donnée, login devrait être unique)";
    				}
    			}
    			else 
    			{ 
    				// On sait ici que c'est le pseudo qui est incorrect mais pas la peine de donner des infos précises qui pourraient aider le pirate
    				$message = "login ou mot de passe incorrect";
    			}
     
    		// Libère le résultat 
        	        mysqli_stmt_free_result($stmt);
     
    		// Fermeture du traitement 
       		mysqli_stmt_close($stmt);
    	}
    	else 
    	{
    		$message = 'problème dans la requête';
    	}
     
    	// On régénère le sel
    	$_SESSION["sel"] = hash("sha256",(uniqid(rand(), true)));
    }
    ?>
    <!DOCTYPE html>
    <html lang="fr">
     
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
     
    <title>Identification avec mot de passe hashé et grain de sel aléatoire</title>
     
     
    <script type="text/javascript">
    <!--
    function SHA256(s){
     
    	var chrsz   = 8;
    	var hexcase = 0;
     
    	function safe_add (x, y) {
    		var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    		var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    		return (msw << 16) | (lsw & 0xFFFF);
    	}
     
    	function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
    	function R (X, n) { return ( X >>> n ); }
    	function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
    	function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
    	function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
    	function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
    	function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
    	function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }
     
    	function core_sha256 (m, l) {
    		var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
    		var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
    		var W = new Array(64);
    		var a, b, c, d, e, f, g, h, i, j;
    		var T1, T2;
     
    		m[l >> 5] |= 0x80 << (24 - l % 32);
    		m[((l + 64 >> 9) << 4) + 15] = l;
     
    		for ( var i = 0; i<m.length; i+=16 ) {
    			a = HASH[0];
    			b = HASH[1];
    			c = HASH[2];
    			d = HASH[3];
    			e = HASH[4];
    			f = HASH[5];
    			g = HASH[6];
    			h = HASH[7];
     
    			for ( var j = 0; j<64; j++) {
    				if (j < 16) W[j] = m[j + i];
    				else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
     
    				T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
    				T2 = safe_add(Sigma0256(a), Maj(a, b, c));
     
    				h = g;
    				g = f;
    				f = e;
    				e = safe_add(d, T1);
    				d = c;
    				c = b;
    				b = a;
    				a = safe_add(T1, T2);
    			}
     
    			HASH[0] = safe_add(a, HASH[0]);
    			HASH[1] = safe_add(b, HASH[1]);
    			HASH[2] = safe_add(c, HASH[2]);
    			HASH[3] = safe_add(d, HASH[3]);
    			HASH[4] = safe_add(e, HASH[4]);
    			HASH[5] = safe_add(f, HASH[5]);
    			HASH[6] = safe_add(g, HASH[6]);
    			HASH[7] = safe_add(h, HASH[7]);
    		}
    		return HASH;
    	}
     
    	function str2binb (str) {
    		var bin = Array();
    		var mask = (1 << chrsz) - 1;
    		for(var i = 0; i < str.length * chrsz; i += chrsz) {
    			bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
    		}
    		return bin;
    	}
     
    	function Utf8Encode(string) {
    		string = string.replace(/\r\n/g,"\n");
    		var utftext = "";
     
    		for (var n = 0; n < string.length; n++) {
     
    			var c = string.charCodeAt(n);
     
    			if (c < 128) {
    				utftext += String.fromCharCode(c);
    			}
    			else if((c > 127) && (c < 2048)) {
    				utftext += String.fromCharCode((c >> 6) | 192);
    				utftext += String.fromCharCode((c & 63) | 128);
    			}
    			else {
    				utftext += String.fromCharCode((c >> 12) | 224);
    				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
    				utftext += String.fromCharCode((c & 63) | 128);
    			}
     
    		}
     
    		return utftext;
    	}
     
    	function binb2hex (binarray) {
    		var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    		var str = "";
    		for(var i = 0; i < binarray.length * 4; i++) {
    			str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
    			hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
    		}
    		return str;
    	}
     
    	s = Utf8Encode(s);
    	return binb2hex(core_sha256(str2binb(s), s.length * chrsz));
    }
    // -->
    </script>
     
     
    <script language="javascript">
    <!--
      function doChallengeResponse(form) {
     
        var str = form.utilisateur.value+'<?php echo $_SESSION["sel"]?>'+form.mot_de_passe.value;
        form.reponse.value = SHA256(str);
        form.mot_de_passe.value = "";
     
    	// 64 correspond à la longueur d'un sha 256 (condition à modifier si l'on change d'encodage)
    	if (form.mot_de_passe.value == '' && form.reponse.value.length == 64)
    	{
    		form.submit();
    	} 
    	else return false;	
     
      }
    // -->
    </script>
     
    </head>
     
    <body>
        <div> 
            <form name="identification" method="post" action="#">
                <p>
                    Utilisateur:
                    <input type="text" name="utilisateur" size="32" maxlength="32"><br>
                    Mot de passe:
                    <input type="password" name="mot_de_passe" size="32" maxlength="32"><br>
                    <input onclick="doChallengeResponse(this.form); return false;" type="button" value="identification">
                    <input type="hidden" name="reponse"  value="">
               </p>
            </form>
     
            <p>
            <?php if(isset($message)) echo $message;?>
            </p>
     
            <noscript>
            Vous devez activer javascript pour la connexion.
            </noscript>
        </div> 
    </body>
    </html>

    Tu n'as plus qu'à adapter les identifiants de connexion de ta base et la requête $query et ça roule

    Bon là le code javascript suppose que le mot de passe soit enregistré en clair dans ta bdd, ce qui n'est pas très recommandé.
    Si les mots de passe sont hashés en sha256 dans ta bdd il te suffira de remplacer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var str = form.utilisateur.value+'<?php echo $_SESSION["sel"]?>'+form.mot_de_passe.value;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var str = form.utilisateur.value+'<?php echo $_SESSION["sel"]?>'+SHA256(form.mot_de_passe.value);
    Edit : et ne remplace pas "return false" par "return true" à la ligne onclick="doChallengeResponse(this.form); return false;"
    Tu l'avais fait dans ton précédent code car le code javascript initial était incomplet et ne pouvait pas fonctionner tel quel mais c'est réparé

  9. #29
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    Super, bon bien ce soir je me coucherai moins bête.

    Merci à tous pour votre aide précieuse.
    Comme conseillé je vais hasher les mdp dans la bdd

    En ce qui concerne la requête en mysqli c'est sympa mais j'ai réussi à me dépatouiller en PDO.

    Je ne connaissais pas la fonction bind()
    (en fait je connais pas les fonctions évoluées car je ne suis que pompier )

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Fonction de hashage (Wong)
    Par Marwabch dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 18/06/2015, 14h32
  2. Tutoriel Guava, partie 8 : fonctions de hashage et I/O
    Par thierryler dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 06/03/2014, 21h17
  3. Fonction de hashage tel que MD5
    Par bebemyouler dans le forum MATLAB
    Réponses: 1
    Dernier message: 04/07/2013, 18h38
  4. Fonction de hashage SHA-1 en VBScript
    Par gderenne dans le forum ASP
    Réponses: 1
    Dernier message: 25/07/2007, 19h06

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