<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="bcp" consensus="true" docName="draft-ietf-kitten-password-storage-02" indexInclude="true" ipr="trust200902" prepTime="2020-11-22T21:13:56" scripts="Common,Latin" sortRefs="true" submissionType="IETF" symRefs="true" tocDepth="3" tocInclude="true" xml:lang="en">
  <front>
    <title abbrev="">Best practices for password hashing and storage</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-kitten-password-storage-02" stream="IETF"/>
    <author initials="S" surname="Whited" fullname="Sam Whited">
      <organization showOnFrontPage="true"/>
      <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 month="11" year="2020" day="22"/>
    <area>Internet</area>
    <workgroup>Common Authentication Technology Next Generation</workgroup>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">
        This document outlines best practices for handling user passwords and
        other authenticator secrets in client-server systems making use of SASL.
      </t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
        This Internet-Draft is submitted in full conformance with the
        provisions of BCP 78 and BCP 79.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
        Internet-Drafts are working documents of the Internet Engineering Task
        Force (IETF). Note that other groups may also distribute working
        documents as Internet-Drafts. The list of current Internet-Drafts is
        at <eref target="https://datatracker.ietf.org/drafts/current/" brackets="none"/>.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
        Internet-Drafts are draft documents valid for a maximum of six months
        and may be updated, replaced, or obsoleted by other documents at any
        time. It is inappropriate to use Internet-Drafts as reference
        material or to cite them other than as "work in progress."
        </t>
        <t indent="0" pn="section-boilerplate.1-4">
        This Internet-Draft will expire on 26 May 2021.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2020 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Simplified BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Simplified BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-conventions-and-terminology">Conventions and Terminology</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sasl-mechanisms">SASL Mechanisms</xref></t>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-client-best-practices">Client Best Practices</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2">
              <li pn="section-toc.1-1.3.2.1">
                <t indent="0" pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-mechanism-pinning">Mechanism Pinning</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.2">
                <t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" format="counter" sectionFormat="of" target="section-3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-storage">Storage</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-server-best-practices">Server Best Practices</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2">
              <li pn="section-toc.1-1.4.2.1">
                <t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent="4.1" format="counter" sectionFormat="of" target="section-4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-additional-sasl-requirement">Additional SASL Requirements</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.2">
                <t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent="4.2" format="counter" sectionFormat="of" target="section-4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-storage-2">Storage</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.3">
                <t indent="0" pn="section-toc.1-1.4.2.3.1"><xref derivedContent="4.3" format="counter" sectionFormat="of" target="section-4.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-authentication-and-rotation">Authentication and Rotation</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-kdf-recommendations">KDF Recommendations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2">
              <li pn="section-toc.1-1.5.2.1">
                <t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" format="counter" sectionFormat="of" target="section-5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-argon2">Argon2</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.2">
                <t indent="0" pn="section-toc.1-1.5.2.2.1"><xref derivedContent="5.2" format="counter" sectionFormat="of" target="section-5.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-bcrypt">Bcrypt</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.3">
                <t indent="0" pn="section-toc.1-1.5.2.3.1"><xref derivedContent="5.3" format="counter" sectionFormat="of" target="section-5.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-pbkdf2">PBKDF2</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.4">
                <t indent="0" pn="section-toc.1-1.5.2.4.1"><xref derivedContent="5.4" format="counter" sectionFormat="of" target="section-5.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-scrypt">Scrypt</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-password-complexity-require">Password Complexity Requirements</xref></t>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-internationalization-consid">Internationalization Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter" sectionFormat="of" target="section-9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.10">
            <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" format="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.10.2">
              <li pn="section-toc.1-1.10.2.1">
                <t indent="0" pn="section-toc.1-1.10.2.1.1"><xref derivedContent="10.1" format="counter" sectionFormat="of" target="section-10.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.10.2.2">
                <t indent="0" pn="section-toc.1-1.10.2.2.1"><xref derivedContent="10.2" format="counter" sectionFormat="of" target="section-10.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.11">
            <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgments">Acknowledgments</xref></t>
          </li>
          <li pn="section-toc.1-1.12">
            <t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.b"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-address">Author's Address</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="include" removeInRFC="false" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">
        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="include" removeInRFC="false" pn="section-1.1">
        <name slugifiedName="name-conventions-and-terminology">Conventions and Terminology</name>
        <t indent="0" pn="section-1.1-1">
          Various security-related terms are to be understood in the sense
          defined in <xref target="RFC4949" format="default" sectionFormat="of" derivedContent="RFC4949"/>.
          Some may also be defined in <xref target="NISTSP63-3" format="default" sectionFormat="of" derivedContent="NISTSP63-3"/> Appendix
          A.1 and in <xref target="NISTSP132" format="default" sectionFormat="of" derivedContent="NISTSP132"/> section 3.1.
        </t>
        <t indent="0" pn="section-1.1-2">
          Throughout this document the term "password" is used to mean any
          password, passphrase, PIN, or other memorized secret.
        </t>
        <t indent="0" pn="section-1.1-3">
          Other common terms used throughout this document include:
        </t>
        <dl indent="3" newline="false" spacing="normal" pn="section-1.1-4">
          <dt pn="section-1.1-4.1">Mechanism pinning</dt>
          <dd pn="section-1.1-4.2">
            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 pn="section-1.1-4.3">Pepper</dt>
          <dd pn="section-1.1-4.4">
            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 must not be stored alongside the hashed password.
          </dd>
          <dt pn="section-1.1-4.5">Salt</dt>
          <dd pn="section-1.1-4.6">
            In this document salt is used as defined in
            <xref target="RFC4949" format="default" sectionFormat="of" derivedContent="RFC4949"/>.
          </dd>
        </dl>
        <t indent="0" pn="section-1.1-5">
          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" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they appear in all capitals,
          as shown here.
        </t>
      </section>
    </section>
    <section anchor="sasl-mechanisms" numbered="true" toc="include" removeInRFC="false" pn="section-2">
      <name slugifiedName="name-sasl-mechanisms">SASL Mechanisms</name>
      <t indent="0" pn="section-2-1">
        For clients and servers that support password based authentication using
        <xref target="RFC4422" format="default" sectionFormat="of" derivedContent="RFC4422">SASL</xref> it is <bcp14>RECOMMENDED</bcp14> that
        the following mechanisms be implemented:
      </t>
      <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-2-2">
        <li pn="section-2-2.1">
          <xref target="RFC7677" format="default" sectionFormat="of" derivedContent="RFC7677">SCRAM-SHA-256</xref></li>
        <li pn="section-2-2.2">
          <xref target="RFC7677" format="default" sectionFormat="of" derivedContent="RFC7677">SCRAM-SHA-256-PLUS</xref></li>
      </ul>
      <t indent="0" pn="section-2-3">
        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>SHOULD NOT</bcp14> implement any mechanism
        with a usage status of "OBSOLETE", "MUST NOT be used", or "LIMITED" in
        the <xref target="IANA.sasl.mechanisms" format="default" sectionFormat="of" derivedContent="IANA.sasl.mechanisms">IANA SASL Mechanisms
        Registry</xref>.
      </t>
      <t indent="0" pn="section-2-4">
        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" format="default" sectionFormat="of" derivedContent="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="include" removeInRFC="false" pn="section-3">
      <name slugifiedName="name-client-best-practices">Client Best Practices</name>
      <section anchor="mechanism-pinning" numbered="true" toc="include" removeInRFC="false" pn="section-3.1">
        <name slugifiedName="name-mechanism-pinning">Mechanism Pinning</name>
        <t indent="0" pn="section-3.1-1">
          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 man in the middled 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 indent="0" pn="section-3.1-2">
          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 indent="adaptive" spacing="normal" start="1" type="1" pn="section-3.1-3">
          <li pn="section-3.1-3.1" derivedCounter="1.">EXTERNAL</li>
          <li pn="section-3.1-3.2" derivedCounter="2.">SCRAM-SHA-256-PLUS</li>
          <li pn="section-3.1-3.3" derivedCounter="3.">SCRAM-SHA-1-PLUS</li>
          <li pn="section-3.1-3.4" derivedCounter="4.">SCRAM-SHA-256</li>
          <li pn="section-3.1-3.5" derivedCounter="5.">SCRAM-SHA-1</li>
          <li pn="section-3.1-3.6" derivedCounter="6.">PLAIN</li>
          <li pn="section-3.1-3.7" derivedCounter="7.">DIGEST-MD5, CRAM-MD5</li>
        </ol>
        <t indent="0" pn="section-3.1-4">
          The EXTERNAL mechanism defined in <xref target="RFC4422" format="default" sectionFormat="of" derivedContent="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" format="default" sectionFormat="of" derivedContent="RFC8446">TLS</xref>
          services are being used.
        </t>
        <t indent="0" pn="section-3.1-5">
          The channel binding ("-PLUS") variants of <xref target="RFC5802" format="default" sectionFormat="of" derivedContent="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 indent="0" pn="section-3.1-6">
          The PLAIN mechanism sends the username and password in plain text, but
          does allow for the use of a strong key derivation function (KDF) for
          the stored version of the password on the server.
        </t>
        <t indent="0" pn="section-3.1-7">
          Finally, the DIGEST-MD5 and CRAM-MD5 mechanisms are listed last
          because they use weak hashes and ciphers and prevent the server from
          storing passwords using a KDF.
          For a list of problems with DIGEST-MD5 see <xref target="RFC6331" format="default" sectionFormat="of" derivedContent="RFC6331"/>.
        </t>
      </section>
      <section anchor="client-storage" numbered="true" toc="include" removeInRFC="false" pn="section-3.2">
        <name slugifiedName="name-storage">Storage</name>
        <t indent="0" pn="section-3.2-1">
          Clients <bcp14>SHOULD</bcp14> always store authenticators 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 authenticators as plain text.
        </t>
        <t indent="0" pn="section-3.2-2">
          If clients know that they will only ever authenticate using a
          mechanism such as <xref target="RFC5802" format="default" sectionFormat="of" derivedContent="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="include" removeInRFC="false" pn="section-4">
      <name slugifiedName="name-server-best-practices">Server Best Practices</name>
      <section anchor="server-additional-requirements" numbered="true" toc="include" removeInRFC="false" pn="section-4.1">
        <name slugifiedName="name-additional-sasl-requirement">Additional SASL Requirements</name>
        <t indent="0" pn="section-4.1-1">
          Servers <bcp14>MUST NOT</bcp14> support any mechanism that would
          require authenticators to be stored in such a way that they could be
          recovered in plain text from the stored information.
          This includes mechanisms that store authenticators 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="include" removeInRFC="false" pn="section-4.2">
        <name slugifiedName="name-storage-2">Storage</name>
        <t indent="0" pn="section-4.2-1">
          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 indent="0" pn="section-4.2-2">
          The following restrictions MUST be observed when generating salts and
          peppers, more up to date numbers may be found in
          <xref target="OWASP.CS.passwords" format="default" sectionFormat="of" derivedContent="OWASP.CS.passwords"/>.
        </t>
        <table anchor="common-params" align="center" pn="table-1">
          <name slugifiedName="name-common-parameters">Common Parameters</name>
          <thead>
            <tr>
              <th align="center" colspan="1" rowspan="1">Parameter</th>
              <th align="center" colspan="1" rowspan="1">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">Minimum Salt Length</td>
              <td align="left" colspan="1" rowspan="1">16 bytes</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Minimum Pepper Length</td>
              <td align="left" colspan="1" rowspan="1">32 bytes</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="authentication-and-rotation" numbered="true" toc="include" removeInRFC="false" pn="section-4.3">
        <name slugifiedName="name-authentication-and-rotation">Authentication and Rotation</name>
        <t indent="0" pn="section-4.3-1">
          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 indent="0" pn="section-4.3-2">
          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 indent="0" pn="section-4.3-3">
          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 a cryptographically secure hash function such
          as SHA256 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="include" removeInRFC="false" pn="section-5">
      <name slugifiedName="name-kdf-recommendations">KDF Recommendations</name>
      <t indent="0" pn="section-5-1">
        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 indent="0" pn="section-5-2">
        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="include" removeInRFC="false" pn="section-5.1">
        <name slugifiedName="name-argon2">Argon2</name>
        <t indent="0" pn="section-5.1-1">
          <xref target="ARGON2ESP" format="default" sectionFormat="of" derivedContent="ARGON2ESP">Argon2</xref> is the 2015 winner of the
          Password Hashing Competition and has been recomended by OWASP for
          password hashing.
        </t>
        <t indent="0" pn="section-5.1-2">
          Security considerations, test vectors, and parameters for tuning
          argon2 can be found in <xref target="I-D.irtf-cfrg-argon2" format="default" sectionFormat="of" derivedContent="I-D.irtf-cfrg-argon2"/>.
          They are copied here for easier reference.
        </t>
        <table anchor="argon2id-params" align="center" pn="table-2">
          <name slugifiedName="name-argon-parameters">Argon Parameters</name>
          <thead>
            <tr>
              <th align="center" colspan="1" rowspan="1">Parameter</th>
              <th align="center" colspan="1" rowspan="1">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">Degree of parallelism (p)</td>
              <td align="left" colspan="1" rowspan="1">1</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Minimum memory size (m)</td>
              <td align="left" colspan="1" rowspan="1">32*1024</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Minimum number of iterations (t)</td>
              <td align="left" colspan="1" rowspan="1">1</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Algorithm type (y)</td>
              <td align="left" colspan="1" rowspan="1">Argon2id (2)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="bcrypt-recommendations" numbered="true" toc="include" removeInRFC="false" pn="section-5.2">
        <name slugifiedName="name-bcrypt">Bcrypt</name>
        <t indent="0" pn="section-5.2-1">
          <xref target="BCRYPT" format="default" sectionFormat="of" derivedContent="BCRYPT">bcrypt</xref> is a Blowfish-based KDF that is
          the current OWASP recommendation for password hashing.
        </t>
        <table anchor="bcrypt-params" align="center" pn="table-3">
          <name slugifiedName="name-bcrypt-parameters">Bcrypt Parameters</name>
          <thead>
            <tr>
              <th align="center" colspan="1" rowspan="1">Parameter</th>
              <th align="center" colspan="1" rowspan="1">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">Recommended Cost</td>
              <td align="left" colspan="1" rowspan="1">12</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Maximum Password Length</td>
              <td align="left" colspan="1" rowspan="1">50-72 bytes depending on the implementation</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="pbkdf2" numbered="true" toc="include" removeInRFC="false" pn="section-5.3">
        <name slugifiedName="name-pbkdf2">PBKDF2</name>
        <t indent="0" pn="section-5.3-1">
          <xref target="RFC8018" format="default" sectionFormat="of" derivedContent="RFC8018">PBKDF2</xref> is used by the <xref target="RFC5802" format="default" sectionFormat="of" derivedContent="RFC5802">SCRAM</xref> family of SASL mechanisms.
        </t>
        <table anchor="pbkdf2-params" align="center" pn="table-4">
          <name slugifiedName="name-pbkdf2-parameters">PBKDF2 Parameters</name>
          <thead>
            <tr>
              <th align="center" colspan="1" rowspan="1">Parameter</th>
              <th align="center" colspan="1" rowspan="1">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">Minimum iteration count (c)</td>
              <td align="left" colspan="1" rowspan="1">10,000</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Hash</td>
              <td align="left" colspan="1" rowspan="1">SHA256</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Output length (dkLen)</td>
              <td align="left" colspan="1" rowspan="1">hLen (length of the chosen hash)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="scrypt-recommendations" numbered="true" toc="include" removeInRFC="false" pn="section-5.4">
        <name slugifiedName="name-scrypt">Scrypt</name>
        <t indent="0" pn="section-5.4-1">
          The <xref target="SCRYPT" format="default" sectionFormat="of" derivedContent="SCRYPT"/> KDF is designed to be memory-hard and
          sequential memory-hard to prevent against custom hardware based
          attacks.
        </t>
        <t indent="0" pn="section-5.4-2">
          Security considerations, test vectors, and further notes on tuning
          scrypt may be found in <xref target="RFC7914" format="default" sectionFormat="of" derivedContent="RFC7914"/>.
        </t>
        <table anchor="scrypt-params" align="center" pn="table-5">
          <name slugifiedName="name-scrypt-parameters">Scrypt Parameters</name>
          <thead>
            <tr>
              <th align="center" colspan="1" rowspan="1">Parameter</th>
              <th align="center" colspan="1" rowspan="1">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">Minimum CPU/Memory cost parameter (N)</td>
              <td align="left" colspan="1" rowspan="1">32768 (N=2^15)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Blocksize (r)</td>
              <td align="left" colspan="1" rowspan="1">8</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Parallelization parameter (p)</td>
              <td align="left" colspan="1" rowspan="1">1</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">Output length (dkLen)</td>
              <td align="left" colspan="1" rowspan="1">hLen (length of the chosen hash)</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="password-complexity" numbered="true" toc="include" removeInRFC="false" pn="section-6">
      <name slugifiedName="name-password-complexity-require">Password Complexity Requirements</name>
      <t indent="0" pn="section-6-1">
        Before any other password complexity requirements are checked, the
        preparation and enforcement steps of the OpaqueString profile of <xref target="RFC8265" format="default" sectionFormat="of" derivedContent="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 indent="0" pn="section-6-2">
        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="include" removeInRFC="false" pn="section-7">
      <name slugifiedName="name-internationalization-consid">Internationalization Considerations</name>
      <t indent="0" pn="section-7-1">
        The PRECIS framework (Preparation, Enforcement, and Comparison of
        Internationalized Strings) defined in <xref target="RFC8264" format="default" sectionFormat="of" derivedContent="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" format="default" sectionFormat="of" derivedContent="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>
    </section>
    <section anchor="security-considerations" numbered="true" toc="include" removeInRFC="false" pn="section-8">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-8-1">
        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" format="default" sectionFormat="of" derivedContent="OWASP.CS.passwords"/>, <xref target="NISTSP63b" format="default" sectionFormat="of" derivedContent="NISTSP63b"/>, and
        <xref target="NISTSP132" format="default" sectionFormat="of" derivedContent="NISTSP132"/>.
      </t>
      <t indent="0" pn="section-8-2">
        The "-PLUS" variants of <xref target="RFC5802" format="default" sectionFormat="of" derivedContent="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" format="default" sectionFormat="of" derivedContent="RFC5802"/> the <xref target="RFC5929" format="default" sectionFormat="of" derivedContent="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" format="default" sectionFormat="of" derivedContent="RFC7627">TLS extended
        master secret fix</xref> and the <xref target="RFC5746" format="default" sectionFormat="of" derivedContent="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 indent="0" pn="section-8-3">
        For <xref target="RFC8446" format="default" sectionFormat="of" derivedContent="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="include" removeInRFC="false" pn="section-9">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <t indent="0" pn="section-9-1">
        This document has no actions for IANA.
      </t>
    </section>
  </middle>
  <back>
    <references pn="section-10">
      <name slugifiedName="name-references">References</name>
      <references pn="section-10.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="IANA.sasl.mechanisms" target="https://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.xhtml" quoteTitle="true" derivedAnchor="IANA.sasl.mechanisms">
          <front>
            <title>Simple Authentication and Security Layer (SASL) Mechanisms</title>
            <author fullname="" initials="" surname="IETF">
              <organization showOnFrontPage="true">IETF</organization>
            </author>
            <date year="2015" month="November"/>
          </front>
          <format type="TXT" target="https://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.txt"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.2119.xml" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="1997" month="March"/>
            <abstract>
              <t indent="0">In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC4949" target="https://www.rfc-editor.org/info/rfc4949" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.4949.xml" quoteTitle="true" derivedAnchor="RFC4949">
          <front>
            <title>Internet Security Glossary, Version 2</title>
            <author initials="R." surname="Shirey" fullname="R. Shirey">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2007" month="August"/>
            <abstract>
              <t indent="0">This Glossary provides definitions, abbreviations, and explanations of terminology for information system security. The 334 pages of entries offer recommendations to improve the comprehensibility of written material that is generated in the Internet Standards Process (RFC 2026). The recommendations follow the principles that such writing should (a) use the same term or definition whenever the same concept is mentioned; (b) use terms in their plainest, dictionary sense; (c) use terms that are already well-established in open publications; and (d) avoid terms that either favor a particular vendor or favor a particular technology or mechanism over other, competing techniques that already exist or could be developed.  This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="FYI" value="36"/>
          <seriesInfo name="RFC" value="4949"/>
          <seriesInfo name="DOI" value="10.17487/RFC4949"/>
        </reference>
        <reference anchor="RFC5746" target="https://www.rfc-editor.org/info/rfc5746" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.5746.xml" quoteTitle="true" derivedAnchor="RFC5746">
          <front>
            <title>Transport Layer Security (TLS) Renegotiation Indication Extension</title>
            <author initials="E." surname="Rescorla" fullname="E. Rescorla">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M." surname="Ray" fullname="M. Ray">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="S." surname="Dispensa" fullname="S. Dispensa">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="N." surname="Oskov" fullname="N. Oskov">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2010" month="February"/>
            <abstract>
              <t indent="0">Secure Socket Layer (SSL) and Transport Layer Security (TLS) renegotiation are vulnerable to an attack in which the attacker forms a TLS connection with the target server, injects content of his choice, and then splices in a new TLS connection from a client.  The server treats the client's initial TLS handshake as a renegotiation and thus believes that the initial data transmitted by the attacker is from the same entity as the subsequent client data.  This specification defines a TLS extension to cryptographically tie renegotiations to the TLS connections they are being performed over, thus preventing this attack.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5746"/>
          <seriesInfo name="DOI" value="10.17487/RFC5746"/>
        </reference>
        <reference anchor="RFC5929" target="https://www.rfc-editor.org/info/rfc5929" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.5929.xml" quoteTitle="true" derivedAnchor="RFC5929">
          <front>
            <title>Channel Bindings for TLS</title>
            <author initials="J." surname="Altman" fullname="J. Altman">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="N." surname="Williams" fullname="N. Williams">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="L." surname="Zhu" fullname="L. Zhu">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2010" month="July"/>
            <abstract>
              <t indent="0">This document defines three channel binding types for Transport Layer Security (TLS), tls-unique, tls-server-end-point, and tls-unique-for-telnet, in accordance with RFC 5056 (On Channel Binding).</t>
              <t indent="0">Note that based on implementation experience, this document changes the original definition of 'tls-unique' channel binding type in the channel binding type IANA registry.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5929"/>
          <seriesInfo name="DOI" value="10.17487/RFC5929"/>
        </reference>
        <reference anchor="RFC7627" target="https://www.rfc-editor.org/info/rfc7627" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.7627.xml" quoteTitle="true" derivedAnchor="RFC7627">
          <front>
            <title>Transport Layer Security (TLS) Session Hash and Extended Master Secret Extension</title>
            <author initials="K." surname="Bhargavan" fullname="K. Bhargavan" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="A." surname="Delignat-Lavaud" fullname="A. Delignat-Lavaud">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="A." surname="Pironti" fullname="A. Pironti">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="A." surname="Langley" fullname="A. Langley">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M." surname="Ray" fullname="M. Ray">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2015" month="September"/>
            <abstract>
              <t indent="0">The Transport Layer Security (TLS) master secret is not cryptographically bound to important session parameters such as the server certificate.  Consequently, it is possible for an active attacker to set up two sessions, one with a client and another with a server, such that the master secrets on the two sessions are the same.  Thereafter, any mechanism that relies on the master secret for authentication, including session resumption, becomes vulnerable to a man-in-the-middle attack, where the attacker can simply forward messages back and forth between the client and server.  This specification defines a TLS extension that contextually binds the master secret to a log of the full handshake that computes it, thus preventing such attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7627"/>
          <seriesInfo name="DOI" value="10.17487/RFC7627"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8174.xml" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="B. Leiba">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2017" month="May"/>
            <abstract>
              <t indent="0">RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references pn="section-10.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="ARGON2ESP" target="https://www.cryptolux.org/images/d/d0/Argon2ESP.pdf" quoteTitle="true" derivedAnchor="ARGON2ESP">
          <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="BCRYPT" quoteTitle="true" derivedAnchor="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="I-D.irtf-cfrg-argon2" xml:base="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.draft-irtf-cfrg-argon2-10.xml" quoteTitle="true" target="https://tools.ietf.org/html/draft-irtf-cfrg-argon2-10" derivedAnchor="I-D.irtf-cfrg-argon2">
          <front>
            <title>The memory-hard Argon2 password hash and proof-of-work function</title>
            <author initials="A" surname="Biryukov" fullname="Alex Biryukov">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="D" surname="Dinu" fullname="Daniel Dinu">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="D" surname="Khovratovich" fullname="Dmitry Khovratovich">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="S" surname="Josefsson" fullname="Simon Josefsson">
              <organization showOnFrontPage="true"/>
            </author>
            <date month="March" day="25" year="2020"/>
            <abstract>
              <t indent="0">This document describes the Argon2 memory-hard function for password hashing and proof-of-work applications.  We provide an implementer- oriented description with test vectors.  The purpose is to simplify adoption of Argon2 for Internet protocols.  This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-argon2-10"/>
          <format type="TXT" target="http://www.ietf.org/internet-drafts/draft-irtf-cfrg-argon2-10.txt"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="NISTSP132" target="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf" quoteTitle="true" derivedAnchor="NISTSP132">
          <front>
            <title>Recommendation for Password-Based Key Derivation Part 1: Storage Applications</title>
            <author initials="M." surname="Turan" fullname="Meltem Sönmez Turan">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="E." surname="Barker" fullname="Elaine Barker">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="W." surname="Burr" fullname="William Burr">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="L." surname="Chen" fullname="Lily Chen">
              <organization showOnFrontPage="true">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" quoteTitle="true" derivedAnchor="NISTSP63-3">
          <front>
            <title>Digital Identity Guidelines</title>
            <author initials="P." surname="Grassi" fullname="Paul A. Grassi">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="M." surname="Garcia" fullname="Michael E. Garcia">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="J." surname="Fenton" fullname="James L. Fenton">
              <organization showOnFrontPage="true">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" quoteTitle="true" derivedAnchor="NISTSP63b">
          <front>
            <title>Digital Identity Guidelines: Authentication and Lifecycle Management</title>
            <author initials="P." surname="Grassi" fullname="Paul A. Grassi">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="J." surname="Fenton" fullname="James L. Fenton">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="E." surname="Newton" fullname="Elaine M. Newton">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="R." surname="Perlner" fullname="Ray A. Perlner">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="A." surname="Regenscheid" fullname="Andrew R. Regenscheid">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="W." surname="Burr" fullname="William E. Burr">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="J." surname="Richer" fullname="Justin P. Richer">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="N." surname="Lefkovitz" fullname="Naomi B. Lefkovitz">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="J." surname="Danker" fullname="Jamie M. Danker">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="Y." surname="Choong" fullname="Yee-Yin Choong">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="K." surname="Greene" fullname="Kristen K. Greene">
              <organization showOnFrontPage="true">National Institute of Standards and Technology</organization>
            </author>
            <author initials="M." surname="Theofanos" fullname="Mary F. Theofanos">
              <organization showOnFrontPage="true">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" quoteTitle="true" derivedAnchor="OWASP.CS.passwords">
          <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>
        <reference anchor="RFC4422" target="https://www.rfc-editor.org/info/rfc4422" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.4422.xml" quoteTitle="true" derivedAnchor="RFC4422">
          <front>
            <title>Simple Authentication and Security Layer (SASL)</title>
            <author initials="A." surname="Melnikov" fullname="A. Melnikov" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="K." surname="Zeilenga" fullname="K. Zeilenga" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2006" month="June"/>
            <abstract>
              <t indent="0">The Simple Authentication and Security Layer (SASL) is a framework for providing authentication and data security services in connection-oriented protocols via replaceable mechanisms.  It provides a structured interface between protocols and mechanisms.  The resulting framework allows new protocols to reuse existing mechanisms and allows old protocols to make use of new mechanisms.  The framework also provides a protocol for securing subsequent protocol exchanges within a data security layer.</t>
              <t indent="0">This document describes how a SASL mechanism is structured, describes how protocols include support for SASL, and defines the protocol for carrying a data security layer over a connection.  In addition, this document defines one SASL mechanism, the EXTERNAL mechanism.</t>
              <t indent="0">This document obsoletes RFC 2222.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4422"/>
          <seriesInfo name="DOI" value="10.17487/RFC4422"/>
        </reference>
        <reference anchor="RFC5802" target="https://www.rfc-editor.org/info/rfc5802" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.5802.xml" quoteTitle="true" derivedAnchor="RFC5802">
          <front>
            <title>Salted Challenge Response Authentication Mechanism (SCRAM) SASL and GSS-API Mechanisms</title>
            <author initials="C." surname="Newman" fullname="C. Newman">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="A." surname="Menon-Sen" fullname="A. Menon-Sen">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="A." surname="Melnikov" fullname="A. Melnikov">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="N." surname="Williams" fullname="N. Williams">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2010" month="July"/>
            <abstract>
              <t indent="0">The secure authentication mechanism most widely deployed and used by Internet application protocols is the transmission of clear-text passwords over a channel protected by Transport Layer Security (TLS). There are some significant security concerns with that mechanism, which could be addressed by the use of a challenge response authentication mechanism protected by TLS.  Unfortunately, the challenge response mechanisms presently on the standards track all fail to meet requirements necessary for widespread deployment, and have had success only in limited use.</t>
              <t indent="0">This specification describes a family of Simple Authentication and Security Layer (SASL; RFC 4422) authentication mechanisms called the Salted Challenge Response Authentication Mechanism (SCRAM), which addresses the security concerns and meets the deployability requirements.  When used in combination with TLS or an equivalent security layer, a mechanism from this family could improve the status quo for application protocol authentication and provide a suitable choice for a mandatory-to-implement mechanism for future application protocol standards.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5802"/>
          <seriesInfo name="DOI" value="10.17487/RFC5802"/>
        </reference>
        <reference anchor="RFC6331" target="https://www.rfc-editor.org/info/rfc6331" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.6331.xml" quoteTitle="true" derivedAnchor="RFC6331">
          <front>
            <title>Moving DIGEST-MD5 to Historic</title>
            <author initials="A." surname="Melnikov" fullname="A. Melnikov">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2011" month="July"/>
            <abstract>
              <t indent="0">This memo describes problems with the DIGEST-MD5 Simple Authentication and Security Layer (SASL) mechanism as specified in RFC 2831.  It marks DIGEST-MD5 as OBSOLETE in the IANA Registry of SASL mechanisms and moves RFC 2831 to Historic status.  This document  is not an Internet Standards Track specification; it is  published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6331"/>
          <seriesInfo name="DOI" value="10.17487/RFC6331"/>
        </reference>
        <reference anchor="RFC7677" target="https://www.rfc-editor.org/info/rfc7677" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.7677.xml" quoteTitle="true" derivedAnchor="RFC7677">
          <front>
            <title>SCRAM-SHA-256 and SCRAM-SHA-256-PLUS Simple Authentication and Security Layer (SASL) Mechanisms</title>
            <author initials="T." surname="Hansen" fullname="T. Hansen">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2015" month="November"/>
            <abstract>
              <t indent="0">This document registers the Simple Authentication and Security Layer (SASL) mechanisms SCRAM-SHA-256 and SCRAM-SHA-256-PLUS, provides guidance for secure implementation of the original SCRAM-SHA-1-PLUS mechanism, and updates the SCRAM registration procedures of RFC 5802.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7677"/>
          <seriesInfo name="DOI" value="10.17487/RFC7677"/>
        </reference>
        <reference anchor="RFC7914" target="https://www.rfc-editor.org/info/rfc7914" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.7914.xml" quoteTitle="true" derivedAnchor="RFC7914">
          <front>
            <title>The scrypt Password-Based Key Derivation Function</title>
            <author initials="C." surname="Percival" fullname="C. Percival">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="S." surname="Josefsson" fullname="S. Josefsson">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2016" month="August"/>
            <abstract>
              <t indent="0">This document specifies the password-based key derivation function scrypt.  The function derives one or more secret keys from a secret string.  It is based on memory-hard functions, which offer added protection against attacks using custom hardware.  The document also provides an ASN.1 schema.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7914"/>
          <seriesInfo name="DOI" value="10.17487/RFC7914"/>
        </reference>
        <reference anchor="RFC8018" target="https://www.rfc-editor.org/info/rfc8018" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8018.xml" quoteTitle="true" derivedAnchor="RFC8018">
          <front>
            <title>PKCS #5: Password-Based Cryptography Specification Version 2.1</title>
            <author initials="K." surname="Moriarty" fullname="K. Moriarty" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="B." surname="Kaliski" fullname="B. Kaliski">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="A." surname="Rusch" fullname="A. Rusch">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2017" month="January"/>
            <abstract>
              <t indent="0">This document provides recommendations for the implementation of password-based cryptography, covering key derivation functions, encryption schemes, message authentication schemes, and ASN.1 syntax identifying the techniques.</t>
              <t indent="0">This document represents a republication of PKCS #5 v2.1 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series.  By publishing this RFC, change control is transferred to the IETF.</t>
              <t indent="0">This document also obsoletes RFC 2898.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8018"/>
          <seriesInfo name="DOI" value="10.17487/RFC8018"/>
        </reference>
        <reference anchor="RFC8264" target="https://www.rfc-editor.org/info/rfc8264" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8264.xml" quoteTitle="true" derivedAnchor="RFC8264">
          <front>
            <title>PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols</title>
            <author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M." surname="Blanchet" fullname="M. Blanchet">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2017" month="October"/>
            <abstract>
              <t indent="0">Application protocols using Unicode code points in protocol strings need to properly handle such strings in order to enforce internationalization rules for strings placed in various protocol slots (such as addresses and identifiers) and to perform valid comparison operations (e.g., for purposes of authentication or authorization).  This document defines a framework enabling application protocols to perform the preparation, enforcement, and comparison of internationalized strings ("PRECIS") in a way that depends on the properties of Unicode code points and thus is more agile with respect to versions of Unicode.  As a result, this framework provides a more sustainable approach to the handling of internationalized strings than the previous framework, known as Stringprep (RFC 3454).  This document obsoletes RFC 7564.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8264"/>
          <seriesInfo name="DOI" value="10.17487/RFC8264"/>
        </reference>
        <reference anchor="RFC8265" target="https://www.rfc-editor.org/info/rfc8265" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8265.xml" quoteTitle="true" derivedAnchor="RFC8265">
          <front>
            <title>Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords</title>
            <author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="A." surname="Melnikov" fullname="A. Melnikov">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2017" month="October"/>
            <abstract>
              <t indent="0">This document describes updated methods for handling Unicode strings representing usernames and passwords.  The previous approach was known as SASLprep (RFC 4013) and was based on Stringprep (RFC 3454). The methods specified in this document provide a more sustainable approach to the handling of internationalized usernames and passwords.  This document obsoletes RFC 7613.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8265"/>
          <seriesInfo name="DOI" value="10.17487/RFC8265"/>
        </reference>
        <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446" xml:base="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8446.xml" quoteTitle="true" derivedAnchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author initials="E." surname="Rescorla" fullname="E. Rescorla">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2018" month="August"/>
            <abstract>
              <t indent="0">This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t indent="0">This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="SCRYPT" quoteTitle="true" derivedAnchor="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>
      </references>
    </references>
    <section anchor="acknowledgments" numbered="true" toc="include" removeInRFC="false" pn="section-appendix.a">
      <name slugifiedName="name-acknowledgments">Acknowledgments</name>
      <t indent="0" pn="section-appendix.a-1">
        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 indent="0" pn="section-appendix.a-2">
        Thanks also to Cameron Paul and Thomas Copeland for their reviews and
        suggestions.
      </t>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.b">
      <name slugifiedName="name-authors-address">Author's Address</name>
      <author initials="S" surname="Whited" fullname="Sam Whited">
        <organization showOnFrontPage="true"/>
        <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>
    </section>
  </back>
</rfc>
