AXLR / Catalog / security

password_entropy

Estimate a password's strength without ever echoing it: the character-pool bound (length x log2 of the pool), a pattern-adjusted estimate that charges common passwords (a bundled list of the 2000 most common, from SecLists), l33t substitutions, keyboard runs, sequences, repeats, dates and context words at their guessing cost, crack-time estimates at stated guess rates (online and offline) and NIST SP 800-63B advice. Findings give only the pattern type, position and length.

Install

/tools install password_entropy
/tools install password_entropy@1.0.0

In a console session, or let the model find it in normal mode: axlr_catalog describes it and axlr_install_tool asks for the same install card. The card reads catalog axlr · password_entropy 1.0.0 · verified once the index signature, the manifest digest and every file digest check out. Then the model runs it with axlr_run_tool password_entropy; each run is approved as a local_exec.

Arguments

One JSON object on stdin, validated against the schema before the program starts.

nametyperequireddefaultmeaning
passwordstringyeslength ≥ 1; length ≤ 4096
contextarray of stringno[]User or service words to penalise (name, e-mail, site). items ≤ 50
guesses_per_secondobject of numberno{}Extra attack rates {label: guesses per second}
Input schema (JSON)
{
  "type": "object",
  "required": [
    "password"
  ],
  "additionalProperties": false,
  "properties": {
    "password": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4096
    },
    "context": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 256
      },
      "maxItems": 50,
      "default": [],
      "description": "User or service words to penalise (name, e-mail, site)"
    },
    "guesses_per_second": {
      "type": "object",
      "additionalProperties": {
        "type": "number",
        "exclusiveMinimum": 0
      },
      "default": {},
      "description": "Extra attack rates {label: guesses per second}"
    }
  }
}

Example

Input

{
  "password": "kxqbvtmzrwpj"
}

Output (stdout)

{
  "length": 12,
  "pool_size": 26,
  "pool_entropy_bits": 56.41,
  "estimated_entropy_bits": 56.41,
  "rating": "fair",
  "patterns": []
}

Files

The command the install card registers is python3 password_entropy.py, run in the workspace with PATH and HOME as its only environment. Each file's SHA-256 is in the signed index; the console checks them before showing the card and again before writing.

