HOME 備忘録 書き込む

パスワードそのものを保存しないで、パスワードを管理する方法


Aug 16, 2010

パスワードをアカウントとパスワード生成時刻及び秘密鍵から生成する関数を定義すると パスワードそのものを保存しなくても、秘密鍵だけ覚えておけば複数のアカウントのパスワードを 容易に管理できるようになります。

この方法を使えば、パスワード自体はどこにも保持されていないので、パスワードの漏洩の危険性を 大幅に減らすことができます。

password = f (user, site, create_time, secret_key)

ここで、
user: ユーザ名
site: サイト名
create_time: パスワードを作成した時刻
secret_key: 秘密鍵
時刻を引数に加えておけば、同じアカウントに対して、別のパスワードを割り振ることができるので、 パスワードの変更が可能です。(時刻を引数に与えておかないと、ユーザ名、サイト名からパスワードが一意に決まるので、 パスワードを変更することができない。)

パスワード生成関数 f() は、擬似乱数を使って簡単に定義することができます。
例えば、

  1. user, site, create_time, secret_key を使って擬似乱数を初期化する。
  2. 初期化された擬似乱数を用いて、"ランダムな" 文字列を生成する。
ことによって実現できます。

一例として、拙作 パスワード管理スクリプト にある make_pw.py では、 ランダムな文字列生成は直後に来る文字の頻度データを元に作成します。 例えば、'j' の直後に 'a':7, 'u':102, 'c':1, 'e':52, 'o':17 の頻度 で続く場合、7/(7+102+1+52+17) の確率で 'a' が来るようにします。
そのほか、

  1. スペースをランダムに特殊文字に変えたり、
  2. アルファベットなら 1/3 の確率で大文字にしたりして
パスワードの強度を増します。

このようにして、パスワードをアカウント、生成時刻、秘密鍵の関数として定義しておくと、

  1. パスワード漏洩の危険性を大幅に減少させられる。
  2. 複数のアカウントのパスワードを容易に管理することができる。
  3. アカウントごとにパスワードを作る手間が省ける。
といった利点があります。 紫藤は、自作の パスワード管理スクリプト を使って 増え続けるパスワードを (本人は満足できるレベルで) 効率的に管理しています。
本人はこの方法が気に入っています。気が向いたら試してみてください。