<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.password.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'function.password-hash.php',
    1 => 'password_hash',
    2 => 'Cr&eacute;e une cl&eacute; de hachage pour un mot de passe',
  ),
  'up' => 
  array (
    0 => 'ref.password.php',
    1 => 'Fonctions de hachage de mot de passe',
  ),
  'prev' => 
  array (
    0 => 'function.password-get-info.php',
    1 => 'password_get_info',
  ),
  'next' => 
  array (
    0 => 'function.password-needs-rehash.php',
    1 => 'password_needs_rehash',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/password/functions/password-hash.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.password-hash" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">password_hash</h1>
  <p class="verinfo">(PHP 5 &gt;= 5.5.0, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">password_hash</span> &mdash; <span class="dc-title">Crée une clé de hachage pour un mot de passe</span></p>

 </div>
 
 <div class="refsect1 description" id="refsect1-function.password-hash-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>password_hash</strong></span>(<span class="methodparam"><span class="attribute"><a href="class.sensitiveparameter.php">#[\SensitiveParameter]</a> </span><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$password</code></span>, <span class="methodparam"><span class="type"><span class="type"><a href="language.types.string.php" class="type string">string</a></span>|<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.null.php" class="type null">null</a></span></span> <code class="parameter">$algo</code></span>, <span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$options</code><span class="initializer"> = []</span></span>): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>

  <p class="para rdfs-comment">
   La fonction <span class="function"><strong>password_hash()</strong></span> crée un nouveau
   hachage en utilisant un algorithme de hachage fort et irréversible.
  </p>
  <p class="simpara">
   Les algorithmes suivants sont actuellement supportés :
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-default">PASSWORD_DEFAULT</a></code></strong> - Utilisation de l&#039;algorithme bcrypt (par défaut depuis
      PHP 5.5.0). Il est à noter que cette constante est conçue pour changer dans le temps, au fur et à mesure
      que des algorithmes plus récents et plus forts sont ajoutés à PHP. Pour cette raison, la longueur
      du résultat issu de cet algorithme peut changer dans le temps, il est donc recommandé de stocker
      le résultat dans une colonne de la base de données qui peut contenir au moins 60 caractères
      (255 octets peut être un très bon choix).
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong> - Utilisation de l&#039;algorithme bcrypt
      pour créer la clé de hachage. Ceci va créer une clé de hachage standard <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span>
      utilisant l&#039;identifiant <code class="literal">$2y$</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong> - Utilise l&#039;algorithme de hachage Argon2i pour créer le hachage.
      Cet algorithme est seulement disponible si PHP a été compilé avec le support d&#039;Argon2
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong> - Utilise l&#039;algorithme de hachage Argon2id pour créer le hachage.
      Cet algorithme est seulement disponible si PHP a été compilé avec le support d&#039;Argon2
     </span>
    </li>
   </ul>
  </p>
  <p class="simpara">
   Options supportées pour <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong>:
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      <code class="literal">salt</code> - pour fournir manuellement un salt à utiliser lors du hachage du
      mot de passe. Il est à noter que cette option empêchera la génération automatique.
     </p>
     <p class="para">
      Si omis, un salt aléatoire sera généré par la fonction <span class="function"><strong>password_hash()</strong></span>
      pour chaque mot de passe haché. C&#039;est le mode de fonctionnement prévu.
     </p>
     <div class="warning"><strong class="warning">Avertissement</strong>
      <p class="para">
       L&#039;option Salt est obsolète. Il est préférable d&#039;utiliser simplement
       le sel qui est généré par défaut.
       À partir de PHP 8.0.0, un sel explicitement fourni est ignoré.
      </p>
       </div>
      </li>
      <li class="listitem">
       <p class="para">
        <code class="literal">cost</code> - détermine le coût algorithmique qui doit être utilisé.
        Des exemples de ces valeurs peuvent être trouvés sur la page de la documentation
        de la fonction <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span>.
       </p>
       <p class="para">
        Si omis, la valeur par défaut <code class="literal">12</code> sera utilisée. C&#039;est un bon compromis,
        mais cela doit être ajusté en fonction du matériel utilisé.
       </p>
      </li>
   </ul>
  </p>
  
  <p class="simpara">
   Options supportées pour <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong> et <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong> :
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      <code class="literal">memory_cost</code> (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) - Mémoire maximale 
      (en kibioctets) pouvant être utilisée pour calculer le hachage Argon2. Par
      défaut à <strong><code><a href="password.constants.php#constant.password-argon2-default-memory-cost">PASSWORD_ARGON2_DEFAULT_MEMORY_COST</a></code></strong>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">time_cost</code> (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) - Durée maximale de 
      temps qu&#039;il peut prendre pour calculer le hachage Argon2. Par 
      défaut à <strong><code><a href="password.constants.php#constant.password-argon2-default-time-cost">PASSWORD_ARGON2_DEFAULT_TIME_COST</a></code></strong>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">threads</code> (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) - Nombre de threads à 
      utiliser pour calculer le hachage Argon2. Par défaut à <strong><code><a href="password.constants.php#constant.password-argon2-default-threads">PASSWORD_ARGON2_DEFAULT_THREADS</a></code></strong>.
     </p>
     <div class="warning"><strong class="warning">Avertissement</strong>
      <p class="para">
       Uniquement disponible quand PHP utilise libargon2,
       et non l&#039;implémentation libsodium.
      </p>
     </div>
    </li>
   </ul>
  </p>
 </div>

 
 <div class="refsect1 parameters" id="refsect1-function.password-hash-parameters">
  <h3 class="title">Liste de paramètres</h3>
  <dl>
   
    <dt><code class="parameter">password</code></dt>
    <dd>
     <p class="para">
      Le mot de passe utilisateur.
     </p>
     <div class="caution"><strong class="caution">Attention</strong>
      <p class="para">
       L&#039;utilisation de la constante <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong>
       pour l&#039;algorithme fera que le paramètre
       <code class="parameter">password</code> sera tronqué à une longueur maximale de
       72 octets.
      </p>
     </div>
    </dd>
   
   
    <dt><code class="parameter">algo</code></dt>
    <dd>
     <p class="para">
      Une <a href="password.constants.php" class="link">constantes de l&#039;algorithme
