こんにちわlisです!
パスワードを決めるの、めんどくさくないですか?
しかもそれがインスタントなパスワードだったら、決めるの面倒ですよね。
ぼくはパスワード生成サイトのお世話になっていたのですが、頻繁に使用するとなるとアクセスするのが面倒になってしまいました。
ということでPython先生の恩恵を賜りたいと思います。
今回はパスワードを生成して、クリップボードにコピーしてくれるスクリプトを作成しました!
- パスワード生成
- 必要な文字を文字列にまとめる
- パスワードに使用する文字列を作る
- 機密を扱うために安全な乱数を生成する
- クリップボードへコピー
- パスワードを生成してクリップボードにコピーする
- 参考
- あとがき
パスワード生成
パスワード生成についてはこちらのページを参考にしました。
やっていることとしては
- 使いたい文字を集めた文字列を作る
- 文字数分をランダムに取得
- ランダムで出した文字を結合してパスワードを作る
ということをしていました。
必要な文字を文字列にまとめる
stringの定数には、対象の文字をまとめた文字列が用意されています。
英字(小文字+大文字) >>> string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 英字(小文字) >>> string.ascii_lowercase 'abcdefghijklmnopqrstuvwxyz' 英字(大文字) >>> string.ascii_uppercase 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 数字 >>> string.digits '0123456789' Hex(16進数) >>> string.hexdigits '0123456789abcdefABCDEF' Oct(8進数) >>> string.octdigits '01234567' 記号 >>> string.punctuation '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' digits, ascii_letters, punctuation, whitespaceの組み合わせ >>> string.printable '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c' スペース、タブ、改行、復帰、改頁、垂直タブ >>> string.whitespace ' \t\n\r\x0b\x0c'
なんだか便利そうですね。
他のことでも応用できそう……
参考ソースで使っていたし、今後も使えそうなので紹介してみました。
パスワードに使用する文字列を作る
お世話になっているパスワード生成できるサイトで「似通った英数字は省く」というメニューがありました。
これは
- I : 英字(大文字)のアイ
- l : 英字(小文字)のエル
- 1 : 数字のいち
- O : 英字(大文字)のオー
- o : 英字(小文字)のオー
- 0 : 数字のゼロ
を除外して、読みづらいパスワードを作らないようにするオプションです。
基本コピペで使用するつもりですが、この仕組を踏襲しようと思います。
ですので、パスワードに使用する文字列は
chars = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789" + string.punctuation
とします。
機密を扱うために安全な乱数を生成する
secrets.choice()で、「機密を扱うために安全な乱数を生成する」ことができるようです。
試してみます。
>>> import secrets >>> chars = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789" + string.punctuation >>> print(''.join(secrets.choice(chars) for x in range(50))) ea7|uF=zCt]HH3y7G]a|?\)'$Xr7N2XMWqbQjuLfN&CqW;,6TY >>> print(''.join(secrets.choice(chars) for x in range(50))) vCiQnw:L!^NF+zcu7ger/vxH?]z<*,|*_=HnvcM9,6VcW")7mn >>> print(''.join(secrets.choice(chars) for x in range(50))) DAD8=v>#HV|y3MB-:Z8H7xBg[K>}Q&A?kH8?UM94KHJ`fw(Htd >>> print(''.join(secrets.choice(chars) for x in range(50))) sjgrXj\2""n\a^vnSGh6,F*Tt^vB6*D/v7ii%MD|WsC7wq5nAU >>> print(''.join(secrets.choice(chars) for x in range(50))) j!3T<|z?e-*{-8=K2Ak}p5hjeJ6DR`<)e}zt\5&3R+H@-M*~D$ >>> print(''.join(secrets.choice(chars) for x in range(50))) vB[;T>`v*hZ%WB_,@5xb.#;V+ur{u-Fb|(a|P!'$-9iD*E3S2= >>> print(''.join(secrets.choice(chars) for x in range(50))) UE`:PAXqBnGcAjC:"Fxw;GuR8x'HU^ukxAYqYe7,bb~K(d?.e5
全然文字が被りません。すごい。
以前バッチでこのようなものを試した時に、めっちゃ文字が被ってガッカリしたので驚きの結果です。
さすが機密を扱う安全な乱数。
クリップボードへコピー
pyperclipを使うことで、簡単にクリップボードの操作が行うことができました。
pyperclip.copy('クリップボードにコピーする文字')
とするだけで、クリップボードにコピーされます。
コレを実行してから、貼り付けで「クリップボードにコピーする文字」が貼り付けられるはずです。
パスワードを生成してクリップボードにコピーする
ということでパスワードを勝手に生成してくれるスクリプトを作ります。
今回は毎回12文字のパスワードを作成する前提で作ります。
文字数をどうこうしたい場合は、その辺を改造してください。
import pyperclip import string import secrets chars = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789" + string.punctuation pw = ''.join(secrets.choice(chars) for x in range(12)) pyperclip.copy(pw)
これでパスワードを作って勝手にクリップボードにコピーしてくれます。
実行→貼り付けで、簡単に作成したパスワードを使うことができます。
あとはコレをランチャーなりショートカットなりで簡単に実行できるようにすれば大勝利です。
参考
コチラを参考にしました。ありがとうございました!
あとがき
Python3でパスワード生成→クリップボードにコピーするスクリプトでした!
今回は仕事で突然必要になり、作成しました。
どうでもいいパスワードを作るのにかなり役に立っています。
「パスワード作るの……めんどいな……」
と思ったら、簡単にできるので是非どうぞ!