Sebastien Rousseau

HSH

Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh

How a pure-Rust cryptographic framework enables banks to seamlessly upgrade legacy passwords to Argon2id with HSM interlocks — and what it means for DORA and Basel III compliance.

11 min read
Banner for: Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh

Executive Summary. Banking authentication built against a 2018 threat model is no longer fit for purpose under the 2026 regulatory regime. GPU-accelerated cracking, ASIC density, and the approaching post-quantum horizon have collapsed the safety margin of PBKDF2 and early-parameter scrypt; DORA Article 5 has turned that decay into a board-accountable liability. hsh, an open-source pure-Rust framework, addresses the problem at three layers in parallel: a verify_and_upgrade dispatcher that re-hashes a stored credential to current Argon2id parameters on every successful login without a maintenance window; an HSM- or KMS-interlocked peppering layer that makes a database breach alone yield nothing crackable; and a memory-safe supply chain that eliminates the foreign-function-interface attack surface inherent in C-backed cryptographic libraries. The result is a substrate that satisfies DORA, the Basel III operational-risk discipline, SM&CR senior-manager accountability, and the NIST IR 8547 post-quantum migration horizon — without the bulk-reset programme historically required to upgrade an authentication estate.

Most enterprise banking authentication still rests on a password layer hardened to a 2018 threat model. The hardware that breaks it has moved on. As GPU farms scale and cryptographically relevant quantum computers (CRQCs) approach, legacy hashing — PBKDF2, early scrypt — decays under every hour of compute attackers spend on the offline crack queue. The decay is silent: nothing in the production database tells you the hash that was strong yesterday no longer is.

Under the Digital Operational Resilience Act (DORA), leaving un-rotated, legacy cryptographic assets in production is no longer technical debt. It is named regulatory liability.

hsh closes the gap. A pure-Rust framework, it manages multiple hash formats side-by-side and upgrades weak credentials in-flight during active login sessions. Authentication infrastructure aligns to 2026 resilience mandates without a maintenance window, without a forced reset, without a single second of downtime.

01. The Cryptographic Rot Problem in Banking #

To understand the necessity of a framework like hsh, one must understand the lifecycle of a password hash. Algorithms do not age gracefully; they decay relative to the hardware available to break them.

The ASIC/GPU acceleration gap. Algorithms like PBKDF2 were designed to be computationally expensive for CPUs. Today, attackers use highly parallelised GPUs to execute offline dictionary attacks. A legacy hash generated in 2018 is vastly weaker against a 2026 adversary.

The big-bang migration risk. When a CISO decides to upgrade from PBKDF2 to a memory-hard algorithm like Argon2id, they cannot reverse the hashes to re-encrypt them. Traditional solutions—forcing multi-million-user password resets—cause massive customer friction and operational risk.

The C-library supply chain. Historically, banking middleware has relied on libraries like argonautica or raw C bindings for hashing. These libraries carry a hidden supply-chain risk: a single memory-buffer overflow in the authentication module can lead to remote code execution (RCE) at the most privileged layer of the banking stack.

Algorithm comparison — hardware resistance and tuning surface #

The three algorithms a bank realistically encounters in a migration corpus differ less in cryptographic primitive choice and more in how they age under hardware pressure. The table below summarises the practical posture.

Algorithm Memory-hard GPU / ASIC resistance Tuning surface 2026 status
PBKDF2 No Low — vectorises on GPU; sub-millisecond per guess on commodity hardware. Iteration count only. Legacy. Acceptable only as a verify-side fallback during migration.
scrypt Yes (modest) Medium — memory cost defeats simple GPU farms; ASIC-amortisable at scale. N (CPU/memory), r (block size), p (parallelism). Deprecated for greenfield. Active in migration corpora.
Argon2id Yes (high) High — memory- and time-hard; resists side-channel and TMTO attacks. Memory cost (m), time cost (t), parallelism (p), secret (pepper). Recommended default. OWASP, NIST SP 800-63B-4 draft, FedRAMP.

The takeaway for the migration plan is narrow: PBKDF2 is a verify-side state, not a write-side destination. Every successful login on a PBKDF2 record should produce an Argon2id record on the way out.

02. The hsh 2026 Architecture Lens #

The framework is structured across five core layers, each engineered to mitigate a specific category of operational risk.

Table 1: hsh Architecture Layers and Risk Mitigation #

