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 :

Vérifier l'identification par une clé secrète (en SHA-256 hash) [PHP 5.5]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut Vérifier l'identification par une clé secrète (en SHA-256 hash)
    Comment peut-on limiter à recevoir des données par mon webservice ?

    En fait, j'ai un webservice et je veux que seulement les utilisateurs qui ont une clé puissent envoyer les données ?

    Par exemple, je donne à un utilisateur une clé (SHA-256 hash) :
    1c3b1d8197bc20ccc11e391cabd2c7576fe1b4aeb6e0d3607ddf22725164faa9

    qui correspond :
    "ma cle tres secrète pour je porte mes converses tu l as cru patate crue"

    ensuite, il me l'envoie par le web service :
    par exemple :

    $url = 'http://127.0.0.42/api/lookup/1c3b1d8197bc20ccc11e391cabd2c7576fe1b4aeb6e0d3607ddf22725164faa9/donnesdata/

    Comment puis-je vérifier si je peux traiter les données de cette utilisatrice qui a la bonne clé (ou non) ?

    Voici j'ai fait 2 solutions :
    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
    $cleVenu = '1c3b1d8197bc20ccc11e391cabd2c7576fe1b4aeb6e0d3607ddf22725164faa9';
    $parole = 'ma cle tres secrete pour je porte mes converses tu l as cru patate crue';
     
     
    //SHA-256 hash -- > sha256
    $cleHash =  hash_hmac('sha256', $parole, 'secret');
     
     
    echo '<h1>1ere solution</h1>';
     
    if ($cleHash === $cleVenu)
    {
    	echo '<p>bonne clé</p>';
    	// donc: on traite les informations reçues
    }
    else
    {
    	echo '<p>mauvaise clé</p>';
    	//On ne traite pas cette demande
    }
     
     
    echo '<h1>2e solution</h1>';
    function comparer_2cle_hache($cle1er, $cleOrigine) { 
     
    	$longeur = strlen($cle1er); 
    	if ($longeur !== strlen($cleOrigine)) { 
    		return false; 
    	} 
     
    	//comparer le code ASCII 
    	$status = 0; 
    	for ($i = 0; $i < $longeur; $i++) { 
    		$status |= ord($cle1er[$i]) ^ ord($cleOrigine[$i]); 
    	} 
    	return $status === 0;
     
    	if (!is_string($cle1er) || !is_string($cleOrigine)) { 
    		return false; 
    	} 
    }
     
    if (comparer_2cle_hache($cleVenu,hash_hmac('sha256', $parole, 'secret')))
    {
    	echo '<p>bonne clé par 2e</p>';
    	// alors: on traite les informations reçues
    }
    else
    {
    	echo '<p>mauvaise clé</p>';
    	//(die('désolé)
    }
    Est-ce que vous en avez une autre plus performante?
    Sinon, Quelle solution est meilleure parmi les miennes ?


    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    N'utilise pas un opérateur de comparaison (===) ou une fonction "maison" (ta fonction comparer_2cle_hache()) pour comparer un hash. Il faut utiliser hash_equals, qui te protège contre les timing attacks. Autrement, un hostile suffisamment patient peut trouver la valeur du hash rien qu'en mesurant le temps qu'il faut à ton serveur pour rejeter un hash incorrect.

  3. #3
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Bonjour Tsilefy,
    La version de mon PHP c'est 5.5.11 qui n'a pas cette fonction.
    Par contre, dans ton lien, j'ai trouvé cela :
    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
    $cleVenu = '1c3b1d8197bc20ccc11e391cabd2c7576fe1b4aeb6e0d3607ddf22725164faa9';
    $parole = 'ma cle tres secrete pour je porte mes converses tu l as cru patate crue';
     
     
    //SHA-256 hash -- > sha256
    $cleHash =  hash_hmac('sha256', $parole, 'secret');
     
     
    if(!function_exists('hash_equals')) {
        function hash_equals($known_string, $user_string) {
            $ret = 0;
     
            if (strlen($known_string) !== strlen($user_string)) {
                $user_string = $known_string;
                $ret = 1;
            }
     
            $res = $known_string ^ $user_string;
     
            for ($i = strlen($res) - 1; $i >= 0; --$i) {
                $ret |= ord($res[$i]);
            }
     
            return !$ret;
        }
    }
     
     
    if (hash_equals($cleVenu,hash_hmac('sha256', $parole, 'secret')))
    {
    	echo '<p>bonne clé par 3e</p>';
    	// alors: on traite les informations reçues
    }
    else
    {
    	echo '<p>mauvaise clé</p>';
    	//(die('désolé)
    }
    Donc je vais l'utiliser...
    Par contre, est-ce qu'il y a une autre solution ?
    En fait, dans ma solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $parole = 'ma cle tres secrete pour je porte mes converses tu l as cru patate crue';
    $cleHash =  hash_hmac('sha256', $parole, 'secret');
    On le voit deux clés : hachée et non hachée dans le même fichier.
    Mais je ne pense pas qu'il peut avoir de problème.
    Puisque le client a seulement la clé hachée et n'a pas d"accès à mon fichier ni à notre serveur et il peut envoyer, à mon webservice, les données avec seulement cette clé s’il la connait...
    Merci et bonne journée

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Cette fonction me semble même meilleure que la fonction native, car même une différence de longueur ne "fuit" pas dans cette fonction. Après, je ne suis pas un expert en crypto...

    Quant à l'autre fichier, ça ne pose pas de problème. Si tu as plusieurs utilisateurs, tu peux même éviter la génération de la clé en clair. Tu peux directement générer une clé aléatoire par utilisateur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Moyen de vérifier quelles feuilles sont liées par une formule
    Par makaveli21 dans le forum Excel
    Réponses: 2
    Dernier message: 30/01/2014, 15h58
  2. Identification par URL possible dans une newsletter ?
    Par Apl147 dans le forum E-Mailing
    Réponses: 4
    Dernier message: 19/02/2013, 17h23
  3. vérifier la signature d'une dll par reflection
    Par giova_fr dans le forum C#
    Réponses: 9
    Dernier message: 27/06/2011, 01h00
  4. Réponses: 6
    Dernier message: 09/04/2007, 17h53

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