<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="fr"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>Formats de mots de passe - Serveur HTTP Apache Version 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet">
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size">
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css"><link rel="stylesheet" type="text/css" href="../style/css/prettify.css">
<script src="../style/scripts/prettify.min.js">
</script>

<link href="../images/favicon.png" rel="shortcut icon"></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Signaler un bug</a></p>
<p class="apache">Serveur HTTP Apache Version 2.5</p>
<img alt="" src="../images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif"></a></div>
<div id="path">
<a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="https://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Documentations diverses</a></div><div id="page-content"><div id="preamble"><h1>Formats de mots de passe</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>Langues Disponibles: </span><a href="../en/misc/password_encryptions.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../es/misc/password_encryptions.html" hreflang="es" rel="alternate" title="Espa&ntilde;ol">&nbsp;es&nbsp;</a> |
<a href="../fr/misc/password_encryptions.html" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a></p>
</div>

    <p>Notes &agrave; propos des formats de chiffrement des mots de passe
    g&eacute;n&eacute;r&eacute;s et reconnus par Apache.</p>
  </div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#basic">Authentification de base</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#digest">Authentification &agrave; base de condens&eacute;s - (digest)</a></li>
</ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="basic">Authentification de base <a title="Lien permanent" href="#basic" class="permalink">&para;</a></h2>

    <p>Voici les cinq formats de mots de passe qu'Apache reconna&icirc;t
    pour l'authentification de base. Notez que tous les formats ne sont
    pas support&eacute;s par toutes les plates-formes :</p>

    <dl>

       <dt>bcrypt</dt>
       <dd>"$2y$" + r&eacute;sultat de l'algorithme de chiffrement crypt_blowfish. Voir le fichier
       source APR <a href="http://svn.apache.org/viewvc/apr/apr/trunk/crypto/crypt_blowfish.c?view=markup">crypt_blowfish.c</a>
       pour plus de d&eacute;tails &agrave; propos de cet algorithme.</dd>

       <dt>MD5</dt>
       <dd>"$apr1$" + le r&eacute;sultat d'un algorithme sp&eacute;cifique &agrave; Apache
       utilisant un condens&eacute; MD5 r&eacute;it&eacute;r&eacute; (1000 fois) de combinaisons
       vari&eacute;es du mot de passe et d'une source d'entropie sur 32 bits.
       Voir le fichier source APR <a href="http://svn.apache.org/viewvc/apr/apr/trunk/crypto/apr_md5.c?view=markup">apr_md5.c</a>
       pour les d&eacute;tails de l'algorithme.</dd>
    

    <dt>SHA1</dt>
       <dd>"{SHA}" + un condens&eacute; SHA-1 du mot de passe cod&eacute; en
       Base64. Non s&eacute;curis&eacute;.</dd>

    <dt>CRYPT</dt>
       <dd>Unix seulement. Utilise la fonction Unix traditionnelle
       <code>crypt(3)</code> avec une source d'entropie sur 32 bits
       (seuls 12 bits sont utilis&eacute;s), et seulement les 8 premiers
       caract&egrave;res du mot de passe. Non s&eacute;curis&eacute;.</dd>

    <dt>PLAIN TEXT (autrement dit <em>non chiffr&eacute;</em>)</dt>
      <dd>Windows &amp; Netware seulement. Non s&eacute;curis&eacute;.</dd>

   </dl>

    <h3>G&eacute;n&eacute;rer des mots de passe avec htpasswd</h3>

      <div class="example"><h3>bcrypt</h3><p><code>
      $ htpasswd -nbB monNom Mon-Mot-de-passe<br>
      monNom:$2y$05$c4WoMPo3SXsafkva.HHa6uXQZWr7oboPiC2bT/r7q1BB8I2s0BRqC
      </code></p></div>

      <div class="example"><h3>MD5</h3><p><code>
      $ htpasswd -nbm monNom Mon-Mot-de-passe<br>
      monNom:$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
      </code></p></div>

      <div class="example"><h3>SHA1</h3><p><code>
      $ htpasswd -nbs monNom Mon-Mot-de-passe<br>
      monNom:{SHA}VBPuJHI7uixaa6LQGWx4s+5GKNE=
      </code></p></div>

      <div class="example"><h3>CRYPT</h3><p><code>
      $ htpasswd -nbd monNom Mon-Mot-de-passe<br>
      monNom:rqXexS6ZhobKA
      </code></p></div>

    

    <h3>G&eacute;n&eacute;rer des mots de passe CRYPT et MD5 avec le programme
      OpenSSL en ligne de commande</h3>
      

      <p>OpenSSL conna&icirc;t l'algorithme MD5 sp&eacute;cifique &agrave; Apache.</p>

      <div class="example"><h3>MD5</h3><p><code>
      $ openssl passwd -apr1 Mon-Mot-de-passe<br>
      $apr1$qHDFfhPC$nITSVHgYbDAK1Y0acGRnY0
      </code></p></div>

      <div class="example"><h3>CRYPT</h3><p><code>
      openssl passwd -crypt Mon-Mot-de-passe<br>
      qQ5vTYO3c8dsU
      </code></p></div>
    

    <h3>Valider des mots de passe CRYPT et MD5 avec le programme
      OpenSSL en ligne de commande</h3>
      
      <p>La source d'entropie pour un mot de passe CRYPT est constitu&eacute;e
      des deux premiers caract&egrave;res (convertis en valeur binaire). Pour
      valider <code>Mon-Mot-de-passe</code> par rapport &agrave;
      <code>rqXexS6ZhobKA</code></p>

      <div class="example"><h3>CRYPT</h3><p><code>
      $ openssl passwd -crypt -salt rq Mon-Mot-de-passe<br>
      Warning: truncating password to 8 characters<br>
      rqXexS6ZhobKA
      </code></p></div>

      <p>Notez que sp&eacute;cifier <code>Mon-Mot-</code> au lieu de
      <code>Mon-Mot-de-passe</code> produira le m&ecirc;me r&eacute;sultat car seuls
      les 8 premiers caract&egrave;res des mots de passe CRYPT sont pris en
      compte.</p>

      <p>La source d'entropie pour un mot de passe MD5 se situe entre
      <code>$apr1$</code> et le caract&egrave;re <code>$</code> suivant (sous
      la forme d'une valeur binaire cod&eacute;e en Base64 - au maximum 8
      caract&egrave;res). Pour valider <code>Mon-Mot-de-passe</code> par rapport
      &agrave; <code>$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/</code></p>

      <div class="example"><h3>MD5</h3><p><code>
      $ openssl passwd -apr1 -salt r31..... Mon-Mot-de-passe<br>
      $apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
      </code></p></div>
    

    <h3>Champs mot de passe de base de donn&eacute;es pour
    mod_dbd</h3>
      <p>La variante SHA1 constitue probablement le format le mieux
      appropri&eacute; pour l'authentification DBD. Comme les fonctions SHA1 et
      Base64 sont en g&eacute;n&eacute;ral disponibles, d'autres logiciels peuvent
      renseigner une base de donn&eacute;es avec des mots de passe chiffr&eacute;s
      utilisables par l'authentification basique d'Apache.</p>

      <p>Pour cr&eacute;er des mots de passe au format SHA1 pour
      l'authentification de base d'Apache dans divers langages :</p>

      <div class="example"><h3>PHP</h3><p><code>
      '{SHA}' . base64_encode(sha1($password, TRUE))
      </code></p></div>

      <div class="example"><h3>Java</h3><p><code>
      "{SHA}" + new sun.misc.BASE64Encoder().encode(java.security.MessageDigest.getInstance("SHA1").digest(password.getBytes()))
      </code></p></div>

      <div class="example"><h3>ColdFusion</h3><p><code>
      "{SHA}" &amp; ToBase64(BinaryDecode(Hash(password, "SHA1"), "Hex"))
      </code></p></div>

      <div class="example"><h3>Ruby</h3><p><code>
      require 'digest/sha1'<br>
      require 'base64'<br>
      '{SHA}' + Base64.encode64(Digest::SHA1.digest(password))
      </code></p></div>

      <div class="example"><h3>C ou C++</h3><p><code>
      Utilisez la fonction APR : apr_sha1_base64
      </code></p></div>

      <div class="example"><h3>Python</h3><p><code>
      import base64<br>
      import hashlib<br>
      "{SHA}" + format(base64.b64encode(hashlib.sha1(password).digest()))
      </code></p></div>

      <div class="example"><h3>PostgreSQL (avec les fonctions contrib/pgcrypto
               install&eacute;es)</h3><p><code>
        
        '{SHA}'||encode(digest(password,'sha1'),'base64')
      </code></p></div>
    

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="digest">Authentification &agrave; base de condens&eacute;s - (digest) <a title="Lien permanent" href="#digest" class="permalink">&para;</a></h2>
    <p>Apache ne reconna&icirc;t qu'un format pour les mots de passe
    d'authentification &agrave; base de condens&eacute;s - le condens&eacute; MD5 de la
    cha&icirc;ne <code>utilisateur:domaine-de-protection:mot-de-passe</code>
    sous la forme d'une cha&icirc;ne de 32 caract&egrave;res au format hexad&eacute;cimal.
    <code>domaine-de-protection</code> est l'identifiant du domaine de
    protection de l'autorisation pass&eacute; en argument &agrave; la directive
    <code class="directive"><a href="../mod/mod_authn_core.html#authname">AuthName</a></code> dans
    httpd.conf.</p>

    <h3>Champs de mot de passe de base de donn&eacute;es pour
    mod_dbd</h3>

      <p>Comme la fonction MD5 est en g&eacute;n&eacute;ral disponible, d'autres
      logiciels peuvent renseigner une base de donn&eacute;es avec des mots de
      passe chiffr&eacute;s utilisables par l'authentification &agrave; base de
      condens&eacute;s d'Apache.</p>

      <p>Pour cr&eacute;er des mots de passe pour l'authentification &agrave; base de
      condens&eacute;s d'Apache dans divers langages :</p>

      <div class="example"><h3>PHP</h3><p><code>
      md5($user . ':' . $realm . ':' .$password)
      </code></p></div>

      <div class="example"><h3>Java</h3><p><code>
      byte b[] = java.security.MessageDigest.getInstance("MD5").digest( (user + ":" + realm + ":" + password ).getBytes());<br>
      java.math.BigInteger bi = new java.math.BigInteger(1, b);<br>
      String s = bi.toString(16);<br>
      while (s.length() &lt; 32)<br>
      <span class="indent">
        s = "0" + s;
      </span>
      // La cha&icirc;ne s contient le mot de passe chiffr&eacute;
      </code></p></div>

      <div class="example"><h3>ColdFusion</h3><p><code>
      LCase(Hash( (user &amp; ":" &amp; realm &amp; ":" &amp; password) , "MD5"))
      </code></p></div>

      <div class="example"><h3>Ruby</h3><p><code>
      require 'digest/md5'<br>
      Digest::MD5.hexdigest(user + ':' + realm + ':' + password)
      </code></p></div>

      <div class="example"><h3>PostgreSQL (avec les fonctions contrib/pgcrypto
	install&eacute;es)</h3><p><code>
        
        encode(digest( user || ':' || realm || ':' || password , 'md5'), 'hex')
      </code></p></div>

    
  </div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../en/misc/password_encryptions.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../es/misc/password_encryptions.html" hreflang="es" rel="alternate" title="Espa&ntilde;ol">&nbsp;es&nbsp;</a> |
<a href="../fr/misc/password_encryptions.html" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2026 The Apache Software Foundation.<br>Autoris&eacute; sous <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Signaler un bug</a></p></div><script><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
var langToggle = document.querySelector('.lang-toggle');
var topLang = document.querySelector('.toplang');
if (langToggle && topLang) {
    langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); });
}
var qv = document.getElementById('quickview');
if (qv) {
    document.body.appendChild(qv);
    var qvBtn = document.createElement('button');
    qvBtn.className = 'qv-toggle';
    qvBtn.setAttribute('aria-label', 'Toggle page navigation');
    qvBtn.innerHTML = '&#9776;';
    document.body.appendChild(qvBtn);
    qvBtn.addEventListener('click', function() {
        var isOpen = qv.classList.toggle('open');
        if (isOpen) {
            qv.style.top = window.scrollY + 10 + 'px';
        }
    });
    window.addEventListener('scroll', function() { qv.classList.remove('open'); });
}
//--><!]]></script>
</body></html>