DEV Community

zhihu wu
zhihu wu

Posted on Originally published at codetoolbox.pro

Hashing vs Encryption vs Encoding: The Difference Every Developer Gets Wrong

Hashing, encryption, and encoding sound similar — but they solve completely different problems. Mixing them up causes security bugs, broken APIs, and confused code reviews. Here's the mental model that finally made it click for me.

Encoding: not security at all

Encoding converts data from one format to another so it can be transported or displayed. Base64, URL encoding, hex — all reversible without any key. btoa()/atob(), encodeURIComponent, Buffer.from(x, 'base64') — none of these protect anything. Anyone can decode them. Encoding is about compatibility, not confidentiality.

Hashing: one-way by design

A hash function maps any input to a fixed-length output. SHA-256 always produces 64 hex characters, whether the input is "hi" or a 2GB video. Three properties matter:

  • Deterministic — same input, same hash, always.
  • One-way — you can't reverse a hash into its input.
  • Avalanche effect — changing one character flips roughly half the bits.

That's why hashes verify integrity: file checksums, Git commit IDs, npm lockfiles, API signatures. You can't "decrypt" a hash — you compare hashes.

Encryption: reversible, but only with a key

Encryption is the only one that provides confidentiality. AES, RSA, ChaCha20 — ciphertext turns back into plaintext, but only with the right key. TLS, HTTPS, disk encryption, JWT payloads — all encryption.

The one-line cheat sheet

Concept Reversible? Needs a key? Purpose
Encoding Yes No Format conversion (Base64, URL encoding)
Hashing No No Integrity checks (SHA-256 checksums)
Encryption Yes Yes Confidentiality (AES, RSA)

Common bugs this clears up

  • Storing passwords with MD5/SHA-256? That's hashing — fine for integrity, but passwords need slow salted algorithms like bcrypt or argon2.
  • "Let me encrypt this string with Base64" — Base64 is encoding; it obfuscates nothing.
  • Verifying a downloaded file? Compare its SHA-256 checksum — a hash, not encryption.

💡 When I need to quickly hash a string or verify a checksum, I use the SHA-256 Hash Generator on CodeToolbox — it computes SHA-1/256/384/512 right in the browser, nothing is uploaded.

What's a hashing/encryption mixup you've seen in production? Drop it in the comments.

Top comments (0)