“Hashed” Does Not Mean Safe: The MD5 Lesson

“Hashed” Does Not Mean Safe: The MD5 Lesson




Last updated: 2026-10-05

“The passwords were hashed” is an incomplete answer after a data breach. The protection depends on the algorithm, its configuration, the passwords themselves, and what the attacker obtained.

Using MD5 directly for password storage allows attackers to test guesses at low cost. For businesses relying on a platform provider, the practical question is whether the provider can demonstrate how credentials are protected and how compromised accounts would be secured.

What the Bambi disclosure establishes

The public notice dated 30 September 2026 concerns Bambi Deri Mamülleri A.Ş. and reports:

  • Unauthorized access to a server in a processor’s systems.
  • Detection following the processor’s notification on 21 September 2026; this is not a confirmed intrusion date.
  • A potentially affected dataset containing names, telephone numbers, email addresses and user login information hashed with MD5.
  • An estimated 323,052 affected customers and prospective customers, according to the processor.

That estimate is not a confirmed count of cracked passwords. The MD5 statement applies to this disclosure; it does not establish the algorithm used across other September breaches.

The notice does not identify the processor or specify salting, direct versus layered MD5 use, password policy, administrator storage, confirmed hash exfiltration, reset instructions, or affected session/authentication tokens. It describes an ongoing investigation, not final findings or a penalty decision.

As of 5 October 2026, our review of public sources did not locate a controller follow-up or final decision resolving those gaps. This does not establish whether customers received private communications.

How hashing helps—and where its protection ends

A password-storage system keeps a value it can use to verify a submitted password, rather than keeping the password itself. At login, the system applies the stored algorithm and parameters to the submitted value and checks the result.

Hashing has no decryption key that restores the original password. But an attacker can try likely passwords, calculate their outputs and look for a match. Human choices are often more predictable than randomly generated secrets.

This is why “one-way” does not mean “unguessable.”

Ordinary hashes are designed for a different job

General-purpose cryptographic hashes are designed to process data efficiently. Password storage needs a scheme that makes repeated guesses costly. Replacing direct MD5 with a single SHA-256 calculation does not solve that design problem.

MD5 also has a separate, established weakness: broken collision resistance. A collision means finding two different inputs with the same digest. That is different from recovering a particular user’s password. Ordinary password guessing does not require an attacker to exploit MD5 collisions; it requires testing plausible candidates against the stored value.

For this reason, saying “MD5 collisions let attackers decrypt every password” would misdescribe both the attack and the evidence.

Salted is better than unsalted, but salt is not enough

A salt is a unique random value used when deriving a password hash. It can be stored alongside the result; secrecy is not its purpose.

Without salts, identical passwords produce identical hashes under the same scheme, and attackers can reuse precomputed results. Different salts prevent that direct reuse and comparison across accounts. They do not make a weak password strong or turn direct MD5 into an appropriately expensive password-storage function.

For the Bambi incident, whether salts were used remains undisclosed. Neither “MD5 means unsalted” nor “perhaps it was salted, so it was safe” is a supported conclusion.

__wf_reserved_inherit

‍

‍

What happens after password hashes are stolen?

Once an attacker has usable password verifiers and the necessary parameters, guessing can happen on the attacker’s own hardware. The website’s rate limits and account lockouts do not govern those offline calculations.

Not every password will be recovered. Outcomes depend on password predictability, the storage scheme, available computing resources and any additional secrets needed for verification. An algorithm name alone cannot establish a credible time to crack the entire dataset.

Password reuse extends the consequences

If a recovered password is reused elsewhere, an attacker can try the same email/password pair on other services. This is credential stuffing. It is distinct from the earlier offline guessing step.

MFA can reduce successful account takeover, although it does not prevent an attacker from guessing a stolen password hash. Customers should replace reused passwords on other accounts as well as on the affected service, using a different password for each. A password manager makes that more manageable.

Customer and administrator accounts need separate assessment

A customer account and a platform administrator account can grant very different powers. Depending on the application, administrative access may permit exports, account changes or integration management.

Request separate evidence for customer authentication, merchant administrators, provider support access and service accounts. Identify which use local passwords and which rely on an identity provider. Require MFA for privileged access and review what those accounts can do.

Do not infer administrator exposure or matching storage algorithms from a disclosure about user login information.

What appropriate password storage looks like

For a new implementation, use a maintained password-hashing library with Argon2id as the preferred choice where supported. Established alternatives include scrypt; PBKDF2 may be appropriate where relevant requirements or platform constraints apply. Existing bcrypt deployments need a configuration and migration review.

