
Hash and HMAC Generator: MD5, SHA-256, SHA-512 Online
Compute an MD5 or SHA digest, or sign a message with HMAC, in the browser. Hex, Base64 or Base64URL — text checksums and webhook signatures, 100% local.
A digest proves the bytes; HMAC proves who sent them
A hash and an HMAC answer different questions. The SHA-256 of a string tells you whether that string still matches a published fingerprint. The HMAC-SHA-256 of the same string, computed with a shared secret, tells you whether someone who knows the secret produced it. Neither one is encryption, and neither one is a password store. FastMinify splits the jobs. The online hash generator computes MD5, SHA-1, SHA-256, SHA-384 and SHA-512 from UTF-8 text, and the HMAC generator signs a message with HMAC-SHA-256, SHA-384 or SHA-512. Both run in the browser tab through Web Crypto (MD5 is a local implementation, because Web Crypto does not offer it), and nothing is uploaded. Both are listed on the encoding tools hub, next to the Base64 and JWT tools. Encoding is how you spell bytes, and hashing is how you fingerprint them.
When the browser is the right place to hash
A string you can paste, a secret you are willing to type into your own browser, a digest you already hold.
If the bytes are a binary artifact, or the secret must not appear in a browser on a shared machine, stay in the shell or in CI.
Hash mistakes that look like a match and are not
A plain digest is fast, unsalted and identical for the same input. That suits a checksum and does not suit a password: an attacker can precompute the digest, and two users with the same password share the same value. The hash and HMAC pages say so in their documentation. Password storage belongs with bcrypt-hash (or Argon2 on your server). HMAC is also the wrong tool, because it authenticates a message with a secret you must keep and does not stretch a password.
Anyone can recompute the SHA-256 of a public body. The digest proves the body did not change, but it does not prove who produced it. If a webhook, a release note or an API call must be authentic, you need a secret: HMAC, or a JWT signature checked with jwt-verify. The reverse confusion is just as common after the Base64 encode and decode guide, because Base64 is reversible wrapping. The SHA-256 of abc is ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. You cannot turn that hex back into abc.
The hash generator hashes UTF-8 text, not a raw file. The file picker accepts text extensions only (txt, md, json, csv, html, xml, yml, yaml), up to the 32 MiB browser limit, and the file is decoded as text before hashing. A vendor SHA-256 of a .tar.gz, an image or a PDF will not match, and those types are not in the picker. Even a text file can disagree with sha256sum when the newline convention changes. The SHA-256 of abc is the vector above. The SHA-256 of abc plus a single LF is edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb. Same letters, different bytes.
echo abc | sha256sum (echo adds a newline) and blaming the browsersha256sum or openssl dgst.GitHub's X-Hub-Signature-256 is sha256= plus HMAC-SHA-256 of the raw body, secret as UTF-8. Stripe signs timestamp.payload, not the JSON alone. The HMAC page does not build those strings and does not strip a sha256= prefix. Paste the exact message, the exact key bytes, and only the digest. Expected-digest comparison ignores hex case and spaces, and trailing = on Base64URL. It does not ignore a prefix.
sha256=f7bc… into Expected digestWhich algorithm, which spelling, which tool
They all emit opaque strings. They do not substitute for each other.
The digest bytes do not change. The spelling does. Hex is what sha256sum and most webhook docs print. Padded Base64 is what some APIs return. Unpadded Base64URL is the compact form (no +, /, or trailing =). Uppercase applies only to hex.
A truncated digest is a failed copy, not a different algorithm. Count characters after you strip spaces.
Compute a digest, then sign a message
Open the hash generator. Paste the text or select a text file. Choose hex, Base64 or Base64URL. Turn on Uppercase hex only if the reference digest is printed in capitals; it does nothing for Base64. All five algorithms refresh together. Paste the expected digest to highlight matches, or load the sample if you only want to see how it works. The box must contain at least one character that is not whitespace: an empty field clears the cards instead of showing the well-known SHA-256 of the empty string.
1. Paste the exact bytes as text
Agree on newlines. A trailing LF is part of the input. Do not pretty-print JSON if the other side hashed the compact form.
2. Match the output spelling
Hex for checksums and CLI tools. Padded Base64 when the API shows + / and =. Unpadded Base64URL when the digest sits in a token or a URL.
3. Paste the expected digest
Comparison ignores hex case and spaces, and Base64URL padding. A match highlights the algorithm. No highlight means different bytes, a different spelling, or a prefix you still need to strip.
Open the HMAC generator. There is no file selection, so paste the message and the secret. Pick SHA-256 unless the vendor says SHA-384 or SHA-512. Set Key encoding to UTF-8 for a passphrase-style secret, to hex for a hex key (optional 0x prefix, even length), or to Base64 or Base64URL when the key was stored that way. With UTF-8 on a hex secret, the page signs the characters 0-9a-f, not the key bytes, so the digest does not match, and the cause is hard to spot. Expected digest follows the same comparison rules as the hash page.
The same bytes in Node and openssl
createHash and createHmac hash the string you pass. They do not add a newline. That matches the browser tools.
Basic example
echo appends a newline, so the digest is of different bytes. printf does not. For a file on disk, pass -binary only when you want raw digest bytes; hex is the default text form.
Basic example
No install, nothing sent to a server, five hash algorithms or three HMAC algorithms, hex / Base64 / Base64URL, and an expected-digest highlight. The limits: text and UTF-8 only, a 32 MiB cap for text files on the hash page, no binary checksum, no HMAC with MD5, no password stretching, no JWT assembly. Use the pages to inspect a snippet or reproduce a webhook digest. Keep openssl for the release artifact and bcrypt for the password.
Conclusion
Hash the text when you need to know it did not change. Use HMAC when a shared secret must prove who produced it. FastMinify does both in the browser. It handles MD5 through SHA-512 for UTF-8 text (and text files up to 32 MiB), and HMAC-SHA-256, SHA-384 or SHA-512 with a UTF-8, hex or Base64 key, written as hex, Base64 or unpadded Base64URL. It will not checksum a tarball, store a password or verify a JWT. Those jobs stay with openssl, bcrypt and jwt-verify. Start from the encoding tools hub when the string is still just text.
Hash or sign in the browser
Related Articles

Paste a token and a JWKS to check an RS256, ES256 or HS256 signature in your browser. How kid picks the key, measured errors and the claims to check.

HTTP/2 and HTTP/3 change how files travel, not how big they are. Measured sizes, compile times and bundling tests show what minification still saves.

Convert a Unix epoch to a readable date and back, tell seconds from milliseconds, and avoid time zone, JWT and clock change traps, all in your browser.