common_passwords.txt · sha256 4d03381115e4c2d591e5698bbd1941bec8a34fe2650f588c164f57d8bfe1fcee
# Most common passwords (rank<TAB>password, lower-cased), first 2000 of length >= 4.
# Source: SecLists Passwords/Common-Credentials/10k-most-common.txt, MIT License,
# https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Common-Credentials/10k-most-common.txt
# Fetched 2026-10-18 by tools/catalog/data/password_entropy.py
1	password
2	123456
3	12345678
4	1234
5	qwerty
6	12345
7	dragon
8	pussy
9	baseball
10	football
11	letmein
12	monkey
13	696969
14	abc123
15	mustang
16	michael
17	shadow
18	master
19	jennifer
20	111111
21	2000
22	jordan
23	superman
24	harley
25	1234567
26	fuckme
27	hunter
28	fuckyou
29	trustno1
30	ranger
31	buster
32	thomas
33	tigger
34	robert
35	soccer
36	fuck
37	batman
38	test
39	pass
40	killer
41	hockey
42	george
43	charlie
44	andrew
45	michelle
46	love
47	sunshine
48	jessica
49	asshole
50	6969
51	pepper
52	daniel
53	access
54	123456789
55	654321
56	joshua
57	maggie
58	starwars
59	silver
60	william
61	dallas
62	yankees
63	123123
64	ashley
65	666666
66	hello
67	amanda
68	orange
69	biteme
70	freedom
71	computer
72	sexy
73	thunder
74	nicole
75	ginger
76	heather
77	hammer
78	summer
79	corvette
80	taylor
81	fucker
82	austin
83	1111
84	merlin
85	matthew
86	121212
87	golfer
88	cheese
89	princess
90	martin
91	chelsea
92	patrick
93	richard
94	diamond
95	yellow
96	bigdog
97	secret
98	asdfgh
99	sparky
100	cowboy
101	camaro
102	anthony
103	matrix
104	falcon
105	iloveyou
106	bailey
107	guitar
108	jackson
109	purple
110	scooter
111	phoenix
112	aaaaaa
113	morgan
114	tigers
115	porsche
116	mickey
117	maverick
118	cookie
119	nascar
120	peanut
121	justin
122	131313
123	money
124	horny
125	samantha
126	panties
127	steelers
128	joseph
129	snoopy
130	boomer
131	whatever
132	iceman
133	smokey
134	gateway
135	dakota
136	cowboys
137	eagles
138	chicken
139	dick
140	black
141	zxcvbn
142	please
143	andrea
144	ferrari
145	knight
146	hardcore
147	melissa
148	compaq
149	coffee
150	booboo
151	bitch
152	johnny
153	bulldog
154	xxxxxx
155	welcome
156	james
157	player
158	ncc1701
159	wizard
160	scooby
161	charles
162	junior
163	internet
164	bigdick
165	mike
166	brandy
167	tennis
168	blowjob
169	banana
170	monster
171	spider
172	lakers
173	miller
174	rabbit
175	enter
176	mercedes
177	brandon
178	steven
179	fender
180	john
181	yamaha
182	diablo
183	chris
184	boston
185	tiger
186	marine
187	chicago
188	rangers
189	gandalf
190	winter
191	bigtits
192	barney
193	edward
194	raiders
195	porn
196	badboy
197	blowme
198	spanky
199	bigdaddy
200	johnson
201	chester
202	london
203	midnight
204	blue
205	fishing
206	000000
207	hannah
208	slayer
209	11111111
210	rachel
211	sexsex
212	redsox
213	thx1138
214	asdf
215	marlboro
216	panther
217	zxcvbnm
218	arsenal
219	oliver
220	qazwsx
221	mother
222	victoria
223	7777777
224	jasper
225	angel
226	david
227	winner
228	crystal
229	golden
230	butthead
231	viking
232	jack
233	iwantu
234	shannon
235	murphy
236	angels
237	prince
238	cameron
239	girls
240	madison
241	wilson
242	carlos
243	hooters
244	willie
245	startrek
246	captain
247	maddog
248	jasmine
249	butter
250	booger
251	angela
252	golf
253	lauren
254	rocket
255	tiffany
256	theman
257	dennis
258	liverpoo
259	flower
260	forever
261	green
262	jackie
263	muffin
264	turtle
265	sophie
266	danielle
267	redskins
268	toyota
269	jason
270	sierra
271	winston
272	debbie
273	giants
274	packers
275	newyork
276	jeremy
277	casper
278	bubba
279	112233
280	sandra
281	lovers
282	mountain
283	united
284	cooper
285	driver
286	tucker
287	helpme
288	fucking
289	pookie
290	lucky
291	maxwell
292	8675309
293	bear
294	suckit
295	gators
296	5150
297	222222
298	shithead
299	fuckoff
300	jaguar
301	monica
302	fred
303	happy
304	hotdog
305	tits
306	gemini
307	lover
308	xxxxxxxx
309	777777
310	canada
311	nathan
312	victor
313	florida
314	88888888
315	nicholas
316	rosebud
317	metallic
318	doctor
319	trouble
320	success
321	stupid
322	tomcat
323	warrior
324	peaches
325	apples
326	fish
327	qwertyui
328	magic
329	buddy
330	dolphins
331	rainbow
332	gunner
333	987654
334	freddy
335	alexis
336	braves
337	cock
338	2112
339	1212
340	cocacola
341	xavier
342	dolphin
343	testing
344	bond007
345	member
346	calvin
347	voodoo
348	7777
349	samson
350	alex
351	apollo
352	fire
353	tester
354	walter
355	beavis
356	voyager
357	peter
358	porno
359	bonnie
360	rush2112
361	beer
362	apple
363	scorpio
364	jonathan
365	skippy
366	sydney
367	scott
368	red123
369	power
370	gordon
371	travis
372	beaver
373	star
374	jackass
375	flyers
376	boobs
377	232323
378	zzzzzz
379	steve
380	rebecca
381	scorpion
382	doggie
383	legend
384	ou812
385	yankee
386	blazer
387	bill
388	runner
389	birdie
390	bitches
391	555555
392	parker
393	topgun
394	asdfasdf
395	heaven
396	viper
397	animal
398	2222
399	bigboy
400	4444
401	arthur
402	baby
403	private
404	godzilla
405	donald
406	williams
407	lifehack
408	phantom
409	dave
410	rock
411	august
412	sammy
413	cool
414	brian
415	platinum
416	jake
417	bronco
418	paul
419	mark
420	frank
421	heka6w2
422	copper
423	billy
424	cumshot
425	garfield
426	willow
427	cunt
428	little
429	carter
430	slut
431	albert
432	69696969
433	kitten
434	super
435	jordan23
436	eagle1
437	shelby
438	america
439	11111
440	jessie
441	house
442	free
443	123321
444	chevy
445	bullshit
446	white
447	broncos
448	horney
449	surfer
450	nissan
451	999999
452	saturn
453	airborne
454	elephant
455	marvin
456	shit
457	action
458	adidas
459	qwert
460	kevin
461	1313
462	explorer
463	walker
464	police
465	christin
466	december
467	benjamin
468	wolf
469	sweet
470	therock
471	king
472	online
473	dickhead
474	brooklyn
475	teresa
476	cricket
477	sharon
478	dexter
479	racing
480	penis
481	gregory
482	0000
483	teens
484	redwings
485	dreams
486	michigan
487	hentai
488	magnum
489	87654321
490	nothing
491	donkey
492	trinity
493	digital
494	333333
495	stella
496	cartman
497	guinness
498	123abc
499	speedy
500	buffalo
501	kitty
502	pimpin
503	eagle
504	einstein
505	kelly
506	nelson
507	nirvana
508	vampire
509	xxxx
510	playboy
511	louise
512	pumpkin
513	snowball
514	test123
515	girl
516	sucker
517	mexico
518	beatles
519	fantasy
520	ford
521	gibson
522	celtic
523	marcus
524	cherry
525	cassie
526	888888
527	natasha
528	sniper
529	chance
530	genesis
531	hotrod
532	reddog
533	alexande
534	college
535	jester
536	passw0rd
537	bigcock
538	smith
539	lasvegas
540	carmen
541	slipknot
542	3333
543	death
544	kimberly
545	1q2w3e
546	eclipse
547	1q2w3e4r
548	stanley
549	samuel
550	drummer
551	homer
552	montana
553	music
554	aaaa
555	spencer
556	jimmy
557	carolina
558	colorado
559	creative
560	hello1
561	rocky
562	goober
563	friday
564	bollocks
565	scotty
566	abcdef
567	bubbles
568	hawaii
569	fluffy
570	mine
571	stephen
572	horses
573	thumper
574	5555
575	pussies
576	darkness
577	asdfghjk
578	pamela
579	boobies
580	buddha
581	vanessa
582	sandman
583	naughty
584	douglas
585	honda
586	matt
587	azerty
588	6666
589	shorty
590	money1
591	beach
592	loveme
593	4321
594	simple
595	poohbear
596	444444
597	badass
598	destiny
599	sarah
600	denise
601	vikings
602	lizard
603	melanie
604	assman
605	sabrina
606	nintendo
607	water
608	good
609	howard
610	time
611	123qwe
612	november
613	xxxxx
614	october
615	leather
616	bastard
617	young
618	101010
619	extreme
620	hard
621	password1
622	vincent
623	pussy1
624	lacrosse
625	hotmail
626	spooky
627	amateur
628	alaska
629	badger
630	paradise
631	maryjane
632	poop
633	crazy
634	mozart
635	video
636	russell
637	vagina
638	spitfire
639	anderson
640	norman
641	eric
642	cherokee
643	cougar
644	barbara
645	long
646	420420
647	family
648	horse
649	enigma
650	allison
651	raider
652	brazil
653	blonde
654	jones
655	55555
656	dude
657	drowssap
658	jeff
659	school
660	marshall
661	lovely
662	1qaz2wsx
663	jeffrey
664	caroline
665	franklin
666	booty
667	molly
668	snickers
669	leslie
670	nipples
671	courtney
672	diesel
673	rocks
674	eminem
675	westside
676	suzuki
677	daddy
678	passion
679	hummer
680	ladies
681	zachary
682	frankie
683	elvis
684	reggie
685	alpha
686	suckme
687	simpson
688	patricia
689	147147
690	pirate
691	tommy
692	semperfi
693	jupiter
694	redrum
695	freeuser
696	wanker
697	stinky
698	ducati
699	paris
700	natalie
701	babygirl
702	bishop
703	windows
704	spirit
705	pantera
706	monday
707	patches
708	brutus
709	houston
710	smooth
711	penguin
712	marley
713	forest
714	cream
715	212121
716	flash
717	maximus
718	nipple
719	bobby
720	bradley
721	vision
722	pokemon
723	champion
724	fireman
725	indian
726	softball
727	picard
728	system
729	clinton
730	cobra
731	enjoy
732	lucky1
733	claire
734	claudia
735	boogie
736	timothy
737	marines
738	security
739	dirty
740	admin
741	wildcats
742	pimp
743	dancer
744	hardon
745	veronica
746	fucked
747	abcd1234
748	abcdefg
749	ironman
750	wolverin
751	remember
752	great
753	freepass
754	bigred
755	squirt
756	justice
757	francis
758	hobbes
759	kermit
760	pearljam
761	mercury
762	domino
763	9999
764	denver
765	brooke
766	rascal
767	hitman
768	mistress
769	simon
770	tony
771	bbbbbb
772	friend
773	peekaboo
774	naked
775	budlight
776	electric
777	sluts
778	stargate
779	saints
780	bondage
781	brittany
782	bigman
783	zombie
784	swimming
785	duke
786	qwerty1
787	babes
788	scotland
789	disney
790	rooster
791	brenda
792	mookie
793	swordfis
794	candy
795	duncan
796	olivia
797	hunting
798	blink182
799	alicia
800	8888
801	samsung
802	bubba1
803	whore
804	virginia
805	general
806	passport
807	aaaaaaaa
808	erotic
809	liberty
810	arizona
811	jesus
812	abcd
813	newport
814	skipper
815	rolltide
816	balls
817	happy1
818	galore
819	christ
820	weasel
821	242424
822	wombat
823	digger
824	classic
825	bulldogs
826	poopoo
827	accord
828	popcorn
829	turkey
830	jenny
831	amber
832	bunny
833	mouse
834	007007
835	titanic
836	liverpool
837	dreamer
838	everton
839	friends
840	chevelle
841	carrie
842	gabriel
843	psycho
844	nemesis
845	burton
846	pontiac
847	connor
848	eatme
849	lickme
850	roland
851	cumming
852	mitchell
853	ireland
854	lincoln
855	arnold
856	spiderma
857	patriots
858	goblue
859	devils
860	eugene
861	empire
862	asdfg
863	cardinal
864	brown
865	shaggy
866	froggy
867	qwer
868	kawasaki
869	kodiak
870	people
871	phpbb
872	light
873	54321
874	kramer
875	chopper
876	hooker
877	honey
878	whynot
879	lesbian
880	lisa
881	baxter
882	adam
883	snake
884	teen
885	ncc1701d
886	qqqqqq
887	airplane
888	britney
889	avalon
890	sandy
891	sugar
892	sublime
893	stewart
894	wildcat
895	raven
896	scarface
897	elizabet
898	123654
899	trucks
900	wolfpack
901	pervert
902	lawrence
903	raymond
904	redhead
905	american
906	alyssa
907	bambam
908	movie
909	woody
910	shaved
911	snowman
912	tiger1
913	chicks
914	raptor
915	1969
916	stingray
917	shooter
918	france
919	stars
920	madmax
921	kristen
922	sports
923	jerry
924	789456
925	garcia
926	simpsons
927	lights
928	ryan
929	looking
930	chronic
931	alison
932	hahaha
933	packard
934	hendrix
935	perfect
936	service
937	spring
938	srinivas
939	spike
940	katie
941	252525
942	oscar
943	brother
944	bigmac
945	suck
946	single
947	cannon
948	georgia
949	popeye
950	tattoo
951	texas
952	party
953	bullet
954	taurus
955	sailor
956	wolves
957	panthers
958	japan
959	strike
960	flowers
961	pussycat
962	chris1
963	loverboy
964	berlin
965	sticky
966	marina
967	tarheels
968	fisher
969	russia
970	connie
971	wolfgang
972	testtest
973	mature
974	bass
975	catch22
976	juice
977	michael1
978	nigger
979	159753
980	women
981	alpha1
982	trooper
983	hawkeye
984	head
985	freaky
986	dodgers
987	pakistan
988	machine
989	pyramid
990	vegeta
991	katana
992	moose
993	tinker
994	coyote
995	infinity
996	inside
997	pepsi
998	letmein1
999	bang
1000	control
1001	hercules
1002	morris
1003	james1
1004	tickle
1005	outlaw
1006	browns
1007	billybob
1008	pickle
1009	test1
1010	michele
1011	antonio
1012	sucks
1013	pavilion
1014	changeme
1015	caesar
1016	prelude
1017	tanner
1018	adrian
1019	darkside
1020	bowling
1021	wutang
1022	sunset
1023	robbie
1024	alabama
1025	danger
1026	zeppelin
1027	juan
1028	rusty
1029	pppppp
1030	nick
1031	2001
1032	ping
1033	darkstar
1034	madonna
1035	qwe123
1036	bigone
1037	casino
1038	cheryl
1039	charlie1
1040	mmmmmm
1041	integra
1042	wrangler
1043	apache
1044	tweety
1045	qwerty12
1046	bobafett
1047	simone
1048	none
1049	business
1050	sterling
1051	trevor
1052	transam
1053	dustin
1054	harvey
1055	england
1056	2323
1057	seattle
1058	ssssss
1059	rose
1060	harry
1061	openup
1062	pandora
1063	pussys
1064	trucker
1065	wallace
1066	indigo
1067	storm
1068	malibu
1069	weed
1070	review
1071	babydoll
1072	doggy
1073	dilbert
1074	pegasus
1075	joker
1076	catfish
1077	flipper
1078	valerie
1079	herman
1080	fuckit
1081	detroit
1082	kenneth
1083	cheyenne
1084	bruins
1085	stacey
1086	smoke
1087	joey
1088	seven
1089	marino
1090	fetish
1091	xfiles
1092	wonder
1093	stinger
1094	pizza
1095	babe
1096	pretty
1097	stealth
1098	manutd
1099	gracie
1100	gundam
1101	cessna
1102	longhorn
1103	presario
1104	mnbvcxz
1105	wicked
1106	mustang1
1107	victory
1108	21122112
1109	shelly
1110	awesome
1111	athena
1112	q1w2e3r4
1113	help
1114	holiday
1115	knicks
1116	street
1117	redneck
1118	12341234
1119	casey
1120	gizmo
1121	scully
1122	dragon1
1123	devildog
1124	triumph
1125	eddie
1126	bluebird
1127	shotgun
1128	peewee
1129	ronnie
1130	angel1
1131	daisy
1132	special
1133	metallica
1134	madman
1135	country
1136	impala
1137	lennon
1138	roscoe
1139	omega
1140	access14
1141	enterpri
1142	miranda
1143	search
1144	smitty
1145	blizzard
1146	unicorn
1147	tight
1148	rick
1149	ronald
1150	asdf1234
1151	harrison
1152	trigger
1153	truck
1154	danny
1155	home
1156	winnie
1157	beauty
1158	thailand
1159	1234567890
1160	cadillac
1161	castle
1162	tyler
1163	bobcat
1164	buddy1
1165	sunny
1166	stones
1167	asian
1168	freddie
1169	chuck
1170	butt
1171	loveyou
1172	norton
1173	hellfire
1174	hotsex
1175	indiana
1176	short
1177	panzer
1178	lonewolf
1179	trumpet
1180	colors
1181	blaster
1182	12121212
1183	fireball
1184	logan
1185	precious
1186	aaron
1187	elaine
1188	jungle
1189	atlanta
1190	gold
1191	corona
1192	curtis
1193	nikki
1194	polaris
1195	timber
1196	theone
1197	baller
1198	chipper
1199	orlando
1200	island
1201	skyline
1202	dragons
1203	dogs
1204	benson
1205	licker
1206	goldie
1207	engineer
1208	kong
1209	pencil
1210	basketba
1211	open
1212	hornet
1213	world
1214	linda
1215	barbie
1216	chan
1217	farmer
1218	valentin
1219	wetpussy
1220	indians
1221	larry
1222	redman
1223	foobar
1224	travel
1225	morpheus
1226	bernie
1227	target
1228	141414
1229	hotstuff
1230	photos
1231	laura
1232	savage
1233	holly
1234	rocky1
1235	fuck_inside
1236	dollar
1237	turbo
1238	design
1239	newton
1240	hottie
1241	moon
1242	202020
1243	blondes
1244	4128
1245	lestat
1246	avatar
1247	future
1248	goforit
1249	random
1250	abgrtyu
1251	jjjjjj
1252	cancer
1253	q1w2e3
1254	smiley
1255	goldberg
1256	express
1257	virgin
1258	zipper
1259	wrinkle1
1260	stone
1261	andy
1262	babylon
1263	dong
1264	powers
1265	consumer
1266	dudley
1267	monkey1
1268	serenity
1269	samurai
1270	99999999
1271	bigboobs
1272	skeeter
1273	lindsay
1274	joejoe
1275	master1
1276	aaaaa
1277	chocolat
1278	christia
1279	birthday
1280	stephani
1281	tang
1282	1234qwer
1283	alfred
1284	ball
1285	98765432
1286	maria
1287	sexual
1288	maxima
1289	77777777
1290	sampson
1291	buckeye
1292	highland
1293	kristin
1294	seminole
1295	reaper
1296	bassman
1297	nugget
1298	lucifer
1299	airforce
1300	nasty
1301	watson
1302	warlock
1303	2121
1304	philip
1305	always
1306	dodge
1307	chrissy
1308	burger
1309	bird
1310	snatch
1311	missy
1312	pink
1313	gang
1314	maddie
1315	holmes
1316	huskers
1317	piglet
1318	photo
1319	joanne
1320	hamilton
1321	dodger
1322	paladin
1323	christy
1324	chubby
1325	buckeyes
1326	hamlet
1327	abcdefgh
1328	bigfoot
1329	sunday
1330	manson
1331	goldfish
1332	garden
1333	deftones
1334	icecream
1335	blondie
1336	spartan
1337	julie
1338	harold
1339	charger
1340	brandi
1341	stormy
1342	sherry
1343	pleasure
1344	juventus
1345	rodney
1346	galaxy
1347	holland
1348	escort
1349	zxcvb
1350	planet
1351	jerome
1352	wesley
1353	blues
1354	song
1355	peace
1356	david1
1357	ncc1701e
1358	1966
1359	51505150
1360	cavalier
1361	gambit
1362	karen
1363	sidney
1364	ripper
1365	oicu812
1366	jamie
1367	sister
1368	marie
1369	martha
1370	nylons
1371	aardvark
1372	nadine
1373	minnie
1374	whiskey
1375	bing
1376	plastic
1377	anal
1378	babylon5
1379	chang
1380	savannah
1381	loser
1382	racecar
1383	insane
1384	yankees1
1385	mememe
1386	hansolo
1387	chiefs
1388	fredfred
1389	freak
1390	frog
1391	salmon
1392	concrete
1393	yvonne
1394	zxcv
1395	shamrock
1396	atlantis
1397	warren
1398	wordpass
1399	julian
1400	mariah
1401	rommel
1402	1010
1403	harris
1404	predator
1405	sylvia
1406	massive
1407	cats
1408	sammy1
1409	mister
1410	stud
1411	marathon
1412	rubber
1413	ding
1414	trunks
1415	desire
1416	montreal
1417	justme
1418	faster
1419	kathleen
1420	irish
1421	1999
1422	bertha
1423	jessica1
1424	alpine
1425	sammie
1426	diamonds
1427	tristan
1428	00000
1429	swinger
1430	shan
1431	stallion
1432	pitbull
1433	letmein2
1434	roberto
1435	ready
1436	april
1437	palmer
1438	ming
1439	shadow1
1440	audrey
1441	chong
1442	clitoris
1443	wang
1444	shirley
1445	fuckers
1446	jackoff
1447	bluesky
1448	sundance
1449	renegade
1450	hollywoo
1451	151515
1452	bernard
1453	wolfman
1454	soldier
1455	picture
1456	pierre
1457	ling
1458	goddess
1459	manager
1460	nikita
1461	sweety
1462	titans
1463	hang
1464	fang
1465	ficken
1466	niners
1467	bottom
1468	bubble
1469	hello123
1470	ibanez
1471	webster
1472	sweetpea
1473	stocking
1474	323232
1475	tornado
1476	lindsey
1477	content
1478	bruce
1479	buck
1480	aragorn
1481	griffin
1482	chen
1483	campbell
1484	trojan
1485	christop
1486	newman
1487	wayne
1488	tina
1489	rockstar
1490	father
1491	geronimo
1492	pascal
1493	crimson
1494	brooks
1495	hector
1496	penny
1497	anna
1498	google
1499	camera
1500	chandler
1501	fatcat
1502	lovelove
1503	cody
1504	cunts
1505	waters
1506	stimpy
1507	finger
1508	cindy
1509	wheels
1510	viper1
1511	latin
1512	robin
1513	greenday
1514	987654321
1515	creampie
1516	brendan
1517	hiphop
1518	willy
1519	snapper
1520	funtime
1521	duck
1522	trombone
1523	adult
1524	cotton
1525	cookies
1526	kaiser
1527	mulder
1528	westham
1529	latino
1530	jeep
1531	ravens
1532	aurora
1533	drizzt
1534	madness
1535	energy
1536	kinky
1537	314159
1538	sophia
1539	stefan
1540	slick
1541	rocker
1542	55555555
1543	freeman
1544	french
1545	mongoose
1546	speed
1547	dddddd
1548	hong
1549	henry
1550	hungry
1551	yang
1552	catdog
1553	cheng
1554	ghost
1555	gogogo
1556	randy
1557	tottenha
1558	curious
1559	butterfl
1560	mission
1561	january
1562	singer
1563	sherman
1564	shark
1565	techno
1566	lancer
1567	lalala
1568	autumn
1569	chichi
1570	orion
1571	trixie
1572	clifford
1573	delta
1574	bobbob
1575	bomber
1576	holden
1577	kang
1578	kiss
1579	1968
1580	spunky
1581	liquid
1582	mary
1583	beagle
1584	granny
1585	network
1586	bond
1587	kkkkkk
1588	millie
1589	1973
1590	biggie
1591	beetle
1592	teacher
1593	susan
1594	toronto
1595	anakin
1596	genius
1597	dream
1598	cocks
1599	dang
1600	bush
1601	karate
1602	snakes
1603	bangkok
1604	callie
1605	fuckyou2
1606	pacific
1607	daytona
1608	kelsey
1609	infantry
1610	skywalke
1611	foster
1612	felix
1613	sailing
1614	raistlin
1615	vanhalen
1616	huang
1617	herbert
1618	jacob
1619	blackie
1620	tarzan
1621	strider
1622	sherlock
1623	lang
1624	gong
1625	sang
1626	dietcoke
1627	ultimate
1628	tree
1629	shai
1630	sprite
1631	ting
1632	artist
1633	chai
1634	chao
1635	devil
1636	python
1637	ninja
1638	misty
1639	ytrewq
1640	sweetie
1641	superfly
1642	456789
1643	tian
1644	jing
1645	jesus1
1646	freedom1
1647	dian
1648	drpepper
1649	potter
1650	chou
1651	darren
1652	hobbit
1653	violet
1654	yong
1655	shen
1656	phillip
1657	maurice
1658	gloria
1659	nolimit
1660	mylove
1661	biscuit
1662	yahoo
1663	shasta
1664	sex4me
1665	smoker
1666	smile
1667	pebbles
1668	pics
1669	philly
1670	tong
1671	tintin
1672	lesbians
1673	marlin
1674	cactus
1675	frank1
1676	tttttt
1677	chun
1678	danni
1679	emerald
1680	showme
1681	pirates
1682	lian
1683	dogg
1684	colleen
1685	xiao
1686	xian
1687	tazman
1688	tanker
1689	patton
1690	toshiba
1691	richie
1692	alberto
1693	gotcha
1694	graham
1695	dillon
1696	rang
1697	emily
1698	keng
1699	jazz
1700	bigguy
1701	yuan
1702	woman
1703	tomtom
1704	marion
1705	greg
1706	chaos
1707	fossil
1708	flight
1709	racerx
1710	tuan
1711	creamy
1712	boss
1713	bobo
1714	musicman
1715	warcraft
1716	window
1717	blade
1718	shuang
1719	sheila
1720	shun
1721	lick
1722	jian
1723	microsoft
1724	rong
1725	allen
1726	feng
1727	getsome
1728	sally
1729	quality
1730	kennedy
1731	morrison
1732	1977
1733	beng
1734	wwwwww
1735	yoyoyo
1736	zhang
1737	seng
1738	teddy
1739	joanna
1740	andreas
1741	harder
1742	luke
1743	qazxsw
1744	qian
1745	cong
1746	chuan
1747	deng
1748	nang
1749	boeing
1750	keeper
1751	western
1752	isabelle
1753	1963
1754	subaru
1755	sheng
1756	thuglife
1757	teng
1758	jiong
1759	miao
1760	martina
1761	mang
1762	maniac
1763	pussie
1764	tracey
1765	a1b2c3
1766	clayton
1767	zhou
1768	zhuang
1769	xing
1770	stonecol
1771	snow
1772	spyder
1773	liang
1774	jiang
1775	memphis
1776	regina
1777	ceng
1778	magic1
1779	logitech
1780	chuang
1781	dark
1782	million
1783	blow
1784	sesame
1785	shao
1786	poison
1787	titty
1788	terry
1789	kuan
1790	kuai
1791	kyle
1792	mian
1793	guan
1794	hamster
1795	guai
1796	ferret
1797	florence
1798	geng
1799	duan
1800	pang
1801	maiden
1802	quan
1803	velvet
1804	nong
1805	neng
1806	nookie
1807	buttons
1808	bian
1809	bingo
1810	biao
1811	zhong
1812	zeng
1813	xiong
1814	zhun
1815	ying
1816	zong
1817	xuan
1818	zang
1819	0.0.000
1820	suan
1821	shei
1822	shui
1823	sharks
1824	shang
1825	shua
1826	small
1827	peng
1828	pian
1829	piao
1830	liao
1831	meng
1832	miami
1833	reng
1834	guang
1835	cang
1836	change
1837	ruan
1838	diao
1839	luan
1840	lucas
1841	qing
1842	chui
1843	chuo
1844	cuan
1845	nuan
1846	ning
1847	heng
1848	huan
1849	kansas
1850	muscle
1851	monroe
1852	weng
1853	whitney
1854	1passwor
1855	bluemoon
1856	zhui
1857	zhua
1858	xiang
1859	zheng
1860	zhen
1861	zhei
1862	zhao
1863	zhan
1864	yomama
1865	zhai
1866	zhuo
1867	zuan
1868	tarheel
1869	shou
1870	shuo
1871	tiao
1872	lady
1873	leonard
1874	leng
1875	kuang
1876	jiao
1877	13579
1878	basket
1879	qiao
1880	qiong
1881	qiang
1882	chuai
1883	nian
1884	niao
1885	niang
1886	huai
1887	22222222
1888	bianca
1889	zhuan
1890	zhuai
1891	shuan
1892	shuai
1893	stardust
1894	jumper
1895	margaret
1896	archie
1897	66666666
1898	66668888
1899	charlott
1900	forget
1901	qwertz
1902	bones
1903	history
1904	milton
1905	waterloo
1906	2002
1907	stuff
1908	11223344
1909	office
1910	oldman
1911	preston
1912	trains
1913	murray
1914	vertigo
1915	246810
1916	black1
1917	swallow
1918	smiles
1919	standard
1920	alexandr
1921	parrot
1922	luther
1923	user
1924	nicolas
1925	1976
1926	surfing
1927	pioneer
1928	pete
1929	masters
1930	apple1
1931	asdasd
1932	auburn
1933	hannibal
1934	frontier
1935	panama
1936	lucy
1937	buffy
1938	brianna
1939	welcome1
1940	vette
1941	blue22
1942	shemale
1943	111222
1944	baggins
1945	groovy
1946	global
1947	turner
1948	181818
1949	1979
1950	blades
1951	spanking
1952	life
1953	byteme
1954	lobster
1955	collins
1956	dawg
1957	hilton
1958	japanese
1959	1970
1960	1964
1961	2424
1962	polo
1963	markus
1964	coco
1965	deedee
1966	mikey
1967	1972
1968	171717
1969	1701
1970	strip
1971	jersey
1972	green1
1973	capital
1974	sasha
1975	sadie
1976	putter
1977	vader
1978	seven7
1979	lester
1980	marcel
1981	banshee
1982	grendel
1983	gilbert
1984	dicks
1985	dead
1986	hidden
1987	iloveu
1988	1980
1989	sound
1990	ledzep
1991	michel
1992	147258
1993	female
1994	bugger
1995	buffett
1996	bryan
1997	hell
1998	kristina
1999	molson
2000	2020
password_entropy.py · sha256 6de3894cb31bc33b7757e6ddace2dcf6a90486e60f2f2b6f486022167db8eced
#!/usr/bin/env python3
"""Estimate the entropy of a password given in the input: the character-pool bound
(length x log2(pool)) and a pattern-adjusted estimate that charges common passwords,
keyboard runs, sequences, repeats, dates, l33t substitutions and context words at their
real guessing cost; crack-time estimates at stated guess rates; and NIST SP 800-63B advice.

The password and every substring of it are NEVER written to the output: findings carry the
pattern type, its position and its length only.

Input (JSON on stdin):
  password           the password (string, at most 4096 characters)
  context            words specific to the user or the service (name, e-mail, site), optional
  guesses_per_second extra guess rates to estimate, {label: rate}, optional
"""
import json
import math
import pathlib
import sys
import unicodedata

