HOME Python download 書き込む

パスワード管理スクリプト (改良版)


1. 初めに

最近、インターネットを使って銀行、クレジットカード会社、電話会社、Amazon や楽天などのネット通販、及び SNS サイト にアクセスする機会がますます増えています。これらのサイトにアクセスするときは、サイトごとにパスワードを 作成し、異なるサイト間でパスワードを決して使いまわさないことが鉄則です。 パスワードを使いまわすと、パスワード管理に不備のあるサイトで 漏洩したパスワードが不正使用され、銀行などの重要なサイトに不正にアクセスされる恐れがあります。

紫藤は、自作のパスワード管理スクリプトでパスワードを管理していましたが、 このスクリプトではパスワードに使う文字の種類を指定できないという難点がありました。 そこで、今回は、パスワードに使う文字の種類を指定できるように改良しました。

2. 特徴

3. インストール

3.1. 動作環境

Win 32, Linux, 及び Mac で動作を確認しています。 (Mac でのテストは上間さんにお願いしました。ありがとうございます。)
そのほかの OS の場合は、クリップボードにパスワードがコピーされませんが、 他の部分は動作すると思われます。

3.2. 必要なモジュール

  1. Python3.x: www.python.orgからダウンロードします。
  2. pywin32: (Windows のみ) sorceforgeからダウンロードします。
  3. 標準入力をクリップボードにコピーするコマンド: Linux では xclip が、 Mac では pbcopy がインストールされている必要があります。
  4. 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   2 つの候補が表示される
003:   1: foo;yahoo
004:   select:0      1つを選択
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 を押下してパスワードを変更します。
長さと文字種類の指定方法は以下のとおりです。
  1. 英数字(DD): 文字種類が ASCII で長さ DD 以下のパスワードが生成されます。
    例) 15 → ASCII 15 文字以下
  2. a に続いて英数字 DD: 文字種類が ALNUM で長さ DD のパスワードが生成されます。
    例) a18 → ALNUM 18 文字以下
  3. 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 数字8文字
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. 終わりに

コマンドラインベースの地味なスクリプトですが、紫藤はとても重宝しています。
是非試してみてください。