ScaffoldBench

RunOpus 5.5repeat 1

Propose-select on OWASP vs NIST on password hashing

claude-opus-5-5__propose-select__research-password-hashing__r1

Score

1.000

passed
design ran as designed
Cost
$1.27
+ $0.102 judging
Latency
1m 50s
setup 0.0s, grading 5.6s
Turns
48
Tool calls
43
Subagents
3
Tokens in / out
441k / 25k
340,264 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.
  • All three proposers ran: heldpropose-select.proposalsThree proposers ran in parallel, each from its own angle, and none was starved while another ran.
  • The selector chose: heldpropose-select.selectionThe selector picked a proposal by a valid number, read from its schema reply and not a default.
  • Each call was shown the right tools: heldpropose-select.toolsEach proposer was shown the read-only tools, the selector none, and the executor the full toolset.

Phases

Proposal 1 (policy-first): 0.0s to 1m 4s, finished, 16 tool calls, $0.380
Proposal 2 (state-first): 0.0s to 1m 2s, finished, 16 tool calls, $0.348
Proposal 3 (outcome-first): 0.0s to 56.9s, finished, 11 tool calls, $0.314
Select: 1m 4s to 1m 50s, finished, 0 tool calls, $0.232

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

PhaseDurationCostTurnsToolsModel
Proposal 1 (policy-first)1m 4s$0.3801716claude-opus-5-5
Proposal 2 (state-first)1m 2s$0.3481716claude-opus-5-5
Proposal 3 (outcome-first)56.9s$0.3141211claude-opus-5-5
Select46.3s$0.23220claude-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 propose-select --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 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. “Use scrypt if Argon2id isn't available. Use bcrypt only in legacy systems.”

  • 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 E12, E13, E15. “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 E21, E10, E11. “Rev. 3, now superseded, did name "PBKDF2 [SP 800-132] 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 what OWASP recommends when FIPS 140 compliance is required, and it meets the current NIST SP 800-63B (Revision 4”

  • 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 E12, E16, E15, E4. “Passwords must be "salted and hashed using a suitable password hashing scheme."”

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,"nist-sp800-63b-4":0.1296,"nist-sp800-63b-3":0.0493,"rfc9106":0.0171,"owasp-authentication":0.0267}
cited count
3
verified count
3
hallucinated count
0
citation integrity
1
hallucinated urls
[]
evidence block
true
evidence block repaired
false
evidence count
22
verified quote count
22
verified quote rate
1
evidence
[{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP's default first choice is Argon2id with stated minimum parameters.","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 says to use scrypt if Argon2id isn't available.","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.","quote":"The bcrypt password hashing function should only be used for password storage in legacy systems where Argon2 and scrypt are not available.","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"When FIPS-140 compliance is required, OWASP recommends PBKDF2-HMAC-SHA-256 with at least 600,000 iterations.","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 says PBKDF2 is permitted by SP 800-63B-4 and has 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 says PBKDF2-HMAC-SHA1 is legacy only.","quote":"PBKDF2-HMAC-SHA1: 1,400,000 iterations — legacy only, do not select for new systems.","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP suggests a pepper as defense 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 advises storing the algorithm and work factor with each hash.","quote":"Using a mix of hashing algorithms is easier if the password hashing algorithm and work factor are stored with the password using a standard format, for example, the modular PHC string format.","verified":true,"document":"owasp-password-storage"},{"url":"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html","claim":"OWASP warns of denial of service from very long passwords.","quote":"When users supply very long passwords, a potential denial of service vulnerability could occur, such as the one published in Django during 2013.","verified":true,"document":"owasp-password-storage"},{"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-3/sp800-63b.html","claim":"Rev. 3 was superseded by SP 800-63-4 as of 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 requires salted hashing 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 recommends (SHOULD) an approved scheme from the latest SP 800-132, without naming an 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 identifies SP 800-132 as the password-based key derivation recommendation.","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 asks for a cost factor as high as practical, with no fixed number.","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 sets a minimum salt length of 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 recommends storing a reference to the scheme and cost factor for 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 hash with a secret key known only to the verifier.","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 federal verifiers' cryptography at AAL1 to be FIPS 140 Level 1 validated.","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 says FIPS 140 requirements are met by CMVP-validated cryptography.","quote":"Throughout this document, [FIPS140] requirements are satisfied by security technologies, products, and services that utilize implementations of cryptography validated by the Cryptography Module Validation Program [CMVP].","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 and recommended a memory-hard function.","quote":"Examples of suitable key derivation functions include Password-based Key Derivation Function 2 (PBKDF2) [SP 800-132] and Balloon [BALLOON]. 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":"Rev. 3 suggested at least 10,000 PBKDF2 iterations, far below OWASP's 600,000.","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":["E12","E13","E15"]},"nist-revision":{"status":"met","support":["E21","E10","E11"]},"reconciliation":{"status":"met","support":["E4","E5"]},"common-ground":{"status":"met","support":["E12","E16","E15","E4"]}},{"owasp-argon2id":{"status":"met","support":["E1"]},"owasp-conditions":{"status":"met","support":["E2","E3","E4"]},"nist-current":{"status":"met","support":["E12","E13","E15"]},"nist-revision":{"status":"met","support":["E21","E11"]},"reconciliation":{"status":"met","support":["E4","E5"]},"common-ground":{"status":"met","support":["E16","E15","E4"]}},{"owasp-argon2id":{"status":"met","support":["E1"]},"owasp-conditions":{"status":"met","support":["E2","E3","E4"]},"nist-current":{"status":"met","support":["E12","E13","E15"]},"nist-revision":{"status":"met","support":["E21"]},"reconciliation":{"status":"partial","support":["E4","E5"]},"common-ground":{"status":"met","support":["E12","E16","E4"]}}]
judge failures
0
grounded weight share
1

