<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent" [
  <!ENTITY docName "draft-ietf-kitten-password-storage-07">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="&docName;"
     obsoletes=""
     updates=""
     submissionType="IETF"
     category="bcp"
     consensus="true"
     xml:lang="en"
     tocInclude="true"
     symRefs="true"
     sortRefs="true"
     version="3">
  <front>
    <title abbrev="">Best practices for password hashing and storage</title>
    <seriesInfo name="Internet-Draft" value="&docName;"/>
    <author initials="S" surname="Whited" fullname="Sam Whited">
      <organization/>
      <address>
        <postal>
          <street/>
          <city>Atlanta</city>
          <code>GA</code>
          <country>USA</country>
          <region/>
        </postal>
        <phone/>
        <email>sam@samwhited.com</email>
        <uri>https://blog.samwhited.com/</uri>
      </address>
    </author>
    <date year="2021" month="Sept" day="27"/>
    <area>Internet</area>
    <workgroup>Common Authentication Technology Next Generation</workgroup>
    <abstract>
      <t>
        This document outlines best practices for handling user passwords and
        other authenticator secrets in client-server systems making use of SASL.
      </t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>
        Following best practices when hashing and storing passwords for use with
        SASL impacts a great deal more than just a user's identity.
        It also affects usability, backwards compatibility, and interoperability
        by determining what authentication and authorization mechanisms can be
        used.
      </t>
      <section anchor="conventions-and-terminology" numbered="true" toc="default">
        <name>Conventions and Terminology</name>
        <t>
          Various security-related terms are to be understood in the sense
          defined in <xref target="RFC4949"/>.
          Some may also be defined in <xref target="NISTSP63-3"/> Appendix
          A.1 and in <xref target="NISTSP132"/> section 3.1.
        </t>
        <t>
          Throughout this document the term "password" is used to mean any
          password, passphrase, PIN, or other memorized secret.
        </t>
        <t>
          Other common terms used throughout this document include:
        </t>
        <dl>
          <dt>Mechanism pinning</dt>
          <dd>
            A security mechanism which allows SASL clients to resist downgrade
            attacks.
            Clients that implement mechanism pinning remember the perceived
            strength of the SASL mechanism used in a previous successful
            authentication attempt and thereafter only authenticate using
            mechanisms of equal or higher perceived strength.
          </dd>
          <dt>Pepper</dt>
          <dd>
            A secret added to a password hash like a salt.
            Unlike a salt, peppers are secret and the same pepper may be reused
            for many hashed passwords.
            They <bcp14>MUST NOT</bcp14> be stored alongside the hashed
            password.
          </dd>
          <dt>Salt</dt>
          <dd>
            In this document salt is used as defined in
            <xref target="RFC4949"/>.
          </dd>
        </dl>
        <t>
          The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
          "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
          "OPTIONAL" in this document are to be interpreted as described in BCP
          14 <xref target="RFC2119" format="default"/> <xref target="RFC8174"
          format="default"/> when, and only when, they appear in all capitals,
          as shown here.
        </t>
      </section>
    </section>
    <section anchor="sasl-mechanisms" numbered="true" toc="default">
      <name>SASL Mechanisms</name>
      <t>
        For clients and servers that support password based authentication using
        <xref target="RFC4422">SASL</xref> it is <bcp14>RECOMMENDED</bcp14> that
        the following mechanisms be implemented:
      </t>
      <ul>
        <li><xref target="RFC7677">SCRAM-SHA-256</xref></li>
        <li><xref target="RFC7677">SCRAM-SHA-256-PLUS</xref></li>
      </ul>
      <t>
        System entities <bcp14>SHOULD NOT</bcp14> invent their own mechanisms
        that have not been standardized by the IETF or another reputable
        standards body.
        Similarly, entities <bcp14>MUST NOT</bcp14> implement any mechanism
        with a usage status of "OBSOLETE", or "LIMITED", or "MUST NOT be used"
        in the <xref target="IANA.sasl.mechanisms">IANA SASL Mechanisms
        Registry</xref>.
        For example, entities <bcp14>MUST NOT</bcp14> implement DIGEST-MD5
        (deprecated in <xref target="RFC6331"/>).
      </t>
      <t>
        The SASL mechanisms discussed in this document do not negotiate a
        security layer.
        Because of this a strong security layer such as <xref
        target="RFC8446">TLS</xref> <bcp14>MUST</bcp14> be negotiated before
        SASL mechanisms can be advertised or negotiated.
      </t>
    </section>
    <section anchor="client-best-practices" numbered="true" toc="default">
      <name>Client Best Practices</name>
      <section anchor="mechanism-pinning" numbered="true" toc="default">
        <name>Mechanism Pinning</name>
        <t>
          Clients often maintain a list of preferred SASL mechanisms, generally
          ordered by perceived strength to enable strong authentication.
          To prevent downgrade attacks by a malicious actor that has
          successfully executed an in-the-middle attack on a connection, or
          compromised a trusted server's configuration, clients
          <bcp14>SHOULD</bcp14> implement "mechanism pinning".
          That is, after the first successful authentication with a strong
          mechanism, clients <bcp14>SHOULD</bcp14> make a record of the
          authentication and thereafter only advertise and use mechanisms of
          equal or higher perceived strength.
        </t>
        <t>
          The following mechanisms are ordered by their perceived strength from
          strongest to weakest with mechanisms of equal strength on the same
          line.
          The remainder of this section is merely informative.
          In particular this example does not imply that mechanisms in this list
          should or should not be implemented.
        </t>
        <ol>
          <li>EXTERNAL</li>
          <li>SCRAM-SHA-256-PLUS</li>
          <li>SCRAM-SHA-1-PLUS</li>
          <li>SCRAM-SHA-256</li>
          <li>SCRAM-SHA-1</li>
          <li>PLAIN</li>
        </ol>
        <t>
          The EXTERNAL mechanism defined in <xref target="RFC4422"/> appendix A
          is placed at the top of the list.
          However, its perceived strength depends on the underlying
          authentication protocol.
          In this example, we assume that <xref target="RFC8446">TLS</xref>
          services are being used.
        </t>
        <t>
          The channel binding ("-PLUS") variants of <xref
          target="RFC5802">SCRAM</xref> are listed above their non-channel
          binding cousins, but may not always be available depending on the type
          of channel binding data available to the SASL negotiator.
        </t>
        <t>
          Finally, the PLAIN mechanism sends the username and password in plain
          text and therefore requires a strong security layer such as TLS for
          the password to be protected in transit.
          However, if the server is trusted to know the password PLAIN does
          allow for the use of a strong key derivation function (KDF) for
          storing the authentication data at rest and provides for password hash
          agility.
        </t>
      </section>
      <section anchor="client-storage" numbered="true" toc="default">
        <name>Storage</name>
        <t>
          Clients <bcp14>SHOULD</bcp14> always store authentication secrets in a
          trusted and encrypted keystore such as the system keystore, or an
          encrypted store created specifically for the clients use.
          They <bcp14>SHOULD NOT</bcp14> store authentication secrets as plain
          text.
        </t>
        <t>
          If clients know that they will only ever authenticate using a
          mechanism such as <xref target="RFC5802">SCRAM</xref> where the
          original password is not needed after the first authentication attempt
          they <bcp14>SHOULD</bcp14> store the SCRAM bits or the hashed and
          salted password instead of the original password.
          However, if backwards compatibility with servers that only support the
          PLAIN mechanism or other mechanisms that require using the original
          password is required, clients <bcp14>MAY</bcp14> choose to store the
          original password so long as an appropriate keystore is used.
        </t>
      </section>
    </section>
    <section anchor="server-best-practices" numbered="true" toc="default">
      <name>Server Best Practices</name>
      <section anchor="server-additional-requirements" numbered="true" toc="default">
        <name>Additional SASL Requirements</name>
        <t>
          Servers <bcp14>MUST NOT</bcp14> support any mechanism that would
          require authentication secrets to be stored in such a way that they
          could be recovered in plain text from the stored information.
          This includes mechanisms that store authentication secrets using
          reversable encryption, obsolete hashing mechanisms such as MD5 or
          hashing mechanisms that are cryptographically secure but designed for
          speed such as SHA256.
        </t>
      </section>
      <section anchor="server-storage" numbered="true" toc="default">
        <name>Storage</name>
        <t>
          Servers <bcp14>MUST</bcp14> always store passwords only after they
          have been salted, peppered (if possible with the given authentication
          mechanism), and hashed using a strong KDF.
          A distinct salt <bcp14>SHOULD</bcp14> be used for each user, and each
          SCRAM family supported.
          Salts <bcp14>SHOULD</bcp14> be generated using a cryptographically
          secure random number generator.
          The salt <bcp14>MAY</bcp14> be stored in the same datastore as the
          password.
          A pepper stored in the application configuration, or a secure location
          other than the datastore containing the salts, <bcp14>SHOULD</bcp14>
          be combined with the password before hashing if possible with the
          given authentication mechanism.
          Peppers <bcp14>SHOULD NOT</bcp14> be combined with the salt because
          the salt is not secret and may appear in the final hash output.
        </t>
        <t>
          The following restrictions MUST be observed when generating salts and
          peppers:
        </t>
        <table anchor="common-params">
          <name>Common Parameters</name>
          <thead>
            <tr>
              <th align='center'>Parameter</th>
              <th align='center'>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Minimum Salt Length</td>
              <td>4 bytes</td>
            </tr>
            <tr>
              <td>Minimum Pepper Length</td>
              <td>14 bytes</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="authentication-and-rotation" numbered="true" toc="default">
        <name>Authentication and Rotation</name>
        <t>
          When authenticating using PLAIN or similar mechanisms that involve
          transmitting the original password to the server the password
          <bcp14>MUST</bcp14> be hashed and compared against the salted and
          hashed password in the database using a constant time comparison.
        </t>
        <t>
          Each time a password is changed a new random salt <bcp14>MUST</bcp14>
          be created and the iteration count and pepper (if applicable)
          <bcp14>MUST</bcp14> be updated to the latest value required by server
          policy.
        </t>
        <t>
          If a pepper is used, consideration should be taken to ensure that it
          can be easily rotated.
          For example, multiple peppers could be stored.
          New passwords and reset passwords would use the newest pepper and a
          hash of the pepper using the same KDF that was used on the password
          could then be stored in the database next to the salt so that future
          logins can identify which pepper in the list was used.
          This is just one example, pepper rotation schemes are outside the
          scope of this document.
        </t>
      </section>
    </section>
    <section anchor="kdf-recommendations" numbered="true" toc="default">
      <name>KDF Recommendations</name>
      <t>
        When properly configured, the following commonly used KDFs create
        suitable password hash results for server side storage.
        The recommendations in this section may change depending on the hardware
        being used and the security level required for the application.
      </t>
      <t>
        With all KDFs proper tuning is required to ensure that it meets the
        needs of the specific application or service.
        For persistent login an iteration count or work factor that adds
        approximately a quarter of a second to login may be an acceptable
        tradeoff since logins are relatively rare.
        By contrast, verification tokens that are generated many times per
        second may need to use a much lower work factor.
      </t>
      <section anchor="argon2-recommendations" numbered="true" toc="default">
        <name>Argon2</name>
        <t>
          <xref target="ARGON2ESP">Argon2</xref> is the 2015 winner of the
          Password Hashing Competition and the current OWASP recommendation for
          password hashing.
          Security considerations, test vectors, and parameters for tuning
          argon2 can be found in <xref target="I-D.irtf-cfrg-argon2"/>.
          The defaults are copied here for easier reference.
        </t>
        <table anchor="argon2id-params">
          <name>Argon Parameters</name>
          <thead>
            <tr>
              <th align='center'>Parameter</th>
              <th align='center'>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Degree of parallelism (p)</td>
              <td>4</td>
            </tr>
            <tr>
              <td>Minimum memory size (m)</td>
              <td>2 GiB</td>
            </tr>
            <tr>
              <td>Minimum number of iterations (t)</td>
              <td>1</td>
            </tr>
            <tr>
              <td>Algorithm type (y)</td>
              <td>Argon2id (2)</td>
            </tr>
            <tr>
              <td>Minimum output length</td>
              <td>32</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="bcrypt-recommendations" numbered="true" toc="default">
        <name>Bcrypt</name>
        <t>
          <xref target="BCRYPT">bcrypt</xref> is a Blowfish-based KDF.
        </t>
        <table anchor="bcrypt-params">
          <name>Bcrypt Parameters</name>
          <thead>
            <tr>
              <th align='center'>Parameter</th>
              <th align='center'>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Minimum Recommended Cost</td>
              <td>12</td>
            </tr>
            <tr>
              <td>Maximum Password Length</td>
              <td>50-72 bytes depending on the implementation</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="pbkdf2" numbered="true" toc="default">
        <name>PBKDF2</name>
        <t>
          <xref target="RFC8018">PBKDF2</xref> is used by the <xref
          target="RFC5802">SCRAM</xref> family of SASL mechanisms.
        </t>
        <table anchor="pbkdf2-params">
          <name>PBKDF2 Parameters</name>
          <thead>
            <tr>
              <th align='center'>Parameter</th>
              <th align='center'>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Minimum iteration count (c)</td>
              <td>310,000</td>
            </tr>
            <tr>
              <td>Hash</td>
              <td>HMAC-SHA256</td>
            </tr>
            <tr>
              <td>Output length (dkLen)</td>
              <td>min(hLen, 32) (where hLen is the length of the chosen hash)</td>
            </tr>
          </tbody>
        </table>
        <t>
          When PBKDF2 is used with HMAC such as in the <xref target="RFC5802">
          SCRAM</xref> family of SASL mechanisms the password is pre-hashed if
          it is longer than the block size of the hash function (hLen, or 64
          bytes for SHA-256).
          Care should be taken to ensure that the implementation of PBKDF2 does
          this before the iterations, otherwise long hashes may become
          significantly more expensive than expected, possibly resulting in a
          Denial-of-Service (DOS).
        </t>
      </section>
      <section anchor="scrypt-recommendations" numbered="true" toc="default">
        <name>Scrypt</name>
        <t>
          The <xref target="SCRYPT"/> KDF is designed to be memory-hard and
          sequential memory-hard to prevent against custom hardware based
          attacks.
        </t>
        <t>
          Security considerations, test vectors, and further notes on tuning
          scrypt may be found in <xref target="RFC7914"/>.
        </t>
        <table anchor="scrypt-params">
          <name>Scrypt Parameters</name>
          <thead>
            <tr>
              <th align='center'>Parameter</th>
              <th align='center'>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Minimum CPU/Memory cost parameter (N)</td>
              <td>32768 (N=2^15)</td>
            </tr>
            <tr>
              <td>Blocksize (r)</td>
              <td>8</td>
            </tr>
            <tr>
              <td>Parallelization parameter (p)</td>
              <td>1</td>
            </tr>
            <tr>
              <td>Minimum output length (dkLen)</td>
              <td>32</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="password-complexity" numbered="true" toc="default">
      <name>Password Complexity Requirements</name>
      <t>
        Before any other password complexity requirements are checked, the
        preparation and enforcement steps of the OpaqueString profile of <xref
        target="RFC8265"/> <bcp14>SHOULD</bcp14> be applied (for more
        information see the Internationalization Considerations section).
        Entities <bcp14>SHOULD</bcp14> enforce a minimum length of 8 characters
        for user passwords.
        If using a mechanism such as PLAIN where the server performs hashing on
        the original password, a maximum length between 64 and 128 characters
        <bcp14>MAY</bcp14> be imposed to prevent denial of service (DoS)
        attacks.
        Entities <bcp14>SHOULD NOT</bcp14> apply any other password
        restrictions.
      </t>
      <t>
        In addition to these password complexity requirements, servers
        <bcp14>SHOULD</bcp14> maintain a password blocklist and reject attempts
        by a claimant to use passwords on the blocklist during registration or
        password reset.
        The contents of this blocklist are a matter of server policy.
        Some common recommendations include lists of common passwords that are
        not otherwise prevented by length requirements, and passwords present in
        known breaches.
      </t>
    </section>
    <section anchor="i18n" numbered="true" toc="default">
      <name>Internationalization Considerations</name>
      <t>
        The PRECIS framework (Preparation, Enforcement, and Comparison of
        Internationalized Strings) defined in <xref target="RFC8264"/> is used
        to enforce internationalization rules on strings and to prevent common
        application security issues arrising from allowing the full range of
        Unicode codepoints in usernames, passwords, and other identifiers.
        The OpaqueString profile of <xref target="RFC8265"/> is used in this
        document to ensure that codepoints in passwords are treated carefully
        and consistently.
        This ensures that users typing certain characters on different keyboards
        that may provide different versions of the same character will still be
        able to log in.
        For example, some keyboards may output the full-width version of a
        character while other keyboards output the half-width version of the
        same character.
        The Width Mapping rule of the OpaqueString profile addresses this and
        ensures that comparison succeeds and the claimant is able to be
        authenticated.
      </t>
      <t>
        When enforcing a minimum password length the authentication server
        SHOULD NOT count bytes as single Unicode scalar values may take up many
        bytes.
        Similarly, a single emoji may be constructed from many Unicode scalar
        values, so it may not be appropriate to count scalar values or code
        points.
        Instead consider counting the number Grapheme Clusters as defined in
        <xref target="UAX29"/>.
      </t>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>
        This document contains recommendations that are likely to change over
        time.
        It should be reviewed regularly to ensure that it remains accurate and
        up to date.
        Many of the recommendations in this document were taken from <xref
        target="OWASP.CS.passwords"/>, <xref target="NISTSP63b"/>, and
        <xref target="NISTSP132"/>.
      </t>
      <t>
        The "-PLUS" variants of <xref target="RFC5802">SCRAM</xref> support
        channel binding to their underlying security layer, but lack a mechanism
        for negotiating what type of channel binding to use.
        In <xref target="RFC5802"/> the <xref target="RFC5929">tls-unique</xref>
        channel binding mechanism is specified as the default, and it is
        therefore likely to be used in most applications that support channel
        binding.
        However, in the absence of the <xref target="RFC7627">TLS extended
        master secret fix</xref> and the <xref target="RFC5746">renegotiation
        indication TLS extension</xref> the tls-unique and tls-server-endpoint
        channel binding data can be forged by an attacker that can MITM the
        connection.
        Before advertising a channel binding SASL mechanism, entities
        <bcp14>MUST</bcp14> ensure that both the TLS extended master secret fix
        and the renegotiation indication extension are in place and that the
        connection has not been renegotiated.
      </t>
      <t>
        For <xref target="RFC8446">TLS 1.3</xref> no channel binding types are
        currently defined.
        Channel binding SASL mechanisms <bcp14>MUST NOT</bcp14> be advertised or
        negotiated over a TLS 1.3 channel until such types are defined.
      </t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>
        This document has no actions for IANA.
      </t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="IANA.sasl.mechanisms"
                   target="https://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.xhtml">
          <front>
              <title>
                Simple Authentication and Security Layer (SASL) Mechanisms
              </title>
              <author fullname=""
                  initials=""
                  surname="IETF">
                  <organization>IETF</organization>
              </author>
              <date year="2015" month="November"/>
          </front>
          <format type="TXT"
                  target="https://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.txt"/>
        </reference>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.4949.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.5746.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.5929.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.7627.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8174.xml"/>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="ARGON2ESP" target="https://www.cryptolux.org/images/d/d0/Argon2ESP.pdf">
          <front>
            <title>
              Argon2: New Generation of Memory-Hard Functions for Password
              Hashing and Other Applications
            </title>
            <author initials="A." surname="Biryukov" fullname="Alex Biryukov"/>
            <author initials="D." surname="Dinu" fullname="Daniel Dinu"/>
            <author initials="D." surname="Khovratovich" fullname="Dmitry Khovratovich"/>
            <date month="March" year="2016"/>
          </front>
          <seriesInfo name="Euro SnP" value="2016"/>
        </reference>
        <reference anchor="SCRYPT">
          <front>
            <title>
              Stronger key derivation via sequential memory-hard functions
            </title>
            <author initials="C." surname="Percival" fullname="C. Percival"/>
            <date month="May" year="2009"/>
          </front>
          <seriesInfo name="BSDCan'09" value="http://www.tarsnap.com/scrypt/scrypt.pdf"/>
        </reference>
        <reference anchor="BCRYPT">
          <front>
          <title>A Future-Adaptable Password Scheme</title>
            <author initials="N." surname="Provos" fullname="N. Provos"/>
            <author initials="D." surname="Mazières" fullname="D. Mazières"
                    asciiSurname="Mazieres" asciiFullname="D. Mazieres"/>
            <date month="June" year="1999"/>
          </front>
          <seriesInfo name="USENIX 1999" value="https://www.usenix.org/legacy/event/usenix99/provos/provos.pdf"/>
        </reference>
        <reference anchor="NISTSP132" target="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf">
          <front>
            <title>Recommendation for Password-Based Key Derivation Part 1: Storage Applications</title>
            <author initials="M." surname="Turan" fullname="Meltem Sönmez Turan">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="E." surname="Barker" fullname="Elaine Barker">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="W." surname="Burr" fullname="William Burr">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="L." surname="Chen" fullname="Lily Chen">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2010" month="December"/>
          </front>
          <seriesInfo name="NIST Special Publication" value="SP 800-132"/>
          <seriesInfo name="DOI" value="10.6028/NIST.SP.800-132"/>
        </reference>
        <reference anchor="NISTSP63-3" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63-3.pdf">
          <front>
            <title>Digital Identity Guidelines</title>
            <author initials="P." surname="Grassi" fullname="Paul A. Grassi">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="M." surname="Garcia" fullname="Michael E. Garcia">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="J." surname="Fenton" fullname="James L. Fenton">
              <organization>Altmode NetworksLos Altos, CA</organization>
            </author>
            <date year="2017" month="June"/>
          </front>
          <seriesInfo name="NIST Special Publication" value="SP 800-63-3"/>
          <seriesInfo name="DOI" value="10.6028/NIST.SP.800-63-3 "/>
        </reference>
        <reference anchor="NISTSP63b" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63b.pdf">
          <front>
            <title>Digital Identity Guidelines: Authentication and Lifecycle Management</title>
            <author initials="P." surname="Grassi" fullname="Paul A. Grassi">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="J." surname="Fenton" fullname="James L. Fenton">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="E." surname="Newton" fullname="Elaine M. Newton">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="R." surname="Perlner" fullname="Ray A. Perlner">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="A." surname="Regenscheid" fullname="Andrew R. Regenscheid">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="W." surname="Burr" fullname="William E. Burr">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="J." surname="Richer" fullname="Justin P. Richer">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="N." surname="Lefkovitz" fullname="Naomi B. Lefkovitz">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="J." surname="Danker" fullname="Jamie M. Danker">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="Y." surname="Choong" fullname="Yee-Yin Choong">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="K." surname="Greene" fullname="Kristen K. Greene">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <author initials="M." surname="Theofanos" fullname="Mary F. Theofanos">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2017" month="June"/>
          </front>
          <seriesInfo name="NIST Special Publication" value="SP 800-63b"/>
          <seriesInfo name="DOI" value="10.6028/NIST.SP.800-63b"/>
        </reference>
        <reference anchor="OWASP.CS.passwords" target="https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html">
          <front>
            <title>Password Storage</title>
            <author initials="J." surname="Manico" fullname="Jim Manico"/>
            <author initials="E." surname="Saad" fullname="Elie Saad"/>
            <author initials="J." surname="Maćkowski" fullname="Jakub Maćkowski"
                    asciiSurname="Mackowski" asciiFullname="Jakub Mackowski"/>
            <author initials="R." surname="Bailey" fullname="Robin Bailey"/>
            <date year="2020" month="April"/>
          </front>
          <seriesInfo name="OWASP Cheat Sheet" value="Password Storage"/>
        </reference>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.4422.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.5802.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.6331.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.7677.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.7914.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8018.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8264.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8265.xml"/>
        <xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8446.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.draft-irtf-cfrg-argon2-12.xml"/>
        <reference anchor="UAX29" target="https://www.unicode.org/reports/tr29/">
          <front>
            <title>
              Unicode Text Segmentation
            </title>
            <author initials="M." surname="Davis" fullname="Mark Davis"/>
            <author initials="C." surname="Chapman" fullname="Christopher Chapman"/>
            <date month="February" year="2020"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="acknowledgments" numbered="true" toc="default">
      <name>Acknowledgments</name>
      <t>
        The author would like to thank the civil servants at the National
        Institute of Standards and Technology for their work on the Special
        Publications series.
        U.S. executive agencies are an undervalued national treasure, and they
        deserve our thanks.
      </t>
      <t>
        Thanks also to Cameron Paul, Thomas Copeland, Robbie Harwood, Jim
        Fenton, and Alexey Melnikov for their reviews and suggestions.
      </t>
    </section>
  </back>
</rfc>