HERE = pathlib.Path(__file__).resolve().parent
KEYBOARD_ROWS = ["`1234567890-=", "qwertyuiop[]\\", "asdfghjkl;'", "zxcvbnm,./", "1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik9ol0p",
                 "qazwsxedcrfvtgbyhnujmikolp", "azertyuiop", "qwertzuiop", "yxcvbnm"]
SEQUENCES = ["abcdefghijklmnopqrstuvwxyz", "0123456789"]
LEET = {"4": "a", "@": "a", "8": "b", "(": "c", "3": "e", "6": "g", "9": "g", "1": "i", "!": "i", "|": "l", "0": "o",
        "5": "s", "$": "s", "7": "t", "+": "t", "2": "z", "%": "x"}
SCENARIOS = [
    ("online_throttled", 100 / 3600, "online attack against a rate-limited login (100 guesses per hour)"),
    ("online_unthrottled", 10, "online attack without rate limiting (10 guesses per second)"),
    ("offline_slow_hash", 1e4, "offline attack on a slow hash such as bcrypt, scrypt or Argon2 (10^4 per second)"),
    ("offline_fast_hash", 1e10, "offline attack on a fast unsalted hash on GPUs (10^10 per second)"),
]


def fail(message):
    print(json.dumps({"error": message}))
    sys.exit(2)