de mot de passe</a> représentant l&#039;algorithme à utiliser lors du hachage du mot de passe.
     </p>
    </dd>
   
   
    <dt><code class="parameter">options</code></dt>
    <dd>
     <p class="para">
      Un tableau associatif contenant les options.
 Voir aussi <a href="password.constants.php" class="link">les constantes de l&#039;algorithme de mot de passe</a>
 pour une documentation sur les options supportées pour chaque algorithme.
     </p>
    </dd>
   
  </dl>
 </div>

 
 <div class="refsect1 returnvalues" id="refsect1-function.password-hash-returnvalues">
  <h3 class="title">Valeurs de retour</h3>
  <p class="para">
   Retourne le mot de passe haché.
  </p>
  <p class="para">
   L&#039;algorithme utilisé, le coût et le salt sont contenus dans le hachage retourné.
   Aussi, toutes les informations utiles pour vérifier ce dernier y sont incluses.
   Ceci permet à la fonction <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> de vérifier le
   hachage sans avoir besoin de stocker séparément ces informations.
  </p>
 </div>

 
 <div class="refsect1 changelog" id="refsect1-function.password-hash-changelog">
  <h3 class="title">Historique</h3>
  <p class="para">
   <table class="doctable informaltable">
    
     <thead>
      <tr>
       <th>Version</th>
       <th>Description</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
        <td>8.4.0</td>
        <td>
         La valeur par défaut de l&#039;option <code class="literal">cost</code> de
         l&#039;algorithme <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong> a été augmentée de
         <code class="literal">10</code> à <code class="literal">12</code>.
        </td>
      </tr>

      <tr>
       <td>8.3.0</td>
       <td>
        <span class="function"><strong>password_hash()</strong></span> associe désormais l&#039;exception
        <span class="exceptionname"><a href="class.random-randomexception.php" class="exceptionname">Random\RandomException</a></span> sous-jacente à
        <span class="property"><a href="class.exception.php#exception.props.previous">Exception::$previous</a></span> lorsqu&#039;une
        <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> est levée en raison d&#039;un échec
        de la génération du sel.
       </td>
      </tr>

      <tr>
       <td>8.0.0</td>
       <td>
        <span class="function"><strong>password_hash()</strong></span> ne retourne plus <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en cas d&#039;échec, une
        <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> sera levée si l&#039;algorithme de hachage
        de mot de passe n&#039;est pas valide, ou une <span class="classname"><a href="class.error.php" class="classname">Error</a></span> si le hachage
        de mot de passe a échoué pour une raison inconnue.
       </td>
      </tr>

      <tr>
       <td>8.0.0</td>
       <td>
        <code class="parameter">algo</code> est désormais nullable.
       </td>
      </tr>

      <tr>
       <td>7.4.0</td>
       <td>
        Le paramètre <code class="parameter">algo</code> attend désormais une <a href="language.types.string.php" class="link">chaîne de caractères</a>, mais
        continue d&#039;accepter un <a href="language.types.integer.php" class="link">entier</a> afin de conserver une compatibilité antérieure.
       </td>
      </tr>

      <tr>
       <td>7.4.0</td>
       <td>
        L&#039;extension sodium fournit une implémentation alternative pour les
        mots de passe Argon2.
       </td>
      </tr>

      <tr>
       <td>7.3.0</td>
       <td>
        Ajout de la prise en charge des mots de passe Argon2id à l&#039;aide de <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong>.
       </td>
      </tr>

      <tr>
       <td>7.2.0</td>
       <td>
        Ajout de la prise en charge des mots de passe Argon2i à l&#039;aide de <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong>.
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>
 </div>

 
 <div class="refsect1 examples" id="refsect1-function.password-hash-examples">
  <h3 class="title">Exemples</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Exemple #1 Exemple avec <span class="function"><strong>password_hash()</strong></span></strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"rasmuslerdorf"</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_DEFAULT</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">$2y$12$4Umg0rCJwMswRw/l.SwHvuQV01coP0eWmGzd61QH2RvAOMANUBGC.</pre>