Final answer

Use PBKDF2 with HMAC-SHA-256, a unique random salt per password, and at least 600,000 iterations, run inside a FIPS 140-validated crypto module. Add a keyed "pepper" step whose key is kept away from the password database, ideally in a hardware security module (HSM). This is what OWASP recommends when FIPS 140 compliance is required, and it meets the current NIST SP 800-63B (Revision 4, which replaces earlier versions). The two sources mostly agree, with two caveats below.

What OWASP says (https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)

  • Default ranking: Argon2id first, with at least 19 MiB memory, 2 iterations and parallelism 1. Use scrypt if Argon2id isn't available. Use bcrypt only in legacy systems.
  • FIPS case: "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." OWASP's reason is that PBKDF2 "is permitted by NIST SP 800-63B-4 and has FIPS-140 validated implementations."
  • SHA-1: PBKDF2-HMAC-SHA1 is "legacy only, do not select for new systems."
  • Pepper: OWASP says to consider one as defense in depth.
  • Upgrades: store the algorithm and work factor with each hash, for example in PHC string format, so you can move to stronger settings later.
  • Long passwords: some PBKDF2 implementations are open to denial of service when users submit very long passwords.

What NIST SP 800-63B-4 requires (https://pages.nist.gov/800-63-4/sp800-63b.html)
The page says it supersedes the earlier SP 800-63B. The Rev. 3 page also says it was superseded as of August 1, 2025 (https://pages.nist.gov/800-63-3/sp800-63b.html).

  • Required (SHALL):

    • Passwords must be "salted and hashed using a suitable password hashing scheme."
    • The salt must be at least 32 bits.
  • Recommended (SHOULD):

    • Use "an approved password hashing scheme published in the latest revision of [SP800-132]." The reference list identifies SP 800-132 as the "Recommendation for Password-Based Key Derivation."
    • Set the cost factor "as high as practical."
    • Store a reference to the scheme and cost factor with each password so you can migrate later.
    • Add a keyed hashing or encryption step using a secret key known only to the verifier.
  • FIPS 140: cryptography used by verifiers run by or for federal agencies at AAL1 (the lowest authentication assurance level) "SHALL be validated to meet the requirements of [FIPS140] Level 1." The document says this is met by implementations validated under NIST's Cryptographic Module Validation Program (CMVP). I only quoted the AAL1 sentence, so check the wording for your own assurance level.

Where the sources don't line up

  1. NIST names no algorithm. The password-storage section of Rev. 4 never mentions PBKDF2. It only points to SP 800-132 and sets no iteration count. So OWASP's statement that PBKDF2 "is permitted by NIST SP 800-63B-4" is OWASP's interpretation, not NIST's wording.

    • Rev. 3, now superseded, did name "PBKDF2 [SP 800-132] and Balloon" as examples.
    • Rev. 3 said a memory-hard function SHOULD be used and suggested "typically at least 10,000 iterations."
    • I found neither of those in the Rev. 4 section. Anyone quoting 10,000 iterations or the memory-hard advice is citing outdated text.
    • I couldn't open SP 800-132 itself, so I haven't confirmed exactly what it approves.
  2. OWASP's first choice may not pass a federal audit. Federal verifiers must use FIPS-validated cryptography. Neither NIST document I read mentions Argon2id, scrypt or bcrypt, and OWASP's own FIPS case points to PBKDF2. My conclusion (neither source says this directly) is that Argon2id shouldn't be used where FIPS applies.
  3. Iteration count: 600,000 is OWASP's number. NIST only says "as high as practical," and 600,000 fits within that.
  4. Pepper: NIST's wording (SHOULD) is stronger than OWASP's ("consider"). Follow NIST.

What the team should do

  1. Confirm the FIPS scope: is the service run by or for a federal agency, and at which assurance level?
  2. Choose a crypto module that is actually FIPS 140-validated, and make sure its PBKDF2 is available in the module's approved mode.
  3. Set up PBKDF2-HMAC-SHA256:

    • at least 600,000 iterations;
    • a unique random salt of at least 32 bits per password (128 bits is a common choice, which is my suggestion, not either source's);
    • the algorithm and cost factor stored with each hash.
  4. Add an HMAC pepper. Generate its key with an approved random bit generator and keep it away from the database, ideally in an HSM.
  5. To guard against the long-password denial-of-service issue, use a library that pre-hashes long input once, or set a sensible maximum password length.
  6. Measure login delay on your own servers and raise the iteration count over time. Rehash each user's password at their next login.
  7. Before an audit, get SP 800-132 and confirm the approved scheme and parameters.
{"evidence": [
{"claim": "OWASP's default first choice is Argon2id with stated minimum parameters.", "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 says to use scrypt if Argon2id isn't available.", "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.", "quote": "The bcrypt password hashing function should only be used for password storage in legacy systems where Argon2 and scrypt are not available.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "When FIPS-140 compliance is required, OWASP recommends PBKDF2-HMAC-SHA-256 with at least 600,000 iterations.", "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 says PBKDF2 is permitted by SP 800-63B-4 and has 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 says PBKDF2-HMAC-SHA1 is legacy only.", "quote": "PBKDF2-HMAC-SHA1: 1,400,000 iterations — legacy only, do not select for new systems.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP suggests a pepper as defense 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 advises storing the algorithm and work factor with each hash.", "quote": "Using a mix of hashing algorithms is easier if the password hashing algorithm and work factor are stored with the password using a standard format, for example, the modular PHC string format.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"},
{"claim": "OWASP warns of denial of service from very long passwords.", "quote": "When users supply very long passwords, a potential denial of service vulnerability could occur, such as the one published in Django during 2013.", "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.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": "Rev. 3 was superseded by SP 800-63-4 as of 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 requires salted hashing 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 recommends (SHOULD) an approved scheme from the latest SP 800-132, without naming an 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 identifies SP 800-132 as the password-based key derivation recommendation.", "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 asks for a cost factor as high as practical, with no fixed number.", "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 sets a minimum salt length of 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 recommends storing a reference to the scheme and cost factor for 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 hash with a secret key known only to the verifier.", "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 federal verifiers' cryptography at AAL1 to be FIPS 140 Level 1 validated.", "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 says FIPS 140 requirements are met by CMVP-validated cryptography.", "quote": "Throughout this document, [FIPS140] requirements are satisfied by security technologies, products, and services that utilize implementations of cryptography validated by the Cryptography Module Validation Program [CMVP].", "url": "https://pages.nist.gov/800-63-4/sp800-63b.html"},
{"claim": "The superseded Rev. 3 named PBKDF2 and Balloon and recommended a memory-hard function.", "quote": "Examples of suitable key derivation functions include Password-based Key Derivation Function 2 (PBKDF2) [SP 800-132] and Balloon [BALLOON]. 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": "Rev. 3 suggested at least 10,000 PBKDF2 iterations, far below OWASP's 600,000.", "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.