def load_common():
    ranks = {}
    try:
        lines = (HERE / "common_passwords.txt").read_text(encoding="utf-8").splitlines()
    except OSError:
        return ranks, {}
    source = {}
    for line in lines:
        if line.startswith("#"):
            text = line.lstrip("# ").strip()
            if text.startswith("Source:"):
                source["source"] = text[len("Source:"):].strip().rstrip(",")
            elif text.startswith("https://"):
                source["url"] = text
            elif text.startswith("Fetched"):
                source["fetched"] = text.split()[1]
            continue
        rank, _, word = line.partition("\t")
        if word and rank.isdigit():
            ranks.setdefault(word, int(rank))
    return ranks, source


def pool_of(chars):
    classes = {"lowercase": 0, "uppercase": 0, "digits": 0, "symbols": 0, "space": 0, "other_unicode": 0}
    for char in chars:
        if "a" <= char <= "z":
            classes["lowercase"] += 1
        elif "A" <= char <= "Z":
            classes["uppercase"] += 1
        elif "0" <= char <= "9":
            classes["digits"] += 1
        elif char == " ":
            classes["space"] += 1
        elif ord(char) < 128 and char.isprintable():
            classes["symbols"] += 1
        else:
            classes["other_unicode"] += 1
    sizes = {"lowercase": 26, "uppercase": 26, "digits": 10, "symbols": 32, "space": 1, "other_unicode": 100}
    pool = sum(sizes[name] for name, count in classes.items() if count)
    return classes, pool