Argon2id provides configurable memory and computational costs. Those settings matter: the purpose is to make guessing expensive while keeping legitimate verification operationally manageable. The algorithm name does not tell you whether its deployment achieves that balance.

Ask the engineering team to document the actual parameters and test concurrent login demand on the intended infrastructure. A setting tested for one login is not evidence that the service can withstand peak traffic.

Use a high-level verification API that manages the salt and records the algorithm and parameters with the verifier. Avoid custom concatenation, repeated hashing or undocumented combinations invented in application code.

Account for old passwords during migration

During a planned upgrade, an application can verify a legitimate login using the old scheme and create a new verifier from the submitted password. Dormant accounts need a separate decision because they may never log in to trigger that upgrade.

Track accounts still using the old scheme, assign responsibility for the migration, and define when an account must reset before further access. An incident involving exposed weak verifiers may justify forced resets rather than waiting for normal login activity.

Updating the live database cannot strengthen an older copy already held by an attacker. A migration plan therefore needs a separate decision about whether the underlying passwords remain safe to use.

When should a business require password resets?

Routine calendar-based password changes and incident-driven resets serve different purposes. Current technical guidance supports forcing a change when there is evidence of compromise, rather than imposing periodic changes without that evidence.

We recommend requiring resets for affected accounts when the investigation establishes exposure of weak password verifiers. Do not wait for proof that every password has been recovered. Where exposure remains uncertain, document the available evidence, logging limitations, account privileges and consequences of delaying action.

This is a response recommendation, not a claim that Bambi or the regulator ordered resets.

Before reopening access, contain the compromise and ensure new passwords will be stored appropriately. Review the password policy too: permit long passwords and password managers, and screen new choices against common or compromised values. Complexity requirements alone do not repair weak storage.

Use unpredictable, expiring, single-use reset tokens. Protect the reset process against automated abuse and notify users after a successful change. Direct customers to the familiar website or application; never ask them to disclose their old password to support.

A password reset may leave an attacker signed in

Changing a password does not necessarily end existing sessions. The result depends on the application’s implementation.

For affected accounts, assess active web sessions, persistent “remember me” access and mobile sessions. Invalidate relevant sessions on the server and require fresh authentication. Removing a browser cookie alone does not revoke a stolen copy of its session identifier.

Where OAuth is used, check refresh-token revocation separately. Revoking a refresh token prevents further access-token issuance through it; establish how already-issued access tokens will be rejected or when they expire. Do not assume that password change, web logout and token revocation are the same operation.

If takeover is suspected, inspect changes to recovery addresses, MFA methods and trusted devices. A newly changed password may not restore control if an attacker has established another route back in.

Test the recovery process with a test account: create sessions on two devices, perform the incident reset, and verify that the old sessions and relevant tokens no longer authorize access. Record any remaining validity window and the decision to accept or remove it.

Account recovery checklist

What does the reset actually revoke?

A password change does not automatically end every form of access. Check each affected access route separately and verify the result with a test account.

  1. Password

    Action
    Require a new password for the affected account and store it using the intended password-hashing scheme.
    Verification test
    Confirm that the old password fails and the new password works. Check that the test account’s stored verifier uses the intended algorithm and parameters.
  2. Browser sessions

    Action
    Invalidate relevant sessions on the server, including persistent “remember me” access, and require fresh authentication.
    Verification test
    Open sessions on two devices before the reset. Afterwards, confirm that both old sessions are rejected when requesting protected content.
  3. Mobile access

    Action
    Invalidate affected mobile sessions and relevant app tokens. Require the user to authenticate again.
    Verification test
    Using a previously signed-in app, request fresh protected data and try a sensitive action. Confirm that old credentials or tokens no longer authorize those requests.
  4. Refresh tokens

    Action
    Revoke relevant OAuth refresh tokens. Separately establish how already-issued access tokens will be rejected or when they expire.
    Verification test
    Confirm that the old refresh token cannot obtain a new access token. Test an existing access token and record any remaining period in which it still works.
  5. Recovery methods

    Action
    Review recovery email addresses, MFA methods and trusted devices. Remove unauthorized changes through a verified recovery process.
    Verification test
    Confirm that removed methods can no longer restore access or satisfy authentication. Check that the legitimate user retains a working recovery route.

A successful password change alone is not evidence that sessions, tokens or attacker-added recovery methods have been revoked.

Record the test results, any remaining access window, and the person responsible for resolving gaps. This checklist describes recommended checks; it does not establish what happened in the Bambi incident.

‍

