<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'Hachage de mots de passe',
    2 => 'Hachage des mots de passe de mani&egrave;re s&ucirc;re et s&eacute;curis&eacute;e',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.using.php',
    1 => 'Utiliser PHP',
  ),
  'next' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP et HTML',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'faq/passwords.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.passwords" class="chapter">
 <h1 class="title">Hachage des mots de passe de manière sûre et sécurisée</h1>

 
 
 <p class="simpara">
  Cette section explique les raisons d&#039;utiliser des fonctions de hachage pour les
  mots de passe, ainsi que la façon de le faire efficacement.
 </p>
 
 <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.passwords.hashing">
    
     Pourquoi devrais-je hacher les mots de passe envoy&eacute;s par les utilisateurs de mon application ?
    
   </a></li><li><a href="#faq.passwords.fasthash">
    
     Pourquoi les fonctions traditionnelles de hachage comme md5 et
     sha1 sont-elles inappropri&eacute;es aux mots de passe ?
    
   </a></li><li><a href="#faq.passwords.bestpractice">
    
     Comment les mots de passe doivent-ils &ecirc;tre hach&eacute;s, si les fonctions de hachage
     courantes ne sont pas adapt&eacute;es ?
    
   </a></li><li><a href="#faq.passwords.salt">
    
     Qu&#039;est-ce que le grain de sel ?
    
   </a></li><li><a href="#faq.password.storing-salts">
     
      Comment sont stock&eacute;s les salts ?
     
    </a></li></ol></div>
  <dl class="qandaentry" id="faq.passwords.hashing">
   <dt><strong>
    <p class="simpara">
     Pourquoi devrais-je hacher les mots de passe envoyés par les utilisateurs de mon application ?
    </p>
   </strong></dt>
   <dd class="answer">
    <p class="simpara">
     Le hachage des mots de passe est l&#039;une des considérations de sécurité les plus
     élémentaires qui doivent être prises lors de la conception de toute application ou service
     qui accepte des mots de passe des utilisateurs. Sans hachage, tout mot de passe
     stocké peut être volé si le stockage de données est compromis, et
     être immédiatement utilisé pour compromettre non seulement l&#039;application ou le
     service, mais aussi les comptes des utilisateurs sur d&#039;autres services,
     s&#039;ils n&#039;utilisent pas des mots de passe uniques.
    </p>
    <p class="simpara">
     En appliquant un algorithme de hachage sur les mots de passe avant de les stocker,
     la découverte du mot de passe original devient improbable pour un attaquant,
     tout en conservant la possibilité de comparer le hachage résultant avec le mot de passe
     original ultérieurement.
    </p>
    <p class="simpara">
     Il est important de noter que le hachage ne fait que protéger les mots de passe
     dans la base, pas leur éventuelle interception alors qu&#039;ils sont envoyés à
     l&#039;application par l&#039;utilisateur, via du code malveillant injecté dans l&#039;application,
     par exemple.
    </p>
   </dd>
  </dl>
  <dl class="qandaentry" id="faq.passwords.fasthash">
   <dt><strong>
    <p class="simpara">
     Pourquoi les fonctions traditionnelles de hachage comme <span class="function"><a href="function.md5.php" class="function">md5()</a></span> et
     <span class="function"><a href="function.sha1.php" class="function">sha1()</a></span> sont-elles inappropriées aux mots de passe ?
    </p>
   </strong></dt>
   <dd class="answer">
    <p class="simpara">
     Les algorithmes de hachage comme MD5, SHA1 et SHA256 sont destinés à être rapides et
     efficaces. Avec les équipements informatiques modernes, il est devenu facile d&#039;attaquer
     par force brute la sortie de ces algorithmes pour retrouver la chaîne originale.
    </p>
    <p class="simpara">
     En raison de la rapidité avec laquelle un ordinateur moderne peut inverser
     ces algorithmes de hachage, de nombreux experts en sécurité les déconseillent
     fortement pour le hachage de mots de passe.
    </p>
   </dd>
  </dl>
  <dl class="qandaentry" id="faq.passwords.bestpractice">
   <dt><strong>
    <p class="simpara">
     Comment les mots de passe doivent-ils être hachés, si les fonctions de hachage
     courantes ne sont pas adaptées ?
    </p>
   </strong></dt>
   <dd class="answer">
    <p class="simpara">
     Lorsqu&#039;on hache des mots de passe, les deux considérations les plus importantes sont le temps
     de traitement, et le grain de sel. Plus la puissance de traitement requise est élevée, plus
     il faudra du temps pour casser le mot de passe en analysant sa sortie.
    </p>
    <p class="simpara">
     PHP fournit <a href="book.password.php" class="link">une API native de hachage de mot
     de passe</a> qui gère à la fois le
     <a href="function.password-hash.php" class="link">hachage</a> et la
     <a href="function.password-verify.php" class="link">vérification de mots de passe</a>,
     le tout, de manière totalement sécurisée.
    </p>
    <p class="simpara">
     L&#039;algorithme suggéré à utiliser pour le hachage de mots de passe est
     Blowfish, qui est aussi l&#039;algorithme par défaut de l&#039;API de hachage de mots
     de passe, sachant qu&#039;il est significativement plus gourmand en calcul que
     MD5 ou SHA1, mais plus évolutif.
    </p>
    <p class="simpara">
      La fonction <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> est également disponible pour le hachage des mots de passe,
      mais elle n&#039;est recommandée que pour l&#039;interopérabilité avec d&#039;autres
      systèmes.
      Il est plutôt fortement conseillé d&#039;utiliser l&#039;
      <a href="book.password.php" class="link">API native de hachage des mots de passe</a>
      dès que possible.
     </p>
   </dd>
  </dl>
  <dl class="qandaentry" id="faq.passwords.salt">
   <dt><strong>
    <p class="simpara">
     Qu&#039;est-ce que le grain de sel ?
    </p>
   </strong></dt>
   <dd class="answer">
    <p class="simpara">
     Un grain de sel, ou &quot;salt&quot;, en cryptographie, est appliqué durant le processus de hachage pour
     éliminer la possibilité que le résultat puisse être recherché
     dans une liste de paires pré-calculées de hachages et leur entrée,
     connue sous le nom de &quot;rainbow table&quot;.
    </p>
    <p class="simpara">
     En termes plus simples, un sel est une donnée supplémentaire qui rend
     les hachages beaucoup plus difficiles à casser. Il existe plusieurs
     services en ligne qui fournissent des listes étendues de hachages pré-calculés, ainsi
     que l&#039;entrée d&#039;origine de ces hachages. L&#039;utilisation d&#039;un sel rend
     improbable ou impossible de trouver le hachage correspondant dans l&#039;une de ces listes.
    </p>
    <p class="simpara">
     <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> va créer un salt aléatoire si aucun n&#039;est fourni,
     et c&#039;est généralement la façon la plus sécurisée et la plus simple.
    </p>
   </dd>
  </dl>
   <dl class="qandaentry" id="faq.password.storing-salts">
    <dt><strong>
     <p class="simpara">
      Comment sont stockés les salts ?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Lors de l&#039;utilisation de la fonction <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> ou
      de la fonction <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span>, la valeur retournée inclut le salt
      comme partie du hash généré. Cette valeur devrait être stockée telle quelle
      dans la base de données, sachant qu&#039;elle inclut les informations sur
      la fonction de hachage utilisée et peut donc être fournie directement à
      la fonction <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> lors de la vérification des mots de passe.
     </p>
     <div class="warning"><strong class="warning">Avertissement</strong>
      <p class="simpara">
       <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> devrait toujours être utilisé au lieu de
       rehacher et comparer le résultat à un hachage stocké afin d&#039;éviter
       les attaques par chronométrage.
      </p>
     </div>
     <p class="simpara">
      Le diagramme suivant montre le format d&#039;une valeur retournée
      de la fonction <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> ou <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span>.
      Comme on peut le voir, tout est présent, comme toutes les informations
      sur l&#039;algorithme et le salt nécessaires pour une future vérification
      de mots de passe.
     </p>
     <p class="para">
      <div class="mediaobject">
       
       <div class="imageobject">
        <img src="images/2a34c7f2e658f6ae74f3869f2aa5886f-crypt-text-rendered.svg" alt="
        Les composants de la valeur retournée par la fonction password_hash et crypt :
        dans l'ordre, l'algorithme choisi, les options de l'algorithme, le salt utilisé,
        et le mot de passe haché.
       " width="690" height="192" />
       </div>
      </div>
     </p>
    </dd>
   </dl>
  
  
 </div>
<?php manual_footer($setup); ?>