I have this macro saved in ipython. Note that I use a subset of symbols that's easy to type on most(?) keyboard layouts withoutany gymnastics:
%load pwm
import random as r
import string as s
def pw(n=12):
return "".join([r.choice(
s.ascii_letters \
+ s.digits \
+ "|!@#$%&/()=?+\-_.,;:")
for x in range(n)])
Note: random wasn't patched to use a secure generator in python3 (yet) - from a quick look, it appears secrets.choice() does what I thought random.choice() already did (python 3.6, not 3.5 and earlier)
But looks like "secrets"[1] has the strong random.choice provider among others.
Probably the (minimal, dirty) change needed (for python 3.6 and later) is:
import secrets as r
But I can't test that right now. Thanks for calling me out on this, and having me do a quick search to check my assumptions.
I do agree that for this particular case, the pseudo-random generator seeded by system time might be enough (or at least better than "random" key presses) - but I don't like spreading bad patterns. And for any code generating many passwords, with the opportunity for an attacker to get a sample - this is likely very bad.
That matters very little if you are manually generating an occasional password here and there for personal and an attacker have no reason to know your specific method of generating the password.
Also, I feel very funny using generated password from a website. If I need a new password, I can just generate one in Python or something.