dumbtv
dumbtv takes the ads, screen tracking and update nags out of your Fire TV over ADB. No root, none of your apps touched, every step can be undone. Free and open source.
翻譯準備中
Passphrase & password generator in one self-contained HTML file — EFF or common-English words, or ASCII characters. Blurred by default, QR export for wallets like Krux. Works offline, no dependencies, never touches the internet.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A passphrase and password generator in one self-contained HTML file. No
build, no dependencies, nothing ever sent over the internet: download one file, open it in a
browser, done. It works with the Wi-Fi off, and a Content-Security-Policy tells
the browser to refuse if anything on the page ever tried to phone home.
Truly random. Centuries to crack. Humans are terrible at inventing
passwords. A passphrase, a handful of words chosen truly at random, is
easier to remember than Tr0ub4dor&3 and far harder to guess.檢視完整 README ↗A passphrase and password generator in one self-contained HTML file. No build, no dependencies, nothing ever sent over the internet: download one file, open it in a browser, done. It works with the Wi-Fi off, and a Content-Security-Policy tells the browser to refuse if anything on the page ever tried to phone home.
Truly random. Centuries to crack. Humans are terrible at inventing passwords. A passphrase, a handful of words chosen truly at random, is easier to remember than
Tr0ub4dor&3and far harder to guess.
ipz2!az8k%0h-style password where a manager autofills or a length limit
bites0042 is a valid PIN, which range-style generators cannot produce)index = Σ (dᵢ−1)·6⁴⁻ⁱ, no
hashing, no bias), so anyone with the same rolls and the printed list gets the
same words. Typed rolls can be invented, so the sister project's roll-quality
check runs on them before anything is made: one number, a repeating block, a
run, a missing face or a loaded die are named, and the first press writes
nothing until a separate Make it anyway is pressed. Thresholds are
re-calibrated for this page's shorter strings (20–60 rolls): on 20,000 fair
sequences per length, false alarms are 0.04% at 20 rolls, 0.01% at 30, 0.6%
at 40 and 0.01% at 60, and every faked pattern tried is caught. The rolls
field is blurred under the same eye as the passphrase, because the rolls
are the passphrase one step earliercrypto.getRandomValues with
rejection sampling, so each word and character is exactly as likely as every
other; Math.random appears nowhere in the fileest., held under two ceilings the page can prove: a word on one of the
lists cannot be worth more than the list it came from, since anyone who knows
the recipe simply tries all 7,776, and text written entirely in a small
alphabet, such as 32 hex digits, cannot be worth more than that alphabet
carries per character. Both only ever lower a figure and credit none. Edit
the box to test any password of your ownDownload mypassphrase.html from the
latest release.
Every release publishes the SHA-256 of the file alongside it. Check the one you
downloaded against it before you open it:
# macOS
shasum -a 256 ~/Downloads/mypassphrase.html
# Linux
sha256sum ~/Downloads/mypassphrase.html
# Windows (PowerShell)
Get-FileHash $HOME\Downloads\mypassphrase.html -Algorithm SHA256
If what you get is not the value published on the release page, stop. Do not open the file.
That tells you the file is the one published. It cannot tell you the published one is honest; reading it is what checks that, and it is written to be read.
Cloning the repo works too: index.html there is the same file, named for the
web server that has to serve it at the domain root. SHA256SUMS.txt beside it
records its SHA-256; the release asset is the same bytes under its download
name, so one value checks either. With a clone:
shasum -a 256 -c SHA256SUMS.txt # macOS; sha256sum -c SHA256SUMS.txt on Linux
Be clear about what that proves: SHA256SUMS.txt travels in the same
repository as the page, so whoever could change one could change the other. It
tells you the file you hold is the file that was published, nothing more.
One check does not share that weakness. Each release is signed, through Sigstore, by the GitHub Actions run that built it, a signature the repository's contents cannot forge. With the GitHub CLI:
gh attestation verify ~/Downloads/mypassphrase.html -R seQRets/My-Passphrase
It names the workflow, the commit and the tag the file came from. Releases before this was added have no attestation; for those, the checksum is what there is.
For a passphrase that will guard something important: go offline first. Turn off Wi-Fi, open the downloaded file in a browser profile with no extensions, generate, and store the result in a password manager (or memory) before reconnecting. The page's badge shows whether you are offline.
There is no build step. The file you download is the source, readable in any text editor: the wordlists, the RNG, the strength meter, and the two embedded libraries are all in plain sight.
The page never touches the internet (no images, no fonts, no scripts) and its
CSP (default-src 'none') makes the browser enforce that. Nothing typed or
generated is stored, logged, or sent. What a web page cannot defend against
(browser extensions, a compromised machine, clipboard snooping) is documented
in the page's own Q&A and in SECURITY.md, which also explains
how to report a vulnerability. Machine-readable contact details are at
/.well-known/security.txt
(RFC 9116).
The page does not permit inline script in general. Its Content-Security-Policy
names each of its four <script> blocks by the SHA-256 of its own text, so a
block the policy was not expecting does not run, including one you meant to
change. It also refuses to be framed: if another site embeds it, the tool is
withheld and a notice says so.
There is no build step. Edit index.html and reload.
index.htmlnode scripts/update-csp-hashes.mjs
Alter a single character inside a script block and the browser refuses the
whole block, which looks like the page loading normally and the tool doing
nothing whatsoever. This script recomputes the four hashes, rewrites the policy
in place, and regenerates SHA256SUMS.txt. Plain Node, no dependencies, like
everything else here. It also refuses to write if the markup has grown an inline
event handler (onclick="…"), because a hash cannot cover one and making it run
would take 'unsafe-hashes', which hands back what the pinning is for.
node scripts/update-csp-hashes.mjs --check
writes nothing and reports whether the pins and the sums are current; CI runs this on every push and pull request. The same script, and the same rule, as the sister project seQRets/My-Seed-Phrase.
node verify.js
verify.js drives the page in headless Chrome and asserts on it: 53 checks,
no dependencies, Node 22+ and Chrome (set CHROME if the binary is somewhere
unusual). It recomputes the CSP pins itself rather than trusting the script that
wrote them, loads the page over file:// and over http and fails on any CSP
violation, exception or request other than the page itself; measures
randomIndex() for uniformity (chi-square, p < .001) at the list sizes the page
draws from and confirms it never lands past the end; generates from every pool
and checks membership and alphabet; confirms a generated secret is counted
exactly and born blurred, and that typed words zxcvbn overrates are still held
under the list ceiling; checks that 💪 adds what it says; round-trips all seven
encodings, five of them against Node's own encoder and the other two against
published vectors; opens the QR and checks it is blurred until revealed; frames
the page from another origin and checks the tool is withheld; and checks nothing
scrolls sideways at 320, 390 and 1440px. Every check was confirmed to fail
against deliberately broken code before being kept: a biased randomIndex, a
meter without its ceiling, a removed frame gate, a stale CSP pin and an
unblurred secret each trip at least one. CI runs it on every push.
useapassphrase ships as
js/zxcvbn.js,
byte for byte (SHA-256
0a3d6a34bc9757c5c469b98b77ad8acb500b847a7b57cfe62d8ba8a9206ce41e), a
pre-4.0 Closure-compiled build with the original entropy /
match_sequence API the meter is written against. It does not correspond
to any zxcvbn release on npm, so check it against that file, not against
the npm package6d557f0693958fb5e650b68b5bee585eb82cf4da32965505c789e924743bc522)google-10000-english-usa-no-swears.txt, keeping the words of 4 to 9
lowercase letters, deduplicated and sorted: 7,459 words, SHA-256
57970da208e266b4df7c52f7599138c10930602a936571c70cbc108aade43de3.
node scripts/check-wordlists.mjs re-derives both lists from their upstream
files and fails if either embedded list differs; CI runs it on every pushMIT © Toothjockey LLC