ログイン情報の保存について
anon5r opened this issue · comments
ログインアカウントを保存する方法、および場所について考慮する
ログイン情報は アカウント名 と パスワード とする。
初期段階ではワンタイムパスワードの有無についてはいったん考慮せず、別途実装する。
保存方法/場所について
アプリケーション側から読み書きできるようにする必要がある。
保存時には最低限暗号化するなど、万が一の情報漏洩時にわかりにくい状態とする。
実装方法として以下の検討を行った。
- ローカルデータベースなどでバイナリで持つ
- 暗号化されたパスワードが記載された構造化されたテキスト(XMLまたはJSONなど)に持つ
- レジストリ内に保存する
- OSの持つ認証情報管理に任せる
暗号化されたパスワードが記載された構造化されたテキスト(XMLまたはJSONなど)に持つ
ファイル管理でシンプルに扱える。
基本的にはプレインテキストとなる為、他のアプリケーションからも参照可能な状態となる。
アプリケーション側で一定以上のセキュリティを担保した実装を行う必要がある。
配置場所としてはアプリケーションバイナリと同じディレクトリ内に作成することになると想定。
ローカルデータベースなどでバイナリで持つ
実装としては SQLite などでの実装イメージ。
データとして扱いやすく、パッと見て外部から参照しづらい状態ではあるが、ファイル管理になることと、ユーザーからの取り扱いがしづらい。
マネージドとなるのでセキュリティをしっかり実装する必要がある。
保存場所はユーザー任意の場所に保存できても良いが、基本的にアプリケーションバイナリと同一階層となると想定。
レジストリ内に保存する
レジストリ内にアプリケーションの設定領域を作成し、そこに書き込む。
まずレジストリ内をあまり汚染したくない。
またレジストリ内であっても、外部アプリケーションなどから参照可能になるため一定のセキュリティ要件をアプリケーション側に求められる。
レジストリは通常アプリケーションやOSの挙動設定を書き込む場所であり、認証情報を書き込む場所ではないので避ける。
OSの持つ認証情報管理に任せる
Windows OSが備えている 資格情報マネージャ (Credential Manager) を利用する。
macOS/iOS でいうところの キーチェーン (KeyChain) の利用となる。
アプリからはアンマネージドで、OS内で持つ認証管理機能を利用する。
他のアプリケーションでも利用されており、マシン内、ログインしているアカウント内で管理され、一定のセキュリティを担保可能だと考える。
アプリからの実装としては OSに任せることで一定のセキュリティを担保し、アプリを経由せずユーザーによるの管理、監査もしやすくするものとする。
結論として、今回はOSの管理する 資格情報マネージャー を利用する方向とする。
資格情報マネージャーは コントロール パネル\ユーザー アカウント\資格情報マネージャー
(Control Panel\User Accounts\Credential Manager
) でアクセス可能。
この中で Web 資格情報 と Windows 資格情報(汎用資格情報)がある。
どちらのものが扱えて、扱いやすいかは検討する必要がある。
認証方法について
アカウント認証情報として、本来であればブラウザウィンドウを開き、サイトへログインしてもらい、認可セッションを取得したのちにアプリケーションに戻って、その認可情報を使って制御する形としたい。
しかし、サービスとして利用可能な正規のアプリケーションではないため、Webブラウザからそのセッションを取得するのは、つくりとして難しいと考える。
信頼性は落ちるが、下記のような実装になると想定する。
- ユーザーはアプリケーションを経由して事前にアカウント情報を入力する。
- アプリケーションは入力された内容をOSの資格情報に書き込む。
- アプリケーションは保存された資格情報を用いて都度ログインする。ただしランチャー起動中は極力同一セッションでログインする。
- ログインして取得したセッション情報を用いてゲームを起動する。