ScaffoldBench

RunOpus 5.5repeat 2

Plan-execute on OWASP vs NIST on password hashing

claude-opus-5-5__plan-execute__research-password-hashing__r2

Score

1.000

passed
design ran as designed
Cost
$0.606
+ $0.123 judging
Latency
1m 53s
setup 0.0s, grading 6.1s
Turns
28
Tool calls
25
Subagents
0
Tokens in / out
277k / 13k
235,026 read from cache

Did the design run?

every check held
  • Run completed: heldharness.run-completedThe environment was built, the architecture returned and grading finished, none of them throwing.
  • No API failures: heldharness.apiNo model call failed at the API.
  • Every call ended: heldharness.calls-endedEvery call ended with a result, or was stopped by the run's own limits.
  • No harness tool denied: heldharness.harness-toolsThe sandbox guard never denied a harness tool, nor a tool the session itself offered.
  • Tool servers connected: heldharness.mcp-connectedEvery tool server the harness gave a call was connected when the session started.
  • No foreign tool servers: heldharness.mcp-hermeticNo call loaded a tool server the harness did not give it.
  • Builtin tools: heldharness.builtin-toolsA check recorded with the run.
  • Structured replies arrived: heldharness.structured-outputEvery call that asked for structured output and ran to the end got it.
  • No silent fallbacks: heldharness.not-degradedNo phase fell back on a default (an empty plan, a default winner) instead of its output.
  • Judge answered: heldharness.judgeAt least one grading call returned a usable verdict.
  • The plan was a plan: heldplan-execute.planThe planner’s reply was read through its schema and held at least one step.
  • Each call was shown the right tools: heldplan-execute.toolsThe planner was shown no tools and the executor the task’s full toolset.

Phases

Plan: 0.0s to 20.9s, finished, 0 tool calls, $0.050
Execute: 20.9s to 1m 53s, finished, 25 tool calls, $0.557

Drawn from the phase records: timing and cost per call, no tool calls or messages.

PhaseDurationCostTurnsToolsModel
Plan20.9s$0.05020claude-opus-5-5
Execute1m 32s$0.5572625claude-opus-5-5

The call-by-call replay is not published for this run. Traces are large, so the repository keeps 9 of this run set’s 900 and leaves the rest out; the score, phases and final answer on this page come from the committed run record.

Runs you can replay

Record this cell yourself: npm run bench -- run --strategies plan-execute --tasks research-password-hashing --models claude-opus-5-5 --repeats 1

