パスワード管理スクリプト (改良版)
1. 初めに
最近、インターネットを使って銀行、クレジットカード会社、電話会社、Amazon や楽天などのネット通販、及び SNS サイト
にアクセスする機会がますます増えています。これらのサイトにアクセスするときは、サイトごとにパスワードを
作成し、異なるサイト間でパスワードを決して使いまわさないことが鉄則です。
パスワードを使いまわすと、パスワード管理に不備のあるサイトで
漏洩したパスワードが不正使用され、銀行などの重要なサイトに不正にアクセスされる恐れがあります。
紫藤は、自作のパスワード管理スクリプトでパスワードを管理していましたが、
このスクリプトではパスワードに使う文字の種類を指定できないという難点がありました。
そこで、今回は、パスワードに使う文字の種類を指定できるように改良しました。
2. 特徴
- パスワードが生成された時刻と秘密のキーフレーズに基づいてパスワードを自動生成します。
- パスワードデータ (pw.txt)には、生成時刻が記録され、パスワードそのものは記録されないのでデータが漏洩しても比較的安全です。
(ただし、アカウント名とサイト名はわかってしまうので、
Dropbox などの オンラインストレージに上げておくときは暗号化することをお勧めします。)
- ユーザーとサイトが特定されると、パスワードは自動でクリップボードにコピーされます。
- パスワードに使う文字の種類 (数字だけ、数字とアルファベット、ASCII 文字) を指定することができます。
- パスワードの長さを指定することができます。(指定された長さ以下のパスワードが生成されます。)
- パスワードは、自動生成されたもののなかから選んで使います。パスワードを自分で決めることはできません。
3. インストール
3.1. 動作環境
Win 32, Linux, 及び Mac で動作を確認しています。
(Mac でのテストは上間さんにお願いしました。ありがとうございます。)
そのほかの OS の場合は、クリップボードにパスワードがコピーされませんが、
他の部分は動作すると思われます。
3.2. 必要なモジュール
- Python3.x: www.python.orgからダウンロードします。
- pywin32: (Windows のみ) sorceforgeからダウンロードします。
- 標準入力をクリップボードにコピーするコマンド: Linux では xclip が、 Mac では pbcopy がインストールされている必要があります。
- pw.py をダウンロードします。
4. 使い方
4.1. 起動とパスワードの表示
Python 3.x を使って、コンソールから立ち上げます。
その後、パスフレーズを2回入力します。パスフレーズが間違っていても動作はしますが、
正しいパスワードを計算してくれません。
001: >python pw.py
002: Enter keyword:
003: Again:
004: >
プロンプト (>) が表示されたら、ユーザ名とサイト名を ; で区切って入力します。
ユーザ名やサイト名のどちらか一方を省略することができます。また、ワイルドカードとして
* が使えます。* は任意の文字列にマッチします。
複数の候補があるときは、候補の一覧が表示されるので、番号を入力して選択します。
アカウントが特定されると、パスワードが表示されます。
001: > foo;
002: 0: foo;gmail
003: 1: foo;yahoo
004: select:0
005: foo;gmail: ,Ary*tE815
001: > ;y*
002: foo;yahoo: Be=-/+/aL344
q と入力すると終了します。
以下のコマンドが使えます。
- 'q', 'quit'
- 終了します。
- 'u', 'update'
- パスワードを更新します。
- 'i', 'insert'
- 新しいアカウント、パスワードを登録します。
- 'd', 'delete'
- 選択したアカウントを削除します。
- 's', 'show'
- パスワードの詳細を表示します。
- 'l', 'length'
- パスワードの長さや使用する文字を変更します。
- 'n', 'note'
- パスワードのノートを変更します。
- 'h', 'help'
- ヘルプを表示します。
4.2. パスワードの更新
アカウントとパスワードが表示されている状態で u と入力するとパスワードが更新されます。
気に入ったパスワードになるまで u を押し続けます。
001: > f%;g%
002: foo;gmail: TheSThe<w923
003: > u
004: foo;gmail: aN>m*aine=b399
005: > u
006: foo;gmail: .*@AnOn.p016
007: > u
008: foo;gmail: fElAn?-oF178
009: >
4.3. パスワードの新規登録
i と入力後、; で区切って、ユーザ名とサイト名を入力します。
また、オプションで長さ、文字種類、ノートを指定することができます。
パスワードは自動で生成されます。好みに応じて、u を押下してパスワードを変更します。
長さと文字種類の指定方法は以下のとおりです。
- 英数字(DD): 文字種類が ASCII で長さ DD 以下のパスワードが生成されます。
例) 15 → ASCII 15 文字以下
- a に続いて英数字 DD: 文字種類が ALNUM で長さ DD のパスワードが生成されます。
例) a18 → ALNUM 18 文字以下
- d に続いて英数字 DD: 文字種類が DIGIT で長さ DD のパスワードが生成されます。
例) d7 → DIGIT 7 文字以下
001: > i
002: give user;site[;char-length[;note]]: foo;facebook;a20
003: foo;facebook: 3YS4JL5BTNJrmIWE
>
4.4. パスワードの削除
アカウントとパスワードが表示されている状態で d と入力すると、そのパスワードが削除されます。
001: foo2;facebook: sHe,-Sou017
002: > d
003: Record of foo2@facebook has been deleted.
004: >
4.5. 詳細表示
アカウントが特定されている状態で、s と入力すると、パスワードの詳細が表示されます。
001: > foo;fa*
002: foo;facebook: 3YS4JL5BTNJrmIWE
003: foo;facebook> s
004:
005: User: foo
006: Site: facebook
007: Time: 1339377849
008: Length: 20
009: Char: ALNUM
010: Note:
011:
012: foo;facebook: 3YS4JL5BTNJrmIWE
013: foo;facebook>
4.6. 文字種類、長さの変更
アカウントが特定されている状態で l と入力すると、文字種類、長さの上限を変更することができます。
文字種類と長さの入力方法はここを参照してください。
001: foo;facebook> l
002: Current Value: a20
003: new value (just RET to unchange): d8
004: foo;facebook: 087145
005: foo;facebook>
4.7. ノートの変更
アカウントが特定されている状態で n と入力すると、ノートを変更することができます。
001: foo;facebook> n
002: Current Value:
003: new value (just RET to unchange): foo's facebook account
004: foo;facebook: 087145
5. 簡単な説明
パスフレーズは
functools.reduce(lambda a,b:(a<<7)+ord(b), s1, 0)
で、整数 (nsec)に変換されます。
変換されたパスフレーズとパスワードの生成時刻 (self.time) から次の関数でパスワード文字列を生成します。
パスワードは使用する文字の集合からランダムに選んで作るので、タイプしづらいものになりますが、
クリップボード経由で入力するので、さほど不便ではありません。
001: def __call__(self, nsec):
002: '''calculate password from the created time of self (self.time) and the secret number (nsec)'''
003: random.seed(nsec+self.time)
004: size = round(self.length * math.cos(random.random()))
005: charset = PW.CS_ALNUM if self.char==CHARSET.ALNUM else \
006: PW.CS_DIGIT if self.char==CHARSET.DIGIT else \
007: PW.CS_ASCII
008: return ''.join(random.choice(charset) for i in range(size))
6. 終わりに
コマンドラインベースの地味なスクリプトですが、紫藤はとても重宝しています。
是非試してみてください。