こうかの雑記

こうかの雑記

昔の懐かしいこと、ubuntuのこと、その他いろいろ

パスワード管理ソフトを自作してみた

 パスワード管理ソフトの利用者ってどれくらいおられるのかしらね? そういうわたしはlinuxで使える無料のパスワード管理ソフトを使っています。

 パスワード管理ソフトを使うと、必要なサイトでのID、パスワードの入力が確実にできるようになりますし、パスワードも強度の高いものとすることができます。またパスワードの使いまわしもせずに済みます。パスワード管理ソフトはパスワードなどを暗号化して保管しているので、仮に漏洩しても大丈夫です。特に最近の最近のランサムウェアの存在は、漏洩しても大丈夫な様にしておく必要を感じさせます。

 なのでパスワード管理ソフトの利用をお薦めします。検索すれば有料、無料で多数見つけられると思いますので検討いただければと思います。

 当初は、自作したパスワード管理ソフトを紹介できればなと思っていました。しかし重要な暗号鍵を隠す処理が含まれているので、スクリプトをそのままブログに貼り付けるのは問題だと思いました。

 たぶん、pythonスクリプトを読まれない様にする方法があるのかも知れませんが、残念ながら私は知りません。なので自作できるということだけの紹介に終わらせて頂きます。

 仕方ないので、わたし同様に自作しようという人の参考情報を挙げておきます。python3でスクリプトを書くことに慣れている人なら自作できると思います。危険を認識した上で注意深く個人で使う分には問題は少ないかと思います。

利用したpython3のモジュール類

モジュール類  
tkinter 非標準 GUIubuntuでは別途インストールが必要
os 標準 インタフェース
base64 標準 バイナリ(バイト型)と可読文字列(バイト型)の変換
json 標準 オブジェクトと文字列の変換
webbrowser 標準 ウェブブラウザコントローラー
Crypto.Cipher 非標準 PyCryptodome 暗号関係
Crypto.Random 非標準 PyCryptodome 暗号関係
string 標準 文字列操作
secrets 標準 機密を扱うために安全な乱数

 わたしの場合はubuntuですが、WindowsMacOSも上記モジュール類で使えると思います。

仕様

 簡単に今回のパスワード管理ソフトの仕様を列挙します。

  • 管理ソフトのログイン画面でパスワードを入力。覚える必要があるのは、このパスワードのみ。
  • ログインすると暗号化されて保存されている情報をロードしてサイト一覧を表示する。
  • 情報を更新(追加、修正、削除)をした場合、終了時に自動的に暗号化して保存される。
  • サイト一覧でサイトを選択すると、選択されたサイトの情報(サイト名、サイトのurl、ユーザー名、備考)を表示。
    備考には質問と答えなどパスワード以外の情報を記載できるようにしている
    パスワードは非表示だけど、表示させることも可能
  • サイトの追加、編集の際にパスワードを生成できる。もちろん任意のパスワードを設定できる。
    生成できるパスワードはランダムで8桁、10桁、12桁の長さで記号有り無しを選べる。
  • サイトを選択した状態でボタン一つでブラウザでサイトを開ける。
  • サイトを選択した状態でボタン一つでクリップボードにユーザーIDまたはパスワードをコピーできる。
    サイトのログイン画面でCtrl+Vで貼り付けてログイン動作する。

今回作った画面の例

f:id:koukaforest:20201128124633p:plain
ログイン画面

f:id:koukaforest:20201128124839p:plain
メイン画面、パスワード作成画面、新規画面・編集画面

その他感想

 暗号部分は先の「pythonで共通鍵暗号を試してみた」の記事で実験済みなので簡単にできました。

 何が一番苦労したかと言えば、tkinterを本格的に使ったことがなかったので色々と調べるのに時間が掛かったことです。 画面を閉じる×ボタンを無効にする方法、リストボックスの使い方、クリップボードへのコピー方法など。

 各画面毎にクラスを定義しています。新規画面のクラスは編集画面のクラスを継承して作りました。継承は初めて使いました。

 鍵の保存方法についてはいくつか試行錯誤しました。ここは自分で考えて下さい。最も秘密にしたい部分ですから。それとスクリプト名も全然パスワードとは関係ない名前にして、見つかりにくくしています。

 最初は暗号への興味から始まりましたが、最後はtkinterの使い方練習みたいになりました。tkinterに慣れておられる方なら比較的簡単に作れると思います。tkinterが初めてという場合はこの機会に学ばれてはいかがでしょう。

 PCやAndroid端末などの環境で使える言語で作ることができれば良かったのかなと思います。そうなるとわたしの場合は言語の勉強から必要になりますが。

参考

pythonで共通鍵暗号を試してみた