</div>
    </div>
   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Exemple #2 Exemple avec <span class="function"><strong>password_hash()</strong></span> en définissant manuellement l&#039;option cost</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$options </span><span style="color: #007700">= [<br />     </span><span style="color: #FF8000">// Augmente le coût de bcrypt de 12 à 13.<br />    </span><span style="color: #DD0000">'cost' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">13</span><span style="color: #007700">,<br />];<br />echo </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"rasmuslerdorf"</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_BCRYPT</span><span style="color: #007700">, </span><span style="color: #0000BB">$options</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">$2y$13$xeDfQumlmdm0Sco.4qmH1OGfUUmOcuRmfae0dPJhjX1Bq0yYhqbNi</pre>
</div>
    </div>
   </div>
  </p>
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Exemple #3 Exemple avec <span class="function"><strong>password_hash()</strong></span> pour trouver un bon coût</strong></p>
    <div class="example-contents"><p>
     Ce code effectuera un benchmark de la machine afin de déterminer le coût maximal
     pouvant être utilisé sans dégrader l&#039;expérience utilisateur. Il est recommandé
     de choisir le coût le plus élevé possible sans ralentir les autres opérations
     que la machine doit exécuter. 11 constitue une bonne base, et une valeur plus
     élevée est préférable si la machine est suffisamment rapide. Le code ci-dessous
     vise un temps d&#039;étirement ≤ 350 millisecondes, ce qui représente un délai adapté
     aux systèmes gérant des connexions interactives.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$timeTarget </span><span style="color: #007700">= </span><span style="color: #0000BB">0.350</span><span style="color: #007700">; </span><span style="color: #FF8000">// 350 millisecondes<br /><br /></span><span style="color: #0000BB">$cost </span><span style="color: #007700">= </span><span style="color: #0000BB">11</span><span style="color: #007700">;<br />do {<br />    </span><span style="color: #0000BB">$cost</span><span style="color: #007700">++;<br />    </span><span style="color: #0000BB">$start </span><span style="color: #007700">= </span><span style="color: #0000BB">microtime</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #DD0000">"test"</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_BCRYPT</span><span style="color: #007700">, [</span><span style="color: #DD0000">"cost" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$cost</span><span style="color: #007700">]);<br />    </span><span style="color: #0000BB">$end </span><span style="color: #007700">= </span><span style="color: #0000BB">microtime</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />} while ((</span><span style="color: #0000BB">$end </span><span style="color: #007700">- </span><span style="color: #0000BB">$start</span><span style="color: #007700">) &lt; </span><span style="color: #0000BB">$timeTarget</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"Valeur de 'cost' la plus appropriée : " </span><span style="color: #007700">. </span><span style="color: #0000BB">$cost </span><span style="color: #007700">- </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">Valeur de &#039;cost&#039; la plus appropriée : 13</pre>