Layer Design Decision Why It Matters Risk if Mishandled
Cryptographic Primitives Unified PHC String Format supporting Argon2id, scrypt, and PBKDF2 Provides best-in-class resistance to GPU attacks while maintaining backward compatibility. Data silos; weak algorithms allowing 100B+ guesses/second offline.
Policy Engine verify_and_upgrade dispatch Automates the transition from legacy to modern policies dynamically on login. Security rot; active users remaining on easily cracked legacy hash types.
Hardware Interlock HSM and Cloud KMS "peppering" capabilities Ensures that a database breach alone does not expose candidate passwords. Offline brute-force attacks succeeding after a SQL injection breach.
Security Hygiene deny.toml enforcement and pure Rust Blocks insecure FFI and untrusted external C-dependencies entirely. Catastrophic supply chain attacks and memory-corruption CVEs.

03. The Zero-Downtime Rehash Pathway #

The verify_and_upgrade pattern solves data migration through an intelligent, state-aware dispatching system that requires zero database downtime.

When a user submits their credentials, hsh reads the stored Password Hashing Competition (PHC) string. If it contains a legacy hash (e.g., an outdated PBKDF2 configuration), the system executes the following flow:

  1. Identification: Parses the legacy algorithm and its specific parameters.
  2. Verification: Validates the candidate password against the legacy hash.
  3. Real-Time Upgrade: Upon a successful match, it takes the plaintext candidate password in memory and immediately computes a new hash using the highly secure Argon2id policy.
  4. Persistence: It returns the new PHC string to the banking application, which overwrites the legacy record in the database.

This process is entirely transparent to the end-user. It effectively migrates the most active accounts to the highest security tier on day one, dramatically reducing the bank's attack surface organically over time.

The sequence below shows what happens during a single login event when the stored record is on a legacy algorithm. The user sees nothing change; the bank's authentication estate strengthens by one record.

sequenceDiagram
    actor User
    participant Frontend
    participant Auth as Authentication Service (hsh)
    participant DB as Database
    User->>Frontend: Submit username + password
    Frontend->>Auth: authenticate(user, password)
    Auth->>DB: SELECT password_hash FROM users
    DB-->>Auth: PHC string (legacy: PBKDF2)
    Note over Auth: Detect legacy algorithm prefix
    Auth->>Auth: verify(password, legacy_hash)
    Note over Auth: Re-hash with Argon2id
    Auth->>DB: UPDATE password_hash = new PHC
    DB-->>Auth: write confirmed
    Auth-->>Frontend: 200 OK
    Frontend-->>User: Login successful

Implementation pattern — verify_and_upgrade dispatch #

The integration surface inside an authentication service is small. The legacy code path stays as the fallback; the new code path is the dispatcher.

use hsh::{Hasher, UpgradeResult};

struct UserRecord {
    username: String,
    password_hash: String, // PHC string
}

async fn authenticate(user: UserRecord, password_attempt: &str) -> Result<bool, AuthError> {
    let hasher = Hasher::new();
    match hasher.verify_and_upgrade(password_attempt, &user.password_hash) {
        Ok(UpgradeResult::Verified(is_valid)) => Ok(is_valid),
        Ok(UpgradeResult::Upgraded(new_hash)) => {
            db::update_user_hash(&user.username, new_hash).await?;
            Ok(true)
        }
        Err(_) => Err(AuthError::InvalidCredentials),
    }
}

Three properties matter:

Failure modes. If the database write fails or the KMS is briefly unreachable during the upgrade write, the session still succeeds against the legacy hash and the record stays on the old algorithm. The next successful login retries the upgrade. There is no half-migrated state and no user-visible failure — the migration is monotonic across login events, and the per-record cost of a failed upgrade is exactly one extra retry on the next login.

04. Peppered Hashes via HSM / KMS Interlock #

Standard password hashing protects against direct database leaks, but if an attacker gains both the database (hashes and salts), they can execute offline cracking.

hsh introduces a robust "peppered" security layer. By integrating with Hardware Security Modules (HSMs) or cloud-native Key Management Services (KMS), the final Argon2id output is cryptographically wrapped with a high-entropy key that never leaves the secure hardware boundary. If the user database is exfiltrated, the attacker possesses only encrypted blobs. They cannot begin cracking passwords without also breaching the bank's physically isolated HSM infrastructure.

The architecture diagram below traces the secret path. The pepper never lands in the database; the database never holds anything addressable on its own. The two stores can fail independently — the system only loses confidentiality if both fail together.

sequenceDiagram
    participant App as Application Server
    participant HSM as HSM (Hardware Security Module)
    participant DB as Database
    Note over HSM: Pepper sealed in hardware<br/>never exits boundary
    App->>HSM: get_secret("production-password-pepper")
    HSM-->>App: pepper (in-memory, request-scoped)
    Note over App: Argon2::new_with_secret(&pepper, ...)
    App->>App: hash(password + salt) consuming pepper
    Note over App: Pepper consumed via secret param<br/>not via string concat
    App->>DB: STORE PHC string (uncrackable blob)
    Note over App: Pepper dropped from memory
    Note over DB,HSM: DB breach alone yields<br/>nothing crackable