def unleet_variants(text):
    """The lower-cased text with l33t characters replaced; '1' is tried as both i and l."""
    base = "".join(LEET.get(c, c) for c in text)
    variants = {base}
    if "1" in text:
        variants.add("".join("l" if c == "1" else LEET.get(c, c) for c in text))
    return variants


def matches(chars, common, context):
    """Candidate patterns: (start, end, kind, bits)."""
    n = len(chars)
    lower = "".join(chars).lower()
    found = []
    # Common passwords and context words, plain or with l33t substitutions, case changes cost one bit.
    for i in range(n):
        for j in range(i + 4, min(n, i + 32) + 1):
            piece = lower[i:j]
            original = "".join(chars[i:j])
            case_bit = 1 if original != piece else 0
            for word, leet in [(piece, False)] + [(v, True) for v in unleet_variants(piece) if v != piece]:
                if word in common:
                    found.append((i, j, "common_password" if not leet else "common_password_l33t",
                                  math.log2(common[word]) + case_bit + (1 if leet else 0) + 1))
                if word in context:
                    found.append((i, j, "context_word" if not leet else "context_word_l33t",
                                  math.log2(len(context) + 1) + case_bit + (1 if leet else 0) + 1))
    # Keyboard runs and alphabetic or numeric sequences, forwards or backwards, 4 or more.
    for kind, lines, starts in (("keyboard_run", KEYBOARD_ROWS, 47), ("sequence", SEQUENCES, 36)):
        for line in lines:
            for direction in (line, line[::-1]):
                i = 0
                while i < n:
                    j = i
                    while j < n and j - i < len(direction):
                        if j == i:
                            if lower[j] not in direction:
                                break
                        else:
                            position = direction.find(lower[j - 1])
                            if position < 0 or position + 1 >= len(direction) or direction[position + 1] != lower[j]:
                                break
                        j += 1
                    if j - i >= 4:
                        found.append((i, j, kind, math.log2(starts * 2) + math.log2(j - i)))
                        i = j
                    else:
                        i += 1
    # Repeats: one character three or more times, or a block repeated.
    i = 0
    while i < n:
        j = i
        while j < n and chars[j] == chars[i]:
            j += 1
        if j - i >= 3:
            found.append((i, j, "repeated_character", math.log2(pool_of(chars[i])[1] or 1) + math.log2(j - i)))
        i = max(j, i + 1)
    for size in range(2, n // 2 + 1):
        for i in range(0, n - 2 * size + 1):
            block = chars[i:i + size]
            j = i + size
            while j + size <= n and chars[j:j + size] == block:
                j += size
            if j - i >= 2 * size and len(set(block)) > 1:
                found.append((i, j, "repeated_block", size * math.log2(pool_of(block)[1] or 1) + math.log2((j - i) // size)))
    # Dates and years: 19xx or 20xx, with or without day and month, with or without separators.
    digits = "".join(chars)
    for i in range(n):
        for length in (10, 8, 6, 4):
            piece = digits[i:i + length]
            if len(piece) != length:
                continue
            kind = date_kind(piece)
            if kind:
                found.append((i, i + length, kind, math.log2(200) if kind == "year" else math.log2(366 * (100 if length == 6 else 200)) + (2 if length == 10 else 0)))
    return found


def date_kind(piece):
    if len(piece) == 4 and piece.isdigit():
        return "year" if 1900 <= int(piece) <= 2099 else None
    stripped = piece
    if len(piece) == 10 and piece[2] == piece[5] and piece[2] in "-/._" or len(piece) == 10 and piece[4] == piece[7] and piece[4] in "-/._":
        stripped = piece.replace(piece[2] if piece[2] in "-/._" else piece[4], "")
    if not stripped.isdigit():
        return None
    if len(stripped) == 8:
        y1, m1, d1 = int(stripped[:4]), int(stripped[4:6]), int(stripped[6:])
        y2, m2, d2 = int(stripped[4:]), int(stripped[2:4]), int(stripped[:2])
        y3, m3, d3 = int(stripped[4:]), int(stripped[:2]), int(stripped[2:4])
        if (1900 <= y1 <= 2099 and 1 <= m1 <= 12 and 1 <= d1 <= 31) or any(1900 <= y <= 2099 and 1 <= m <= 12 and 1 <= d <= 31 for y, m, d in ((y2, m2, d2), (y3, m3, d3))):
            return "date"
    if len(stripped) == 6 and len(piece) == 6:
        a, b, c = int(piece[:2]), int(piece[2:4]), int(piece[4:])
        if (1 <= b <= 12 and 1 <= a <= 31) or (1 <= a <= 12 and 1 <= b <= 31) or (1 <= b <= 12 and 1 <= c <= 31):
            return "date_short"
    return None


def choose(found, per_char):
    """Non-overlapping patterns that save the most bits, greedily."""
    scored = sorted(((max(0.0, (end - start) * per_char - bits), start, end, kind, bits) for start, end, kind, bits in found),
                    key=lambda item: (-item[0], item[1]))
    taken, used = [], set()
    for saving, start, end, kind, bits in scored:
        if saving <= 0 or any(k in used for k in range(start, end)):
            continue
        used.update(range(start, end))
        taken.append({"type": kind, "start": start, "length": end - start, "bits": round(bits, 2), "saving_bits": round(saving, 2)})
    return sorted(taken, key=lambda item: item["start"])


def duration(seconds):
    if seconds < 1:
        return "less than a second"
    units = [("century", 100 * 365.25 * 86400), ("year", 365.25 * 86400), ("month", 30.44 * 86400), ("day", 86400),
             ("hour", 3600), ("minute", 60), ("second", 1)]
    for name, size in units:
        if seconds >= size:
            value = seconds / size
            if name == "century" and value >= 1e6:
                return f"{value:.2e} centuries"
            whole = int(value)
            plural = "centuries" if name == "century" else name + "s"
            return f"{whole} {name if whole == 1 else plural}"
    return "less than a second"


def rating(bits):
    for limit, label in ((28, "very weak"), (36, "weak"), (60, "fair"), (80, "strong")):
        if bits < limit:
            return label
    return "very strong"


def main():
    try:
        request = json.load(sys.stdin)
    except ValueError:
        fail("stdin is not a JSON object")
    if not isinstance(request, dict):
        fail("stdin must be a JSON object")
    unknown = sorted(set(request) - {"password", "context", "guesses_per_second"})
    if unknown:
        fail(f"unknown field: {unknown[0]}")
    password = request.get("password")
    if not isinstance(password, str):
        fail("password is required (a string)")
    if not password:
        fail("password is empty")
    if len(password) > 4096:
        fail("password is longer than 4096 characters")
    context = request.get("context", [])
    if not isinstance(context, list) or not all(isinstance(word, str) for word in context):
        fail("context must be a list of strings")
    context_words = set()
    for word in context:
        for part in [word] + word.replace("@", " ").replace(".", " ").replace("_", " ").replace("-", " ").split():
            if len(part.strip()) >= 4:
                context_words.add(part.strip().lower())
    rates = list(SCENARIOS)
    extra = request.get("guesses_per_second", {})
    if not isinstance(extra, dict):
        fail("guesses_per_second must be an object {label: guesses per second}")
    for label, rate in extra.items():
        if isinstance(rate, bool) or not isinstance(rate, (int, float)) or not rate > 0 or len(label) > 64:
            fail("each guesses_per_second value must be a positive number and each label at most 64 characters")
        rates.append((label, float(rate), "given in the input"))

    # SP 800-63B counts each Unicode code point as one character, after normalisation.
    normalized = unicodedata.normalize("NFKC", password)
    chars = list(normalized)
    common, source = load_common()
    classes, pool = pool_of(chars)
    per_char = math.log2(pool)
    pool_bits = len(chars) * per_char
    scanned = chars[:256]  # patterns are searched in the first 256 characters
    patterns = choose(matches(scanned, common, context_words), per_char)
    adjusted = max(pool_bits - sum(p["saving_bits"] for p in patterns), 0.0)
    whole_common = normalized.lower() in common
    if whole_common:
        adjusted = min(adjusted, math.log2(common[normalized.lower()]) + 1)
    estimate = adjusted

    advice = []
    if len(chars) < 8:
        advice.append("Too short: SP 800-63B requires at least 8 characters, and 15 when the password is the only authentication factor (rev. 4).")
    elif len(chars) < 15:
        advice.append("SP 800-63B rev. 4 asks for at least 15 characters when the password is the only factor; 8 is the minimum with a second factor.")
    if whole_common or any(p["type"].startswith("common_password") for p in patterns):
        advice.append("Contains a common or previously breached password: SP 800-63B requires verifiers to reject passwords found in such blocklists.")
    if any(p["type"] in ("repeated_character", "repeated_block", "sequence", "keyboard_run") for p in patterns):
        advice.append("Contains repetitive or sequential characters (SP 800-63B lists these among the values to reject).")
    if any(p["type"].startswith("context_word") for p in patterns):
        advice.append("Contains a context-specific word (user name, service name): SP 800-63B lists these among the values to reject.")
    if any(p["type"] in ("date", "date_short", "year") for p in patterns):
        advice.append("Contains a date or year: dates are among the first things guessed.")
    if any(p["type"].endswith("_l33t") for p in patterns):
        advice.append("Character substitutions (a->@, o->0) add almost nothing: crackers try them by rule.")
    if estimate < 60:
        advice.append("Prefer a long passphrase of several random words, or a random password from a password manager.")
    advice.append("SP 800-63B: no composition rules, no periodic changes without evidence of compromise, allow at least 64 characters and paste from password managers.")

    crack = {}
    for label, rate, description in rates:
        try:
            seconds = (2 ** estimate) / 2 / rate
        except OverflowError:
            seconds = float("inf")
        crack[label] = {"guesses_per_second": float(f"{rate:.6g}"), "description": description,
                        "seconds": float(f"{seconds:.4g}") if math.isfinite(seconds) else None,
                        "display": duration(seconds) if math.isfinite(seconds) else "longer than the age of the universe"}

    print(json.dumps({
        "length": len(chars),
        "normalized": normalized != password,
        "character_classes": {name: count > 0 for name, count in classes.items()},
        "pool_size": pool,
        "bits_per_character": round(per_char, 4),
        "pool_entropy_bits": round(pool_bits, 2),
        "estimated_entropy_bits": round(estimate, 2),
        "rating": rating(estimate),
        "whole_password_is_common": whole_common,
        "patterns": patterns,
        "crack_time": crack,
        "advice": advice,
        "method": "pool bound = length x log2(pool); estimate replaces each detected pattern by its guessing cost (zxcvbn-style); crack time = 2^(bits-1) / rate (average case)",
        "blocklist": dict({"entries": len(common)}, **(source or {})),
        "note": "The password is not echoed: patterns report only their type, position and length.",
    }))


if __name__ == "__main__":
    main()

Where it is served

The registry serves only AXLR clients, so a browser gets 403; fetch with a User-Agent that starts with axlr:

curl -A axlr-docs/1.0 -O https://registry.underpassai.com/tools/password_entropy/1.0.0/manifest.json
curl -A axlr-docs/1.0 -O https://registry.underpassai.com/tools/password_entropy/1.0.0/common_passwords.txt
curl -A axlr-docs/1.0 -O https://registry.underpassai.com/tools/password_entropy/1.0.0/password_entropy.py