Your country

Tools that support it use your country for local currency, number formats, units and paper size. Your choice is saved only in this browser.

Type a name or a two-letter code. Use the up and down arrow keys to move through the countries, Enter to choose one and Escape to close.

Hash Format Identifier

Paste a hash and see which format it is, what it tells, and whether it suits passwords.

Free preview, no sign-upIncluded in your pass Pro tool Pro pass: ₹179 / $5.99 for 30 days On this device: nothing is sent
+3 +1 more details No uploadWorks offline once opened Security

Free preview: the format, how sure it is, the verdict for passwords and the parts of the string, with the first half of the settings, reasons and advice. Locked until you unlock it: download and copy.

Pro pass ₹179 for 30 days or ₹79 for 1 week, one‑time. Pro pass $5.99 for 30 days or $2.99 for 1 week, one‑time. How to unlock

Try before you buy.

  • Free preview: the format, how sure it is, the verdict for passwords and the parts of the string, with the first half of the settings, reasons and advice.
  • Locked until you unlock it: download and copy.
  • Unlock: Pro pass, ₹179 for 30 days or ₹79 for 1 week, a one-time payment that never renews. Unlock: Pro pass, $5.99 for 30 days or $2.99 for 1 week, a one-time payment that never renews.

Ways to unlock shows how to get the full result.

See passes (opens in a new tab)

Printing this result is locked in the free preview.

What is this hash?

One value, or a whole list with one per line. Shadow, htpasswd and CSV lines, and "password": "…", are fine. The text is read in this tab: it is never sent anywhere, looked up or reversed.

Try an example
The formats this page recognises

What to look for in a string, and what each is worth for storing passwords. The ratings follow OWASP’s Password Storage Cheat Sheet and libxcrypt’s crypt(5).

FormatHow to spot itFor passwords
Argon2id Starts with $argon2id$v=19$m=…,t=…,p=…$ (PHC string); Django writes argon2$ in front. Recommended at OWASP’s settings
Argon2i and Argon2d The same string with $argon2i$ or $argon2d$. Argon2i acceptable from 3 iterations; Argon2d: choose Argon2id
yescrypt $y$ then a short parameter string such as j9T, a salt and 43 characters ($gy$ and $sm3y$ are variants). Recommended by libxcrypt for Linux
scrypt $7$ (crypt), $scrypt$ln=…,r=…,p=… (passlib), scrypt:N:r:p$ (Flask), scrypt$N$… (Django), $s0$ or $e0801$ (Java, Spring). Acceptable at OWASP’s settings
bcrypt $2a$, $2b$ or $2y$, a two-digit cost, and 53 characters: 60 in all. WordPress 6.8 adds $wp in front. Acceptable from cost 10
PBKDF2 pbkdf2_sha256$ (Django), pbkdf2:sha256: (Flask), $pbkdf2-sha256$ (passlib), {PBKDF2-SHA256} (LDAP), or Base64 starting AQAAAA (ASP.NET Core). Acceptable at OWASP’s counts: 600,000 with SHA-256
SHA-512-crypt and SHA-256-crypt $6$ or $5$, an optional rounds=N$, a salt of up to 16 characters, and 86 or 43 characters. Acceptable with many rounds; raise the 5,000 default
PostgreSQL SCRAM-SHA-256 SCRAM-SHA-256$4096:salt$StoredKey:ServerKey. Right scheme; raise the iterations
MD5-crypt and Apache MD5 $1$ or $apr1$, a salt of up to 8 characters and 22 characters. Replace
phpass and Drupal 7 $P$ (WordPress, Joomla), $H$ (phpBB3) or $S$ (Drupal 7), 34 or 55 characters. Replace
Old crypt variants $sha1$…, $md5$…, $3$$ + 32 hex (NT), _ + 19 characters (BSDi), or 13 characters (DES). Replace
LDAP and Apache {SCHEME} values {SSHA}, {SMD5}, {SHA}, {MD5}, {SSHA256}, {SSHA512} and the like, then Base64. Replace
MySQL native password * and 40 hex digits. Replace
PostgreSQL md5 md5 and 32 hex digits. Replace
Salted MD5 and SHA-1 (Django, old Flask) md5$salt$32 hex digits, or sha1$salt$40 hex digits. Replace
Plain digests 32, 40, 56, 64, 96 or 128 hex digits (or their Base64), for MD5, NTLM, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 and others. The length alone cannot tell them apart. Replace
Windows LM and NT Two 32-digit values joined by a colon, or a pwdump line user:1001:LM:NT:::. Replace
Plain text {noop}, {CLEARTEXT} or {PLAIN} in front of the password itself. Replace at once
Not password hashes UUIDs, JSON Web Tokens, PEM text, sha256:… digests, sha384-… integrity values, and fingerprints written as hex bytes with colons. Not for passwords

Next steps Done. What next?

Start over

A Pro pass unlocks the full result. See passes

All security & privacy tools

About the Hash Format Identifier

