Here comes the Hackpocalypse
Math 4440/5440 Coding and Cryptography · Prof. Stange · October 2026
| Stored on server | If the database leaks… |
|---|---|
password123 |
every password is just there |
| \(H(\text{pw})\) | one precomputed table cracks everyone; identical passwords look identical |
| \(s,\ H(s \,\Vert\, \text{pw})\) with random salt \(s\) | attacker must guess each user separately |
| \(s,\ \text{Argon2id}(s, \text{pw}; \text{cost})\) | each guess costs real time and memory |
Without salt, the attacker can compute \(H(w)\) once for every word \(w\) in a huge list and then look up every user at once.
With salt, the server picks a random \(s\) per user (say 16 bytes) and stores \((s, H(s\,\Vert\,\text{pw}))\).
Under the hood: hash functions only (SHA-256, bcrypt, scrypt, Argon2id), no keys. Your password travels to the server inside TLS, the encryption behind https (see Certificates). Post-quantum: safe. Grover’s algorithm speeds up guessing by at most a square root.
Rough guesses per second on one gaming GPU (hashcat benchmarks, RTX 4090):
| Hash | Guesses / second |
|---|---|
| MD5 (old, fast) | \(\approx 1.6\times 10^{11}\) |
| SHA-256 (fast) | \(\approx 2.2\times 10^{10}\) |
| bcrypt, cost 12 | \(\approx 1.4\times 10^{3}\) |
Randall Munroe, xkcd 936 “Password Strength” (2011), xkcd.com/936, CC BY-NC 2.5
Time to try the whole space (the expected time is half). Online: guessing at a live login, 1000/s. Offline: a stolen database; one GPU, or 1000 rented GPUs on MD5.
| Password space | Size | Bits | Modern online hacker | bcrypt-12 | MD5 | Modern offline hacker |
|---|---|---|---|---|---|---|
| a real human’s password (top \(10^9\) guesses) | \(10^9\) | 30 | 12 days | 8 days | 6 ms | instant |
| 8 lowercase letters | \(2.1\times10^{11}\) | 38 | 7 years | 5 years | 1 s | 1 ms |
| 8 random printable characters | \(6.6\times10^{15}\) | 53 | 200 000 years | 150 000 years | 11 hours | 41 s |
| 4 random Diceware words | \(3.7\times10^{15}\) | 52 | 120 000 years | 80 000 years | 6 hours | 23 s |
| 6 random Diceware words | \(2.2\times10^{23}\) | 78 | ∞ (in practice) | ∞ (in practice) | 43 000 years | 44 years |
| 12 random printable characters | \(5.4\times10^{23}\) | 79 | ∞ (in practice) | ∞ (in practice) | 100 000 years | 110 years |
Use a passphrase of 6+ words chosen by dice or software, not by you, and keep it for the few passwords you must memorize.
Use a password manager (Bitwarden, 1Password, the one built into your phone or browser…). Memorize one strong passphrase; let the manager generate a random 20-character password per site. A manager also refuses to auto-fill on a fake domain, which gives you some protection against phishing too.
Have I Been Pwned uses \(k\)-anonymity:
your password → SHA-1 → 5BAA6 · 1E4C9B93F3… → send only 5BAA6
5BAA6 (about 2000 of them) and your computer checks for a match.password → SHA-1 begins 5BAA6; the matching suffix shows up with count 52 372 427. Compute some SHA-1 hashes with the course’s hash tools, then look up a prefix at api.pwnedpasswords.com/range/XXXXX, e.g. api.pwnedpasswords.com/range/5BAA6 (only use passwords you don’t actually use!).
master password → slow KDF, salt → master key → unlocks vault key → AES-256 decrypts each entry
End-to-end encryption. Encryption and decryption happen only on your devices. The company stores ciphertext.
To log in to sync, your device sends \(H(K_m, \text{master pw})\), which the server hashes again before storing. The server never sees \(K_m\), so it can’t read your vault.
The master password is the one password you must make strong: 6+ random words. Use two-factor login. Keep a recovery copy offline.
Under the hood: Bitwarden uses PBKDF2-SHA256 or Argon2id, then AES-256-CBC with HMAC-SHA256; 1Password uses AES-256-GCM. Sharing a vault with another person wraps keys with RSA-2048. Sync runs over TLS. Post-quantum: the symmetric parts are safe; RSA sharing is not.
| Factor | Secret lives… | Phishable? | Weak spot |
|---|---|---|---|
| SMS code | with your phone company | yes | SIM swap: a scammer talks your carrier into moving your number |
| Authenticator app (TOTP) | shared by you and the server | yes | real-time relay by a fake site |
| Push “Approve?” | phone app | yes | “MFA fatigue”: spam prompts until you tap yes |
| Passkey / hardware key (FIDO2) | only on your device | no | losing the device (so register two) |
At setup, you and the server share a random key \(K\) (the QR code). Every 30 seconds: \[T = \left\lfloor \frac{t_{\text{unix}}}{30} \right\rfloor, \qquad \text{code} = \operatorname{Trunc}\big(\operatorname{HMAC\text{-}SHA1}(K,\ T)\big) \bmod 10^6 .\] HMAC is a keyed hash: without \(K\) you can’t predict the next code, even after seeing old ones.
Under the hood: HMAC-SHA1, symmetric: one shared key. Post-quantum: safe.
Registration: your device makes a new key pair for this site, keeps \(sk\) and sends \(pk\).
Login:
Signatures are usually ECDSA on the curve P-256, sometimes Ed25519 or RSA. Not yet post-quantum; post-quantum signatures (ML-DSA) for FIDO are in development. The server stores only \(pk\).
Passkey = key stored on device or password manager. Security key = key stored in hardware device.
The browser, not you, puts the site’s real domain (the origin) into the signed message.
paypa1.com asks to log in → browser: “keys for paypa1.com?” → none exist: nothing to sign
The chip holds a strong random key and lets the PIN unlock it. PIN security comes from rate limiting: a YubiKey’s FIDO2 PIN allows 8 wrong tries and it locks.
| Date | What happened |
|---|---|
| Oct 17 | Amazon’s honeypots catch an exploit attempt, before any announcement |
| Oct 20 | Bug identifiers leak; PHP announces an emergency release |
| Oct 21 | Fixes released; CISA alert; Cloudflare deploys firewall rules |
| Oct 21–23 | Broad exploitation attempts by multiple groups |
Turn on automatic updates for your phone, laptop, browser and router, and restart when asked. Retire software and devices that no longer get updates, like an old router or an old WordPress site.
Under the hood: updates are signed by the vendor (RSA, ECDSA or Ed25519) and downloaded over TLS. Post-quantum: not yet, but forging a signature needs a quantum computer at the time of the attack, so there is no “harvest now” risk.
A certificate authority (CA) is an organization your browser trusts to vouch that a public key belongs to a domain (e.g., Let’s Encrypt or DigiCert).
bank.com certificatebank.com.These signatures use RSA or ECDSA. For ECDSA on the curve P-384 with base point \(G\) of prime order \(n \approx 2^{384}\):
Recovering \(d\) from \(Q\) is the elliptic curve discrete log problem. The best known attack, Pollard rho, takes about \(\sqrt{n} \approx 2^{192}\) steps.
A typical TLS connection: key exchange X25519 (elliptic-curve Diffie–Hellman), now usually the hybrid X25519 + ML-KEM-768 (post-quantum, default in Chrome, Firefox and Cloudflare); certificate signatures RSA-2048 or ECDSA P-256/P-384 (not yet post-quantum); the data itself AES-GCM or ChaCha20-Poly1305 (safe).
On October 17, 2026, Mozilla got a report on eight intermediate certificates of eMudhra, an Indian CA.
Their private keys were \(d \in \{4,\ 56,\ 66,\ 115,\ 155,\ 156,\ 230,\ 237\}\).