‍

Monitor account activity after containment

Credential abuse can continue after the original access route is closed. Review successful and failed sign-ins, unusual devices, reset activity and changes to sensitive account settings. Correlate events rather than treating an unfamiliar IP address as proof of takeover.

Assign an owner to review alerts and customer reports, with a defined route for securing suspicious accounts. Track detected and blocked attempts as well as confirmed unauthorized activity. Low numbers of failed logins do not establish safety: a valid stolen password may succeed immediately.

Keep useful event identifiers and timestamps, but do not place passwords or usable session/access tokens in monitoring logs. Restrict access to the logs and set retention according to the investigation and applicable requirements.

Your own authentication records generally cannot show whether a reused customer password is being abused on another company’s service. Customer communication should explain that residual risk without claiming downstream compromise has occurred.

What to ask your processor—and what evidence to request

For a controller buying an e-commerce or SaaS service, “passwords are hashed” should begin a technical review. The following is a recommended evidence request, not a universal statutory document list.

  1. What is deployed today? Request the algorithm, library version, parameters and verification design, including any preprocessing or additional hashing layer. Obtain dated configuration evidence and a record generated from a synthetic test account. Do not request customers’ actual hashes.
  2. How much legacy storage remains? Ask for account counts by storage scheme, including inactive accounts. Request the migration plan, accountable owner and evidence that resets create the intended new verifier.
  3. Which identities use each design? Request an authentication map covering customers, merchant administrators, provider support and integrations. Ask for privileged-access and MFA configuration evidence rather than assuming one answer covers every account type.
  4. Where else do verifiers exist? Ask about backups, exports, staging environments and support copies. Request access restrictions and retention rules for those copies. An improved production setting alone does not explain their protection.
  5. What could an intruder obtain? Following an incident, request a timeline, affected-system scope, relevant forensic conclusions and logging gaps. Ask the provider to distinguish demonstrated access, demonstrated copying and unresolved exposure.
  6. Can accounts actually be secured? Request test results for forced resets, session invalidation and token revocation, including mobile clients. Identify who can authorize these actions and who communicates with customers.
  7. How is remediation verified? Request the relevant security-review findings, exceptions and closure evidence. Confirm that the assessment covered authentication and the deployed environment; a broad assurance statement may not answer the specific question.

Review sensitive evidence through an agreed secure channel. Record unanswered questions as gaps with an owner and follow-up date, rather than treating the absence of evidence as a positive answer.

Review the provider’s password-storage and recovery evidence

A useful provider response identifies the deployed storage scheme, accounts still using older protection, and tested recovery actions. That gives a business a basis for decisions about remediation and incident response.

If your supplier’s answer stops at “hashed,” request that evidence now. Kooch’s KVKK & GDPR Gap Analysis can review agreed vendor and security evidence and turn identified gaps into a prioritized remediation plan with proposed owners and dependencies.

Sources / References

The technical sources below provide guidance and specifications, rather than algorithm-specific requirements under Turkish law.

  1. KVKK — Bambi Deri Mamülleri A.Ş. breach notice, 30 September 2026; publication decision 2026/2137. Source for the reported incident, estimated population, MD5 wording and ongoing investigation. Breach register confirms the publication date.
  2. OWASP — Password Storage Cheat Sheet. Algorithm selection, salts, fast-hash limitations and legacy migration.
  3. IETF RFC 6151 — MD5 and HMAC-MD5 Security Considerations. The distinction between collision and preimage weaknesses.
  4. IETF RFC 9106 — Argon2. Memory-hard password hashing and configurable parameters.
  5. Libsodium — Password hashing and password-hashing API. Verification, salt handling, parameter storage, tuning and rehash support.
  6. NIST SP 800-63B-4 — Authentication and Authenticator Management, particularly sections 3.1.1 and 4.5 and Appendix A. Offline attacks, password policy and compromise-driven changes.
  7. OWASP — Credential Stuffing Prevention and Authentication. Reused credentials, MFA, sensitive accounts and reauthentication.
  8. OWASP — Forgot Password and Session Management. Reset tokens, account recovery and server-side session invalidation.
  9. IETF RFC 9700 — OAuth 2.0 Security Best Current Practice, section 4.14. Refresh-token protection and revocation.
  10. OWASP — Logging Cheat Sheet. Authentication monitoring and exclusion of secrets from logs.

Public follow-up checks also covered Bambi’s website, KVKK page and privacy/security page, alongside targeted searches for further official notices. Public-source checks cannot establish the contents of private customer notifications.

‍

Masoud Salmani