Implementation pattern — HSM-backed peppered Argon2id #

The pepper is sourced from the HSM at request time, not from a configuration file. Argon2::new_with_secret consumes it through the algorithm's secret parameter, not via string concatenation.

use argon2::{
    Argon2, Algorithm, Version, Params,
    PasswordHasher, PasswordVerifier,
    password_hash::{PasswordHash, SaltString, rand_core::OsRng},
};

async fn authenticate_with_hsm(
    user: UserRecord,
    password_attempt: &str,
) -> Result<bool, AuthError> {
    let pepper = hsm::client::get_secret("production-password-pepper").await?;
    let hasher = Argon2::new_with_secret(
        &pepper,
        Algorithm::Argon2id,
        Version::V0x13,
        Params::default(),
    )
    .map_err(|_| AuthError::Internal)?;

    let parsed = PasswordHash::new(&user.password_hash)
        .map_err(|_| AuthError::InvalidCredentials)?;
    if hasher.verify_password(password_attempt.as_bytes(), &parsed).is_ok() {
        if is_legacy_hash(&user.password_hash) {
            let new_hash = hasher
                .hash_password(
                    password_attempt.as_bytes(),
                    &SaltString::generate(&mut OsRng),
                )
                .map_err(|_| AuthError::Internal)?
                .to_string();
            db::update_user_hash(&user.username, new_hash).await?;
        }
        return Ok(true);
    }
    Err(AuthError::InvalidCredentials)
}

Three DORA-aligned consequences fall out of this shape:

05. Regulatory Alignment: DORA, Basel III, and SM&CR #

FAQ #

Is hsh production-ready for a tier-1 banking authentication path? The library is open-source, documented, and exercises Argon2id via the same argon2 crate that underpins the RustCrypto password-hashing ecosystem. Tier-1 adoption follows the bank's own due-diligence: independent code review, reproducible-build attestation, dependency-tree pinning, HSM-vendor integration testing, and Operational Risk sign-off. hsh provides the substrate; the bank certifies the deployment.

How does verify_and_upgrade avoid the bulk-migration risk? The verifier inspects the PHC string at parse time, runs the legacy algorithm to validate the password, and — if the stored algorithm or parameter set is below the current floor — re-hashes the plaintext under Argon2id with the bound HSM pepper and writes the new PHC string back atomically. The user experiences a normal login. The estate strengthens by one record per successful authentication. No reset campaign, no maintenance window, no operational risk event.

What happens to dormant accounts that never log in? Records that never authenticate never re-hash. Banks address this with two complementary policies: a documented dormancy threshold (often 18–24 months) after which the account is administratively rotated under a controlled reset campaign, and a synthetic re-hash run during scheduled maintenance for accounts in defined cohorts (high-value, high-privilege, regulated). Both are policies, not library behaviours; hsh records the dispatch decision in audit telemetry so the operational owner can prove coverage.

Does the HSM pepper introduce a single point of failure on the authentication path? The same HSM that signs payment messages and rotates KMS-backed keys is on the path. The risk is identical to the bank's existing posture; hsh inherits it rather than introduces it. Mitigations are standard: HA HSM pairs, hot-spare KMS regions, request-scoped pepper retrieval with circuit-breaker fall-back to read-only mode, and an explicit operational runbook for HSM unavailability. The pepper is argon2's secret parameter, consumed in-process and dropped from memory after use.

Where does hsh sit relative to the post-quantum migration? hsh is a password-and-secret-hashing framework, not a key-encapsulation or signature primitive. The PQC transition documented in NIST IR 8547 targets key establishment (ML-KEM, FIPS 203) and signatures (ML-DSA, FIPS 204; SLH-DSA, FIPS 205). The hashing layer that hsh covers is largely orthogonal to that migration. The two converge at the substrate level — both want a memory-safe, audit-able, reproducible-build cryptographic supply chain — which is exactly the posture hsh enables today.

Conclusion #

Deploy-and-forget password hashing is over. DORA has moved cryptographic passivity from technical debt into named regulatory liability, and the hardware curve gets steeper every year. hsh's contribution is not a stronger algorithm — Argon2id has been available for years. The contribution is the operational machinery to migrate to it without scheduling downtime, without forcing user resets, and without trusting C-based FFI shims with the bank's authentication path.

The hsh source code is available under the MIT and Apache 2.0 dual licence.

References #

Basel Committee on Banking Supervision (2011). Basel III: A global regulatory framework for more resilient banks and banking systems. Bank for International Settlements. Available at: https://www.bis.org/publ/bcbs189.pdf

