<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>htdbm - Manipulate DBM password databases - Apache HTTP Server Version 2.4</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" type="text/javascript">
</script>

<link href="../images/favicon.ico" rel="shortcut icon" /></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
<p class="apache">Apache HTTP Server Version 2.4</p>
<img alt="" src="../images/feather.png" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">Programs</a></div><div id="page-content"><div id="preamble"><h1>htdbm - Manipulate DBM password databases</h1>
<div class="toplang">
<p><span>Available Languages: </span><a href="../en/programs/htdbm.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/programs/htdbm.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
<a href="../tr/programs/htdbm.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
</div>

    <p><code>htdbm</code> is used to manipulate the DBM format files used to
    store usernames and password for basic authentication of HTTP users via
    <code class="module"><a href="../mod/mod_authn_dbm.html">mod_authn_dbm</a></code>.  See the <code class="program"><a href="../programs/dbmmanage.html">dbmmanage</a></code>
    documentation for more information about these DBM files.</p>
</div>
<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#synopsis">Synopsis</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#options">Options</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#bugs">Bugs</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#exit">Exit Status</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#examples">Examples</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#security">Security Considerations</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#restrictions">Restrictions</a></li>
</ul><h3>See also</h3><ul class="seealso"><li><code class="program"><a href="../programs/httpd.html">httpd</a></code></li><li><code class="program"><a href="../programs/dbmmanage.html">dbmmanage</a></code></li><li><code class="module"><a href="../mod/mod_authn_dbm.html">mod_authn_dbm</a></code></li><li><a href="#comments_section">Comments</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="synopsis" id="synopsis">Synopsis</a></h2>
    <p><code><strong>htdbm</strong>
    [ -<strong>T</strong><var>DBTYPE</var> ]
    [ -<strong>i</strong> ]
    [ -<strong>c</strong> ]
    [ -<strong>m</strong> |
      -<strong>B</strong> |
      -<strong>d</strong> |
      -<strong>s</strong> |
      -<strong>p</strong> ]
    [ -<strong>C</strong> <var>cost</var> ]
    [ -<strong>t</strong> ]
    [ -<strong>v</strong> ]
    <var>filename</var> <var>username</var></code></p>

    <p><code><strong>htdbm</strong> -<strong>b</strong>
    [ -<strong>T</strong><var>DBTYPE</var> ]
    [ -<strong>c</strong> ]
    [ -<strong>m</strong> |
      -<strong>B</strong> |
      -<strong>d</strong> |
      -<strong>s</strong> |
      -<strong>p</strong> ]
    [ -<strong>C</strong> <var>cost</var> ]
    [ -<strong>t</strong> ]
    [ -<strong>v</strong> ]
    <var>filename</var> <var>username</var> <var>password</var></code></p>

    <p><code><strong>htdbm</strong> -<strong>n</strong>
    [ -<strong>i</strong> ]
    [ -<strong>c</strong> ]
    [ -<strong>m</strong> |
      -<strong>B</strong> |
      -<strong>d</strong> |
      -<strong>s</strong> |
      -<strong>p</strong> ]
    [ -<strong>C</strong> <var>cost</var> ]
    [ -<strong>t</strong> ]
    [ -<strong>v</strong> ]
    <var>username</var></code></p>

    <p><code><strong>htdbm</strong> -<strong>nb</strong>
    [ -<strong>c</strong> ]
    [ -<strong>m</strong> |
      -<strong>B</strong> |
      -<strong>d</strong> |
      -<strong>s</strong> |
      -<strong>p</strong> ]
    [ -<strong>C</strong> <var>cost</var> ]
    [ -<strong>t</strong> ]
    [ -<strong>v</strong> ]
    <var>username</var> <var>password</var></code></p>

    <p><code><strong>htdbm</strong> -<strong>v</strong>
    [ -<strong>T</strong><var>DBTYPE</var> ]
    [ -<strong>i</strong> ]
    [ -<strong>c</strong> ]
    [ -<strong>m</strong> |
      -<strong>B</strong> |
      -<strong>d</strong> |
      -<strong>s</strong> |
      -<strong>p</strong> ]
    [ -<strong>C</strong> <var>cost</var> ]
    [ -<strong>t</strong> ]
    [ -<strong>v</strong> ]
    <var>filename</var> <var>username</var></code></p>

    <p><code><strong>htdbm</strong> -<strong>vb</strong>
    [ -<strong>T</strong><var>DBTYPE</var> ]
    [ -<strong>c</strong> ]
    [ -<strong>m</strong> |
      -<strong>B</strong> |
      -<strong>d</strong> |
      -<strong>s</strong> |
      -<strong>p</strong> ]
    [ -<strong>C</strong> <var>cost</var> ]
    [ -<strong>t</strong> ]
    [ -<strong>v</strong> ]
    <var>filename</var> <var>username</var> <var>password</var></code></p>

    <p><code><strong>htdbm</strong> -<strong>x</strong>
    [ -<strong>T</strong><var>DBTYPE</var> ]
    <var>filename</var> <var>username</var></code></p>

    <p><code><strong>htdbm</strong> -<strong>l</strong>
    [ -<strong>T</strong><var>DBTYPE</var> ]
    </code></p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="options" id="options">Options</a></h2>
    <dl>
    <dt><code>-b</code></dt>
    <dd>Use batch mode; <em>i.e.</em>, get the password from the command line
    rather than prompting for it. This option should be used with extreme care,
    since <strong>the password is clearly visible</strong> on the command
    line. For script use see the <code>-i</code> option.</dd>

    <dt><code>-i</code></dt>
    <dd>Read the password from stdin without verification (for script usage).</dd>

    <dt><code>-c</code></dt>
    <dd>Create the <var>passwdfile</var>. If <var>passwdfile</var> already
    exists, it is rewritten and truncated. This option cannot be combined with
    the <code>-n</code> option.</dd>

    <dt><code>-n</code></dt>
    <dd>Display the results on standard output rather than updating a
    database.  This option changes the syntax of the command line, since the
    <var>passwdfile</var> argument (usually the first one) is omitted. It
    cannot be combined with the <code>-c</code> option.</dd>

    <dt><code>-m</code></dt>
    <dd>Use MD5 hashing for passwords. On Windows and Netware, this is
    the default.</dd>

    <dt><code>-B</code></dt>
    <dd>Use bcrypt hashing for passwords. This is currently considered to
    be very secure.</dd>

    <dt><code>-C</code></dt>
    <dd>This flag is only allowed in combination with <code>-B</code> (bcrypt
    hashing). It sets the computing time used for the bcrypt algorithm
    (higher is more secure but slower, default: 5, valid: 4 to 31).</dd>

    <dt><code>-d</code></dt>
    <dd>Use <code>crypt()</code> hashing for passwords. The default on all
    platforms but Windows and Netware. Though possibly supported by
    <code>htdbm</code> on all platforms, it is not supported by the
    <code class="program"><a href="../programs/httpd.html">httpd</a></code> server on Windows and Netware.
    This algorithm is <strong>insecure</strong> by today's standards.</dd>

    <dt><code>-s</code></dt>
    <dd>Use SHA hashing for passwords. Facilitates migration from/to Netscape
    servers using the LDAP Directory Interchange Format (ldif).
    This algorithm is <strong>insecure</strong> by today's standards.</dd>

    <dt><code>-p</code></dt>
    <dd>Use plaintext passwords. Though <code>htdbm</code> will support
    creation on all platforms, the <code class="program"><a href="../programs/httpd.html">httpd</a></code> daemon will
    only accept plain text passwords on Windows and Netware.</dd>

    <dt><code>-l</code></dt>
    <dd>Print each of the usernames and comments from the database on
    stdout.</dd>

    <dt><code>-v</code></dt>
    <dd>Verify the username and password.  The program will print a message
    indicating whether the supplied password is valid.  If the password is
    invalid, the program exits with error code 3.</dd>

    <dt><code>-x</code></dt>
    <dd>Delete user. If the username exists in the specified DBM file, it
    will be deleted.</dd>

    <dt><code>-t</code></dt>
    <dd>Interpret the final parameter as a comment.  When this option is
    specified, an additional string can be appended to the command line; this
    string will be stored in the "Comment" field of the database, associated
    with the specified username.</dd>

    <dt><code><var>filename</var></code></dt>
    <dd>The filename of the DBM format file. Usually without the extension
    <code>.db</code>, <code>.pag</code>, or <code>.dir</code>.  If
    <code>-c</code> is given, the DBM file is created if it does not already
    exist, or updated if it does exist.</dd>

    <dt><code><var>username</var></code></dt>
    <dd>The username to create or update in <var>passwdfile</var>. If
    <var>username</var> does not exist in this file, an entry is added. If it
    does exist, the password is changed.</dd>

    <dt><code><var>password</var></code></dt>
    <dd>The plaintext password to be hashed and stored in the DBM file.
    Used only with the <code>-b</code> flag.</dd>

    <dt><code>-T<var>DBTYPE</var></code></dt>
    <dd>Type of DBM file (SDBM, GDBM, DB, or "default").</dd>
    </dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="bugs" id="bugs">Bugs</a></h2>
    <p>One should be aware that there are a number of different DBM file
    formats in existence, and with all likelihood, libraries for more than
    one format may exist on your system. The three primary examples are
    SDBM, NDBM, GNU GDBM, and Berkeley/Sleepycat DB 2/3/4. Unfortunately,
    all these libraries use different file formats, and you must make sure
    that the file format used by <var>filename</var> is the same format that
    <code>htdbm</code> expects to see. <code>htdbm</code> currently has
    no way of determining what type of DBM file it is looking at. If used
    against the wrong format, will simply return nothing, or may create a
    different DBM file with a different name, or at worst, it may corrupt
    the DBM file if you were attempting to write to it.</p>

    <p>One can usually use the <code>file</code> program supplied with most
    Unix systems to see what format a DBM file is in.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="exit" id="exit">Exit Status</a></h2>
    <p><code>htdbm</code> returns a zero status ("true") if the username and
    password have been successfully added or updated in the DBM File.
    <code>htdbm</code> returns <code>1</code> if it encounters some problem
    accessing files, <code>2</code> if there was a syntax problem with the
    command line, <code>3</code> if the password was entered interactively and
    the verification entry didn't match, <code>4</code> if its operation was
    interrupted, <code>5</code> if a value is too long (username, filename,
    password, or final computed record), <code>6</code> if the username
    contains illegal characters (see the <a href="#restrictions">Restrictions
    section</a>), and <code>7</code> if the file is not a valid DBM password
    file.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="examples" id="examples">Examples</a></h2>
    <div class="example"><p><code>
      htdbm /usr/local/etc/apache/.htdbm-users jsmith
    </code></p></div>

    <p>Adds or modifies the password for user <code>jsmith</code>. The user
    is prompted for the password. If executed on a Windows system, the password
    will be hashed using the  modified Apache MD5 algorithm; otherwise, the
    system's <code>crypt()</code> routine will be used. If the file does not
    exist, <code>htdbm</code> will do nothing except return an error.</p>

    <div class="example"><p><code>
      htdbm -c /home/doe/public_html/.htdbm jane
    </code></p></div>

    <p>Creates a new file and stores a record in it for user <code>jane</code>.
    The user is prompted for the password. If the file exists and cannot be
    read, or cannot be written, it is not altered and <code>htdbm</code>
    will display a message and return an error status.</p>

    <div class="example"><p><code>
      htdbm -mb /usr/web/.htdbm-all jones Pwd4Steve
    </code></p></div>

    <p>Encrypts the password from the command line (<code>Pwd4Steve</code>)
    using the MD5 algorithm, and stores it in the specified file.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="security" id="security">Security Considerations</a></h2>
    <p>Web password files such as those managed by <code>htdbm</code> should
    <em>not</em> be within the Web server's URI space -- that is, they should
    not be fetchable with a browser.</p>

    <p>The use of the <code>-b</code> option is discouraged, since when it is
    used the plaintext password appears on the command line.</p>

    <p>When using the <code>crypt()</code> algorithm, note that only the first
    8 characters of the password are used  to form the password. If the supplied
    password is longer, the extra characters will be silently discarded.</p>

    <p>The SHA hashing option does not use salting: for a given password,
    there is only one hashed representation. The <code>crypt()</code> and
    MD5 formats permute the representation by prepending a random salt string,
    to make dictionary attacks against the passwords more difficult.</p>

    <p>The SHA and <code>crypt()</code> formats are insecure by today's
    standards.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="restrictions" id="restrictions">Restrictions</a></h2>
    <p>On the Windows platform, passwords hashed with
    <code>htdbm</code> are limited to no more than <code>255</code>
    characters in length. Longer passwords will be truncated to 255
    characters.</p>

    <p>The MD5 algorithm used by <code>htdbm</code> is specific to the Apache
    software; passwords hashed using it will not be usable with other Web
    servers.</p>

    <p>Usernames are limited to <code>255</code> bytes and may not include the
    character <code>:</code>.</p>
</div></div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/programs/htdbm.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/programs/htdbm.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
<a href="../tr/programs/htdbm.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our <a href="https://httpd.apache.org/lists.html">mailing lists</a>.</div>
<script type="text/javascript"><!--//--><![CDATA[//><!--
var comments_shortname = 'httpd';
var comments_identifier = 'http://httpd.apache.org/docs/2.4/programs/htdbm.html';
(function(w, d) {
    if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
        d.write('<div id="comments_thread"><\/div>');
        var s = d.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
        (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
    }
    else { 
        d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
    }
})(window, document);
//--><!]]></script></div><div id="footer">
<p class="apache">Copyright 2025 The Apache Software Foundation.<br />Licensed under the <a href="http://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/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
//--><!]]></script>
</body></html>