Randall Munroe, xkcd 221 “Random Number” (2007), xkcd.com/221, CC BY-NC 2.5
https and the padlock): anyone could sign a valid-looking certificate for any website and intercept traffic with a padlock showing.Certificate Transparency. Browsers only accept certificates recorded in public append-only logs. Each log is a Merkle tree: every node is the SHA-256 hash of its two children (post-quantum safe). To prove a certificate is in a log of \(N\) entries, the log sends just the \(\lceil \log_2 N \rceil\) sibling hashes on the path to the root. A forged certificate must either appear in a public log, where domain owners can spot it, or be rejected.
| When | What went wrong | The math that broke it |
|---|---|---|
| 2008 | Debian’s OpenSSL seeded its generator with only the process ID | only 32 768 possible keys: list them all |
| 2010 | Sony signed PlayStation 3 software with the same ECDSA nonce \(k\) every time | two signatures give two linear equations mod \(n\): solve for \(d\) |
| 2012 | Many devices generated RSA keys with too little entropy at boot | \(\gcd(N_1, N_2) = p\) factors both: about 0.5% of TLS hosts’ keys broken |
| 2026 | eMudhra CA keys \(d \le 237\) | a for-loop |
Sony’s mistake. ECDSA signs a hash \(h\) as \(r = (kG)_x\), \(s = k^{-1}(h + rd) \bmod n\). Given two signatures \((r, s_1)\) on \(h_1\) and \((r, s_2)\) on \(h_2\) with the same \(k\), solve for \(k\) and then for \(d\).
Keep your browser and OS updated so you get the block lists.
The site’s real identity is the registrable domain: the part just before the first single /, read right to left.
@ is a “username” and is ignoredxn--80ak6aa92e.comHomoglyphs. Unicode has many letters that look like Latin ones: Cyrillic а (U+0430), р (U+0440), е (U+0435), ӏ (U+04CF). If each of 5 letters in a name has 3 lookalikes, there are \(4^5 - 1 = 1023\) impostor spellings of one name. Browsers show the punycode form (xn--…) when scripts are mixed suspiciously, but not always.
Don’t log in from links. Type the address or use a bookmark. Your password manager won’t auto-fill on the wrong domain: treat that as an alarm.
Calling back on a known number is out-of-band authentication.
A family code word is a pre-shared secret.
A secret known fact is a challenge-response protocol.
| Job | Typical algorithms | Used in | Quantum computer | Status |
|---|---|---|---|---|
| Key exchange (public key) | X25519 / ECDH, RSA | TLS, SSH, Signal, iMessage | broken by Shor; harvest now, decrypt later | hybrid ML-KEM already default: Chrome, Firefox, Cloudflare, OpenSSH 10, Signal, iMessage PQ3 |
| Signatures (public key) | RSA, ECDSA, Ed25519 | certificates, passkeys, software updates, caller ID | broken by Shor, but only for forgeries made once the machine exists | ML-DSA, SLH-DSA standardized (FIPS 204, 205, 2024); deployment just starting |
| Encryption and MACs (symmetric) | AES, ChaCha20, HMAC | TLS data, password vaults, TOTP, disk encryption | Grover: square-root speedup at best | AES-256 is fine |
| Hashing | SHA-256, bcrypt, Argon2id | password storage, CT logs, HIBP | Grover again | fine |
Social security numbers and identity theft
The SSN is a bad authenticator:
AAA-GG-SSSS, with the area number set by state and groups issued in a known order. In 2009, Acquisti and Gross predicted SSNs from birth date and place for many people born after 1988. Since June 2011 they’re randomized, but earlier numbers can’t change.Assume your SSN, birth date and address are public.
A freeze, a “lock” and a “fraud alert” are different things. A freeze is the free, legally backed one.