Biryukov, A., Dinu, D., Khovratovich, D., and Josefsson, S. (2021). RFC 9106: Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications. Internet Engineering Task Force. Available at: https://datatracker.ietf.org/doc/html/rfc9106

European Parliament and Council (2022). Regulation (EU) 2022/2554 on digital operational resilience for the financial sector (DORA). Available at: https://eur-lex.europa.eu/eli/reg/2022/2554/oj

Financial Conduct Authority (2015). Senior Managers and Certification Regime (SM&CR). Available at: https://www.fca.org.uk/firms/senior-managers-certification-regime

National Institute of Standards and Technology (2024). Initial Public Draft — Transition to Post-Quantum Cryptography Standards (NIST IR 8547). Available at: https://csrc.nist.gov/pubs/ir/8547/ipd

OWASP Foundation (2024). Password Storage Cheat Sheet. Available at: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html

Last reviewed .

Syndicate this article

Format for Medium

# Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh

> Originally published at [https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/](https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/)

hsh is a pure-Rust cryptographic framework that enables tier-1 banks to migrate legacy password hashes to Argon2id with zero downtime, integrating HSM peppering and eliminating C-based FFI memory vulnerabilities to meet DORA resilience mandates.

Read the full article on sebastienrousseau.com: https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/

Format for Mastodon

Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh

hsh is a pure-Rust cryptographic framework that enables tier-1 banks to migrate legacy password hashes to Argon2id with zero downtime, integrating HSM peppering and eliminating C-based FFI memory vulnerabilities to meet DORA resilience mandates.

https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/

Copy formatted for LinkedIn

Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh

hsh is a pure-Rust cryptographic framework that enables tier-1 banks to migrate legacy password hashes to Argon2id with zero downtime, integrating HSM peppering and eliminating C-based FFI memory vulnerabilities to meet DORA resilience mandates.

Here are the key strategic takeaways:

- The cryptographic rot problem. Legacy algorithms like PBKDF2 weaken exponentially as hardware accelerates, expanding the attack surface for credential-stuffing and offline brute-force campaigns.
- Zero-downtime migration. The verify_and_upgrade pattern rehashes user credentials transparently during standard login events, eliminating the operational risk of bulk database migrations.
- Hardware interlock and peppering. Hashes are wrapped using Hardware Security Modules (HSMs) or cloud KMS architectures, ensuring that a database breach alone yields no crackable candidate passwords.
- Memory safety as a regulatory baseline. Rewritten entirely in safe Rust and enforced via strict dependency hygiene, hsh eliminates the buffer overflow and supply-chain risks inherent in legacy C-based cryptographic libraries.

What is your organisation's approach to the challenges outlined in this piece?

→ https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/

#Hsh #RustCryptography #PasswordHashing #Argon2id #BankingSecurity

Sebastien Rousseau | CC-BY-4.0
Cite this article

Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh

hsh is a pure-Rust cryptographic framework that enables tier-1 banks to migrate legacy password hashes to Argon2id with zero downtime, integrating HSM peppering and eliminating C-based FFI memory vulnerabilities to meet DORA resilience mandates.

BibTeX

@online{rousseau2026securing,
  author  = {Rousseau, Sebastien},
  title   = {{Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh}},
  year    = {2026},
  url     = {https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/index.html},
  urldate = {2026}
}

RIS

TY  - GEN
AU  - Rousseau, Sebastien
TI  - Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh
PY  - 2026
UR  - https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/index.html
ER  -

Vancouver

Rousseau S. Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh. sebastienrousseau.com. 2026 Jun 22. Available from: https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/index.html

Chicago

Rousseau, Sebastien. "Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh." sebastienrousseau.com. June 22, 2026. https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/index.html.

APA

Rousseau, S. (2026, June 22). Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh. sebastienrousseau.com. https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/index.html

Republish this article

Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh

hsh is a pure-Rust cryptographic framework that enables tier-1 banks to migrate legacy password hashes to Argon2id with zero downtime, integrating HSM peppering and eliminating C-based FFI memory vulnerabilities to meet DORA resilience mandates.

This article is licensed under Creative Commons Attribution 4.0 International. Republication requires attribution to the canonical URL.

Securing Password Management in Enterprise Banking: Multi-Algorithm Hashing and Upgrades with hsh

hsh is a pure-Rust cryptographic framework that enables tier-1 banks to migrate legacy password hashes to Argon2id with zero downtime, integrating HSM peppering and eliminating C-based FFI memory vulnerabilities to meet DORA resilience mandates.

Originally published at https://sebastienrousseau.com/2026-06-22-hsh-zero-downtime-cryptographic-stewardship-rust-banking-2026/ by Sebastien Rousseau.
Licensed under CC-BY-4.0.