Score breakdown

  • passStates that OWASP recommends Argon2id first, with a minimum configuration of 19 MiB of memory, an iteration count of 2 and 1 degree of parallelism.
    1.00weight 0.19

    met, backed by verified evidence E1. “**Argon2id first**, with at least 19 MiB of memory, 2 iterations and parallelism 1.”

  • passStates OWASP's alternatives as conditions: scrypt if Argon2id is not available, bcrypt only for legacy systems, and PBKDF2 (at least 600,000 iterations with HMAC-SHA-256) if FIPS-140 compliance is required.
    1.00weight 0.13

    met, backed by verified evidence E2, E3, E4. “**PBKDF2 when FIPS-140 compliance is required**: 600,000 or more iterations with HMAC-SHA-256”

  • passStates that the current NIST SP 800-63B (revision 4) requires passwords to be salted and hashed with a suitable password hashing scheme that takes a cost factor, and says an approved scheme from the latest revision of SP 800-132 (or updated NIST guidelines) SHOULD be used.
    1.00weight 0.19

    met, backed by verified evidence E11, E12, E13. “**SHALL:** passwords must be salted and hashed using a "suitable password hashing scheme."”

  • passStates that the superseded revision 3 named PBKDF2 and Balloon as example key derivation functions and said a memory-hard function SHOULD be used, and that revision 4 no longer contains that wording.
    1.00weight 0.13

    met, backed by verified evidence E22, E23, E9. “Rev. 3 named PBKDF2 and Balloon as examples.”

  • passExplains that for this team the two do not actually conflict: OWASP's own guidance is to use PBKDF2 (HMAC-SHA-256, at least 600,000 iterations) when FIPS-140 compliance is required, and NIST permits PBKDF2, so PBKDF2-HMAC-SHA-256 satisfies both; Argon2id remains OWASP's choice only where FIPS does not apply.
    1.00weight 0.25

    met, backed by verified evidence E4, E5. “This is OWASP's FIPS choice and fits NIST's pointer to SP 800-132.”

  • passStates at least one requirement both sources share, such as a unique salt for every password or a deliberately expensive hash with a tunable cost (work) factor instead of a fast general-purpose hash.
    1.00weight 0.13

    met, backed by verified evidence E15, E12, E4. “random and unique per password, at least 32 bits (NIST's minimum)”

Penalties

No penalties were applied.

Scorer metadata

corpus
{"version":2,"snapshot":"2026-10-01","hash":"e12dc326c69a32d91f85f6355dc63e2a7d672b605685a1ffa1582a42bb1c561e","documents":5}
opened documents
["owasp-password-storage","nist-sp800-63b-4","nist-sp800-63b-3"]
opened by role
{"primary":["owasp-password-storage","nist-sp800-63b-4"],"superseded":["nist-sp800-63b-3"]}
displayed share
{"owasp-password-storage":1,"rfc9106":0.0166,"nist-sp800-63b-4":0.1536,"nist-sp800-63b-3":0.0935,"owasp-authentication":0.0213}
cited count
3
verified count
3
hallucinated count
0
citation integrity
1
hallucinated urls
[]
evidence block
true
evidence block repaired
false
evidence count
24
verified quote count
24
verified quote rate
1
evidence
[{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP's first choice is Argon2id with at least 19 MiB memory, 2 iterations, parallelism 1.","quote":"Use Argon2id with a minimum configuration of 19 MiB of memory, an iteration count of 2, and 1 degree of parallelism.","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP's second choice is scrypt with N=2^17, r=8, p=1.","quote":"If Argon2id is not available, use scrypt with a minimum CPU/memory cost parameter of (2^17), a minimum block size of 8 (1024 bytes), and a parallelization parameter of 1.","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP limits bcrypt to legacy systems, with work factor 10 or more and a 72-byte limit.","quote":"For legacy systems using bcrypt, use a work factor of 10 or more and with a password limit of 72 bytes.","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP says to use PBKDF2-HMAC-SHA-256 with 600,000 or more iterations when FIPS-140 compliance is required.","quote":"If FIPS-140 compliance is required, use PBKDF2 with a work factor of 600,000 or more and set with an internal hash function of HMAC-SHA-256.","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP justifies PBKDF2 for FIPS contexts by NIST SP 800-63B-4 permission and FIPS-140 validated implementations.","quote":"Since PBKDF2 is permitted by NIST SP 800-63B-4 and has FIPS-140 validated implementations, it should be the preferred algorithm when these are required.","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP treats a pepper as optional defence in depth.","quote":"Consider using a pepper to provide additional defense in depth (though alone, it provides no additional secure characteristics).","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP says peppers belong in secrets vaults or HSMs.","quote":"Peppers are secrets and should be stored in \"secrets vaults\" or HSMs (Hardware Security Modules).","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP recommends re-hashing with the new work factor at the user's next login.","quote":"The most common approach to upgrading the work factor is to wait until the user next authenticates, then re-hash their password with the new work factor.","verified":true,"document":"owasp-password-storage"},{"url":"https://pages.nist.gov/800-63-3/sp800-63b.html","claim":"Rev. 3 of SP 800-63 was superseded by SP 800-63-4 on August 1, 2025.","quote":"This revision of NIST SP 800-63 has been superseded by NIST SP 800-63-4 as of August 1, 2025.","verified":true,"document":"nist-sp800-63b-3"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 supersedes the earlier SP 800-63B.","quote":"This publication supersedes NIST Special Publication (SP) 800-63B.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 requires passwords to be salted and hashed with a suitable password hashing scheme.","quote":"Passwords SHALL be salted and hashed using a suitable password hashing scheme.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 says the cost factor should be as high as practical.","quote":"The chosen cost factor SHOULD be as high as practical without negatively impacting verifier performance.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 points to approved schemes in SP 800-132 as a SHOULD and names no algorithm.","quote":"An approved password hashing scheme published in the latest revision of [SP800-132] or updated NIST guidelines on password hashing schemes SHOULD be used.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 cites SP 800-132 as its recommendation on password-based key derivation.","quote":"[SP800-132] Turan M, Barker E, Burr W, Chen L (2010) Recommendation for Password-Based Key Derivation.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 requires a salt of at least 32 bits.","quote":"The salt SHALL be at least 32 bits in length and chosen to minimize salt value collisions among stored hashes (i.e., to prevent multiple subscriber accounts from having the same hashed password).","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 says the scheme and cost factor should be stored with each password to allow migration.","quote":"A reference to the password hashing scheme used, including the cost factor, SHOULD be stored for each password to allow migration to new algorithms and work factors.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 recommends an extra keyed hashing step with a verifier-only secret key.","quote":"In addition, verifiers SHOULD perform an additional iteration of a keyed hashing or encryption operation using a secret key known only to the verifier.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 requires the secret key to be stored apart from the hashes.","quote":"The secret key value SHALL be stored separately from the hashed passwords.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 says the secret key should be stored and used in an HSM or TEE.","quote":"It SHOULD be stored and used within a hardware-protected area, such as a hardware security module or trusted execution environment (TEE), such as a trusted platform module (TPM).","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 requires FIPS 140 validation of cryptography used by federal verifiers at AAL1.","quote":"Cryptography used by verifiers operated by or on behalf of federal agencies at AAL1 SHALL be validated to meet the requirements of [FIPS140] Level 1.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-4/sp800-63b.html","claim":"SP 800-63B-4 defines approved cryptography as FIPS-approved or NIST-recommended.","quote":"An encryption algorithm, hash function, random bit generator, or similar technique that is Federal Information Processing Standards (FIPS)-approved or NIST-recommended.","verified":true,"document":"nist-sp800-63b-4"},{"url":"https://pages.nist.gov/800-63-3/sp800-63b.html","claim":"The superseded Rev. 3 named PBKDF2 and Balloon as example functions.","quote":"Examples of suitable key derivation functions include Password-based Key Derivation Function 2 (PBKDF2) [SP 800-132] and Balloon [BALLOON].","verified":true,"document":"nist-sp800-63b-3"},{"url":"https://pages.nist.gov/800-63-3/sp800-63b.html","claim":"The superseded Rev. 3 recommended a memory-hard function.","quote":"A memory-hard function SHOULD be used because it increases the cost of an attack.","verified":true,"document":"nist-sp800-63b-3"},{"url":"https://pages.nist.gov/800-63-3/sp800-63b.html","claim":"The superseded Rev. 3 suggested at least 10,000 PBKDF2 iterations.","quote":"Therefore, the iteration count SHOULD be as large as verification server performance will allow, typically at least 10,000 iterations.","verified":true,"document":"nist-sp800-63b-3"}]
judge unverified quotes
0
judge verdicts
[{"owasp-argon2id":{"status":"met","support":["E1"]},"owasp-conditions":{"status":"met","support":["E2","E3","E4"]},"nist-current":{"status":"met","support":["E11","E12","E13"]},"nist-revision":{"status":"met","support":["E22","E23","E9"]},"reconciliation":{"status":"met","support":["E4","E5"]},"common-ground":{"status":"met","support":["E15","E12","E4"]}},{"owasp-argon2id":{"status":"met","support":["E1"]},"owasp-conditions":{"status":"met","support":["E2","E3","E4"]},"nist-current":{"status":"met","support":["E11","E12","E13"]},"nist-revision":{"status":"met","support":["E22","E23","E9"]},"reconciliation":{"status":"met","support":["E4","E5"]},"common-ground":{"status":"met","support":["E15","E12","E4"]}},{"owasp-argon2id":{"status":"met","support":["E1"]},"owasp-conditions":{"status":"met","support":["E2","E3","E4"]},"nist-current":{"status":"met","support":["E11","E12","E13"]},"nist-revision":{"status":"met","support":["E22","E23","E9"]},"reconciliation":{"status":"met","support":["E4","E5","E13"]},"common-ground":{"status":"met","support":["E15","E12","E4"]}}]
judge failures
0
grounded weight share
1

Final answer

I've gathered the sources and am now writing the answer. Short version: use PBKDF2-HMAC-SHA-256 from a FIPS 140-validated crypto module, with at least 600,000 iterations, plus a secret key held in an HSM. That meets OWASP's FIPS recommendation and the current NIST requirements. Argon2id, OWASP's first choice, belongs only in systems with no FIPS obligation.

1. What OWASP recommends

The OWASP Password Storage Cheat Sheet gives an order of preference (https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html):

  • Argon2id first, with at least 19 MiB of memory, 2 iterations and parallelism 1. The page lists other settings it treats as equally strong, such as 46 MiB with 1 iteration.
  • scrypt if Argon2id isn't available: N=2^17, r=8, p=1.
  • bcrypt only for legacy systems: work factor 10 or more, and passwords capped at 72 bytes.
  • PBKDF2 when FIPS-140 compliance is required: 600,000 or more iterations with HMAC-SHA-256 (220,000 for HMAC-SHA-512). It calls PBKDF2-HMAC-SHA1 legacy only.

OWASP explains the FIPS choice by saying PBKDF2 "is permitted by NIST SP 800-63B-4 and has FIPS-140 validated implementations." It also says to:

  • consider a pepper, kept out of the database in a secrets vault or HSM, for extra defence;
  • re-hash each password with the new settings the next time the user logs in;
  • store the algorithm and work factor with each hash (for example, the PHC string format).

2. What the current NIST SP 800-63B requires

Which revision is current. Revision 4 is current. The Rev. 3 page says it "has been superseded by NIST SP 800-63-4 as of August 1, 2025" (https://pages.nist.gov/800-63-3/sp800-63b.html). The Rev. 4 page says it "supersedes NIST Special Publication (SP) 800-63B" and carries a timestamp of 26 Aug 2025 (https://pages.nist.gov/800-63-4/sp800-63b.html). I couldn't open the NIST CSRC catalogue page to get the formal status line (it returned 404), so this relies on those two pages.

Password storage rules in Rev. 4, section 3.1.1.2 (https://pages.nist.gov/800-63-4/sp800-63b.html):

  • SHALL: passwords must be salted and hashed using a "suitable password hashing scheme."
  • SHALL: the salt must be at least 32 bits and chosen to avoid collisions. The salt and the hash must both be stored.
  • SHOULD: the cost factor should be as high as practical and should be raised over time.
  • SHOULD: use an "approved password hashing scheme published in the latest revision of [SP800-132] or updated NIST guidelines." Note this is a SHOULD, not a SHALL.
  • SHOULD: store a reference to the scheme and cost factor with each password, so it can be migrated later.
  • Secret key (pepper): verifiers SHOULD add a keyed hashing or encryption step with a key only the verifier knows. If they do, the key SHALL come from an approved random bit generator and SHALL be stored apart from the hashes. It SHOULD be stored and used inside an HSM or a trusted execution environment.

What Rev. 4 doesn't say. It names no algorithm (no PBKDF2, no Balloon, no Argon2) and gives no iteration count. Its reference list cites SP 800-132 as "Recommendation for Password-Based Key Derivation." I couldn't open SP 800-132 itself (404 errors), so I can't quote its text.

FIPS rules elsewhere in Rev. 4. It defines "approved" as FIPS-approved or NIST-recommended. It also says cryptography used by verifiers run by or for federal agencies at AAL1 (and, unless otherwise specified, AAL2) SHALL be FIPS 140 Level 1 validated. Applying that to the password-hashing step is my reading, not explicit wording in the document.

What changed from Rev. 3 (https://pages.nist.gov/800-63-3/sp800-63b.html, superseded):

  • Rev. 3 named PBKDF2 and Balloon as examples.
  • It said a "memory-hard function SHOULD be used."
  • It suggested "typically at least 10,000 iterations."
  • It called the key a "secret salt" and required at least 112 bits of security strength.

None of that wording carries over to Rev. 4, so don't quote it as current.

3. Where the sources disagree, and how to reconcile them

Differences

  • Algorithm: OWASP ranks Argon2id first. NIST Rev. 4 points only to "approved" schemes in SP 800-132, which the references list as a password-based key derivation document. OWASP's statement that PBKDF2 is "permitted by NIST SP 800-63B-4" is an inference; Rev. 4 never names PBKDF2.
  • Work factor: OWASP gives a number (600,000 for PBKDF2-HMAC-SHA-256). Rev. 4 gives none; it says only "as high as practical." The old 10,000 figure is Rev. 3 and outdated.
  • Pepper: OWASP says "consider" one. NIST makes it a SHOULD, with binding SHALL conditions if you use one.
  • Salt: NIST sets a 32-bit minimum. OWASP gives no length and notes that libraries usually generate salts for you.

Recommendation for a FIPS-bound service

  1. Algorithm: PBKDF2-HMAC-SHA-256 from a FIPS 140-validated module. This is OWASP's FIPS choice and fits NIST's pointer to SP 800-132.
  2. Iterations: at least 600,000 (OWASP's minimum). Go higher if login performance allows, which satisfies NIST's "as high as practical."
  3. Salt: random and unique per password, at least 32 bits (NIST's minimum). I'd suggest 128 bits, but that's my suggestion, not a source requirement.
  4. Secret key: apply an HMAC with a secret key generated by an approved random bit generator, kept in an HSM and away from the database. This is OWASP's "post-hashing pepper" and NIST's extra keyed step.
  5. Migration: store the algorithm and cost with each hash. When parameters change, re-hash on the user's next successful login.
  6. Where Argon2id fits: only in components with no FIPS obligation. The sources I read don't show Argon2id as NIST-approved.
{"evidence": [
{"claim": "OWASP's first choice is Argon2id with at least 19 MiB memory, 2 iterations, parallelism 1.", "quote": "Use Argon2id with a minimum configuration of 19 MiB of memory, an iteration count of 2, and 1 degree of parallelism.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP's second choice is scrypt with N=2^17, r=8, p=1.", "quote": "If Argon2id is not available, use scrypt with a minimum CPU/memory cost parameter of (2^17), a minimum block size of 8 (1024 bytes), and a parallelization parameter of 1.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP limits bcrypt to legacy systems, with work factor 10 or more and a 72-byte limit.", "quote": "For legacy systems using bcrypt, use a work factor of 10 or more and with a password limit of 72 bytes.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP says to use PBKDF2-HMAC-SHA-256 with 600,000 or more iterations when FIPS-140 compliance is required.", "quote": "If FIPS-140 compliance is required, use PBKDF2 with a work factor of 600,000 or more and set with an internal hash function of HMAC-SHA-256.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP justifies PBKDF2 for FIPS contexts by NIST SP 800-63B-4 permission and FIPS-140 validated implementations.", "quote": "Since PBKDF2 is permitted by NIST SP 800-63B-4 and has FIPS-140 validated implementations, it should be the preferred algorithm when these are required.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP treats a pepper as optional defence in depth.", "quote": "Consider using a pepper to provide additional defense in depth (though alone, it provides no additional secure characteristics).", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP says peppers belong in secrets vaults or HSMs.", "quote": "Peppers are secrets and should be stored in \"secrets vaults\" or HSMs (Hardware Security Modules).", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP recommends re-hashing with the new work factor at the user's next login.", "quote": "The most common approach to upgrading the work factor is to wait until the user next authenticates, then re-hash their password with the new work factor.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "Rev. 3 of SP 800-63 was superseded by SP 800-63-4 on August 1, 2025.", "quote": "This revision of NIST SP 800-63 has been superseded by NIST SP 800-63-4 as of August 1, 2025.", "url": "https://pages.nist.gov/800-63-3/sp800-63b.html"},
{"claim": "SP 800-63B-4 supersedes the earlier SP 800-63B.", "quote": "This publication supersedes NIST Special Publication (SP) 800-63B.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 requires passwords to be salted and hashed with a suitable password hashing scheme.", "quote": "Passwords SHALL be salted and hashed using a suitable password hashing scheme.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 says the cost factor should be as high as practical.", "quote": "The chosen cost factor SHOULD be as high as practical without negatively impacting verifier performance.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 points to approved schemes in SP 800-132 as a SHOULD and names no algorithm.", "quote": "An approved password hashing scheme published in the latest revision of [SP800-132] or updated NIST guidelines on password hashing schemes SHOULD be used.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 cites SP 800-132 as its recommendation on password-based key derivation.", "quote": "[SP800-132] Turan M, Barker E, Burr W, Chen L (2010) Recommendation for Password-Based Key Derivation.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 requires a salt of at least 32 bits.", "quote": "The salt SHALL be at least 32 bits in length and chosen to minimize salt value collisions among stored hashes (i.e., to prevent multiple subscriber accounts from having the same hashed password).", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 says the scheme and cost factor should be stored with each password to allow migration.", "quote": "A reference to the password hashing scheme used, including the cost factor, SHOULD be stored for each password to allow migration to new algorithms and work factors.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 recommends an extra keyed hashing step with a verifier-only secret key.", "quote": "In addition, verifiers SHOULD perform an additional iteration of a keyed hashing or encryption operation using a secret key known only to the verifier.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 requires the secret key to be stored apart from the hashes.", "quote": "The secret key value SHALL be stored separately from the hashed passwords.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 says the secret key should be stored and used in an HSM or TEE.", "quote": "It SHOULD be stored and used within a hardware-protected area, such as a hardware security module or trusted execution environment (TEE), such as a trusted platform module (TPM).", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 requires FIPS 140 validation of cryptography used by federal verifiers at AAL1.", "quote": "Cryptography used by verifiers operated by or on behalf of federal agencies at AAL1 SHALL be validated to meet the requirements of [FIPS140] Level 1.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "SP 800-63B-4 defines approved cryptography as FIPS-approved or NIST-recommended.", "quote": "An encryption algorithm, hash function, random bit generator, or similar technique that is Federal Information Processing Standards (FIPS)-approved or NIST-recommended.", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "The superseded Rev. 3 named PBKDF2 and Balloon as example functions.", "quote": "Examples of suitable key derivation functions include Password-based Key Derivation Function 2 (PBKDF2) [SP 800-132] and Balloon [BALLOON].", "url": "https://pages.nist.gov/800-63-3/sp800-63b.html"},
{"claim": "The superseded Rev. 3 recommended a memory-hard function.", "quote": "A memory-hard function SHOULD be used because it increases the cost of an attack.", "url": "https://pages.nist.gov/800-63-3/sp800-63b.html"},
{"claim": "The superseded Rev. 3 suggested at least 10,000 PBKDF2 iterations.", "quote": "Therefore, the iteration count SHOULD be as large as verification server performance will allow, typically at least 10,000 iterations.", "url": "https://pages.nist.gov/800-63-3/sp800-63b.html"}
]}

Provenance of the numbers on this page

run set
scaffold-or-scale-v1
models
Haiku 4.5, Sonnet 5.5, Opus 5.5
effort
high
repeats
2
fixtures
replay
runs
900 / 900
strategy cost
$354.44
judge cost
$9.19
wall clock
9h 48m
git
fce5807b2d

Cost excludes judge calls, which are tracked separately so a scoring model never flatters or penalises an architecture. Every figure on this site is read from results/ at build time.