</div>
    </div>
   </div>
  </p>
  
  <p class="para">
   <div class="example" id="example-4">
    <p><strong>Exemple #4 Exemple avec <span class="function"><strong>password_hash()</strong></span> et Argon2i</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Argon2i hash: ' </span><span style="color: #007700">. </span><span style="color: #0000BB">password_hash</span><span style="color: #007700">(</span><span style="color: #DD0000">'rasmuslerdorf'</span><span style="color: #007700">, </span><span style="color: #0000BB">PASSWORD_ARGON2I</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0</pre>
</div>
    </div>
   </div>
  </p>
 </div>

 
 <div class="refsect1 notes" id="refsect1-function.password-hash-notes">
  <h3 class="title">Notes</h3>
  <div class="caution"><strong class="caution">Attention</strong>
   <p class="para">
    Il est fortement recommandé de ne pas fournir de sel explicite pour cette fonction.
    Un sel sécurisé sera automatiquement généré si aucun sel n&#039;est spécifié.
   </p>
   
   <p class="para">
    Comme mentionné ci-dessus, l&#039;utilisation de l&#039;option <code class="literal">salt</code> à partir de PHP 7.0.0
    générera un avertissement de dépréciation. La prise en charge d&#039;un sel explicite a été supprimée
    à partir de PHP 8.0.0.
   </p>
  </div>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Il est recommandé de tester cette fonction sur la machine utilisée et d&#039;ajuster le(s) paramètre(s)
    de coût afin que l&#039;exécution de la fonction prenne moins de 350 millisecondes pour les connexions
    interactives. Le script de l&#039;exemple ci-dessus aidera à choisir un coût bcrypt adapté à la machine donnée.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <span class="simpara">
    La mise à jour des algorithmes supportés par cette fonction (ou le changement à celui par
    défaut) doit suivre les règles suivantes :
   </span>
   <p class="para">
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Chaque nouvel algorithme doit faire partie du cœur de PHP pendant au moins 1 version complète
       avant de prétendre à devenir l&#039;algorithme par défaut. Aussi, si, par exemple, un nouvel
       algorithme est ajouté en version 7.5.5, il ne sera éligible comme algorithme par défaut qu&#039;à
       partir de PHP 7.7 (sachant que 7.6 sera la première version complète). Mais si un algorithme
       différent a été ajouté en 7.6.0, il sera aussi éligible comme algorithme par défaut
       à partir de la version 7.7.0.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       L&#039;algorithme par défaut ne peut être changé que lors d&#039;une version complète (7.3.0, 8.0.0, etc.)
       et non pendant une version de révision. La seule exception à ce principe de base serait une
       urgence, par exemple, lors de la découverte d&#039;un bogue critique au niveau de la sécurité
       dans l&#039;algorithme par défaut.
      </span>
     </li>
    </ul>
   </p>
  </p></blockquote>
 </div>

 
 <div class="refsect1 seealso" id="refsect1-function.password-hash-seealso">
  <h3 class="title">Voir aussi</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.password-verify.php" class="function" rel="rdfs-seeAlso">password_verify()</a> - V&eacute;rifie qu'un mot de passe correspond &agrave; un hachage</span></li>
    <li><span class="function"><a href="function.password-needs-rehash.php" class="function" rel="rdfs-seeAlso">password_needs_rehash()</a> - V&eacute;rifie que le hachage fourni est conforme &agrave; l'algorithme et aux options sp&eacute;cifi&eacute;es</span></li>
    <li><span class="function"><a href="function.crypt.php" class="function" rel="rdfs-seeAlso">crypt()</a> - Hachage &agrave; sens unique (ind&eacute;chiffrable)</span></li>
    <li><span class="function"><a href="function.sodium-crypto-pwhash-str.php" class="function" rel="rdfs-seeAlso">sodium_crypto_pwhash_str()</a> - Renvoie un hachage encod&eacute; en ASCII</span></li>
   </ul>
  </p>
 </div>

 
</div><?php manual_footer($setup); ?>