Passwords should never be stored as they are typed, but what an application stores instead varies enormously: a bcrypt string, an Argon2 record, a salted SHA-512 line from /etc/shadow, a bare 32-digit MD5, a {SSHA} value from a directory, a Django or Flask format. This page reads the shape of a pasted hash or stored password — its prefix, its length and alphabet, and the numbers written into it — and says which format it most likely is, how sure it is, what the string tells about its cost and salt, and whether the scheme suits password storage by the figures OWASP and libxcrypt publish.

It is meant for checking your own systems: planning a move from MD5, SHA-1 or an old Unix crypt to Argon2id, auditing a user table or a directory before a migration, or understanding a string in a config file or backup. Paste one value, or a whole list with one per line, and you get a count by verdict and a line-by-line table. It never reverses a hash, never looks one up and never tries a password; the text stays in your browser.

Without a pass the result is a free preview: the format, how sure the page is, the verdict for passwords, the parts of the string and the counts of a list in full, with the first half of the settings, the reasons, the advice and the line table. The whole result, and copying or downloading the report, unlock with a Pro pass.

How to use it

  1. Paste a hash or stored password into the box, or a list with one per line. Lines such as alice:$6$… from a shadow file, CSV rows and "password": "…" are read for the hash inside them.
  2. Press Identify (a pasted value is read at once, and Ctrl+Enter works too). The page shows the most likely format, how sure it is, the verdict for storing passwords and the parts of the string.
  3. Read the settings the string carries, why it is rated as it is and what to do about it. Several formats can share one shape; they are listed under Other possibilities.
  4. For a list, read the counts by verdict, the formats found and the line table. With a pass, or after unlocking this result, copy the report or download it as Markdown, a CSV table or JSON.

Examples

A bcrypt hash from a web app’s user table
Input
$2b$12$Qm9ya3NhbHRCb3JrU2Fsd.8Y.cKuHHtk8t4vTZNMGl712YZ9iSJz6
Result
bcrypt ($2b$), cost 12 = 4,096 rounds, 22-character salt, 31-character hash. Certain. Acceptable: meets OWASP’s minimum cost of 10.

OWASP names bcrypt for legacy systems where Argon2id and scrypt are not available, and bcrypt ignores everything past 72 bytes of the password.

A 32-digit hex value
Input
9cc2ae8a1ba7a93da39b46fc1019c481
Result
MD5 (likely); also possible: NTLM, MD4, LM. Replace this scheme: one round of a fast hash, no salt.

The length alone cannot tell MD5 from the Windows NT hash. Where the value came from does.

A line from /etc/shadow
Input
alice:$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJuesI68u4OTLiBFdcbYEdFCoEOfaS35inz1:19000:0:99999:7:::
Result
SHA-512-crypt ($6$), the default 5,000 rounds, salt “saltstring”. Raise the settings: crypt(5) calls the default too low for modern hardware.

The page reads the second field. A leading ! in that field marks a locked password and is taken off before the hash is read.

Common uses

  • Auditing an application’s user table before a migration: which schemes are in use, and how many accounts each.
  • Checking what Django, Flask, Spring Security, ASP.NET Core Identity, WordPress, PostgreSQL, MySQL or a directory server stores, and whether its settings still meet OWASP’s figures.
  • Finding Apache htpasswd entries, directory passwords or system accounts that still use MD5-crypt, {SHA} or plain text.
  • Working out what a string in a config file, a backup or a support ticket is before deciding whether it is a secret.

How the page tells formats apart

  • Prefixes are the surest sign: $2b$ bcrypt, $argon2id$ Argon2, $6$ SHA-512-crypt, $y$ yescrypt, $P$ phpass, {SSHA} and the other bracketed names of LDAP and Spring Security, pbkdf2_sha256$ Django, scrypt: Flask.
  • Length and alphabet decide the rest. A bcrypt hash is exactly 60 characters; a SHA-512-crypt checksum is 86; an unsalted digest is 32, 40, 56, 64, 96 or 128 hex digits.
  • Parameters are read out of the string: a bcrypt cost, Argon2 memory and iterations, PBKDF2 iterations, scrypt N, r and p, the salt length.
  • Certainty says how much of that was needed: certain when a prefix and a valid layout agree, likely for the usual reading of a bare digest, possible for the others that share its length.

What the verdicts mean

The ratings follow the OWASP Password Storage Cheat Sheet and libxcrypt’s crypt(5).

  • Recommended: Argon2id with at least 19 MiB of memory, 2 iterations and 1 lane (or an equal setting), and yescrypt on Linux.
  • Acceptable: scrypt, bcrypt and PBKDF2 at or above OWASP’s settings, and SHA-crypt with many rounds. OWASP names scrypt as the fallback, bcrypt for legacy systems and PBKDF2 where FIPS-140 compliance is required.
  • Raise the settings: the right kind of function with a cost below the published figures.
  • Replace this scheme: single rounds of MD5, SHA-1 or SHA-2, salted or not, and the old crypt, phpass, LDAP, MySQL and Windows formats.
  • Not a password hash: UUIDs, tokens, integrity values and fingerprints.

The figures used

  • bcrypt: a work factor of at least 10.
  • PBKDF2: 600,000 iterations with HMAC-SHA-256, 220,000 with HMAC-SHA-512, 1,400,000 with HMAC-SHA-1 (legacy only).
  • Argon2id: 47,104 KiB with 1 iteration, 19,456 KiB with 2, 12,288 KiB with 3, 9,216 KiB with 4 or 7,168 KiB with 5, one lane. Argon2i counts only from 3 iterations.
  • scrypt: N = 2^17 with p = 1, 2^16 with p = 2, 2^15 with p = 3, 2^14 with p = 5 or 2^13 with p = 10, all with r = 8; a larger r counts as a proportionally larger N.
  • SHA-crypt: crypt(5) calls its default of 5,000 rounds “too low for modern hardware” and gives no target above it.

These are guidance, and guidance moves: check the OWASP page for the figures in force before you decide.

Moving away from a weak scheme

You cannot turn a hash back into a password, so a move happens as users sign in. OWASP describes the options:

  • Rehash at the next sign-in: verify the password against the old hash, then store a new hash made with the stronger scheme. Old hashes stay in the database until the user signs in.
  • Layer the existing hash: use the stored hash as the input of a stronger function, for example bcrypt around an MD5, so every account is protected at once, then swap it for a plain hash at the next sign-in. Layering avoids needing the original passwords but can make the hashes easier to crack.
  • Expire dormant accounts: delete the hashes of users inactive for a long time, which is secure but unfriendly and can look like a breach.

Whichever you choose, new hashes should use Argon2id from the first day.

What the page never does

It never reverses a hash, never looks one up in a table or on the web, and never tests a password. It makes no network request at all. The reports shorten every hash to its first ten and last three characters, and a line that could not be read is reported only as a length, because it may be a password in plain text.

Limitations

  • A bare digest’s length is shared by several algorithms (32 hex digits can be MD5, NTLM, MD4 or LM), so the page lists them and names the usual one; it cannot know which was used.
  • It reads the string, not the system around it. A keyed hash (HMAC) or a hash with a secret pepper looks like a plain digest, and nothing in a string shows whether a pepper exists.
  • Formats it does not know — custom schemes, encrypted passwords, hashes of other products — are reported as not recognised, with a note on what the text looks like.
  • A rating judges the scheme and the settings written in the string, not the passwords behind it and not the code that checks them.
  • A name in braces that Spring Security or an LDAP server writes in front of a value this page cannot read is named but not rated.
  • Lines are read up to 4,096 characters each, and a list up to 5,000 lines or 2,000,000 characters.

Privacy

On this device: nothing is sent

The text you paste is read in this tab by the page’s own code. Nothing is sent, stored or looked up, and the page keeps working offline. The report you copy or download is made in this tab too, with each hash shortened.

Frequently asked questions

What do I get without a pass?

Without a pass, Hash Format Identifier shows the format, how sure it is, the verdict for passwords and the parts of the string, with the first half of the settings, reasons and advice. Until you unlock it, the result can’t be downloaded or copied. A Pro, Premium or Ultimate pass, a one-time payment that never renews, unlocks the full result. The pricing page lists the passes and their prices.

Can this page tell me the password behind a hash?

No. A hash cannot be turned back into the password, and this page never looks hashes up or tries guesses. It reads the format of the string and rates the scheme. If you are planning a migration, the way forward is to rehash at each user’s next sign-in.

Why does a 32-character hex string have several possible formats?

MD5, MD4, the Windows NT hash and the old LM hash all print as 32 hex digits, so the length cannot separate them. The page names the usual one first. A value from a web application’s database is most often MD5; one from a Windows credential store is an NT hash. Where it came from decides.

Is bcrypt still good enough?

At a cost of 10 or more it meets OWASP’s minimum, and OWASP names it for legacy systems where Argon2id and scrypt are not available. Remember its 72-byte limit: longer passwords are cut, so frameworks such as WordPress 6.8 and Django’s bcrypt_sha256 hash the password first.

What should I move to?

Argon2id with at least 19 MiB of memory, 2 iterations and 1 degree of parallelism, or one of OWASP’s equal settings. If Argon2id is not available use scrypt, if neither is use bcrypt with a cost of 10 or more, and use PBKDF2 where FIPS-140 compliance is required.

How do I upgrade without making everyone reset their password?

Rehash at the next sign-in: when a user signs in with the right password, check it against the old hash and store a new one. To protect everyone sooner, wrap the old hash in a stronger function and swap it for a plain hash of the password at the next sign-in. OWASP lists both, with the trade-offs.

Does a longer hash mean a stronger one?

No. Guessing speed depends on how much work one hash takes, not on how long its output is. SHA-512 gives 128 hex digits and is still a fast function, so a graphics card tests billions of guesses a second; bcrypt, scrypt and Argon2 are slow by design.

Is it safe to paste my users’ hashes here?

Nothing leaves your browser: the page makes no requests with what you paste. Even so, a copy of password hashes lets someone test guesses offline, so treat them like secrets: paste only what you are allowed to handle, keep the report’s shortened hashes rather than the originals, and clear the box when you are done.

Quick answers and tool search

Type to search tools or to get a quick answer, for example 18% of 2500. Use the up and down arrow keys to move through the results, Enter to choose, and Escape to close.