FirefoxやThunderbirdがやっているようにマスターパスワードを使うやり方はどうでしょう?
・パスワードはファイルに保存する。
・ただし平文では保存せずに、マスターパスワードを入力させてそれで暗号化したファイルを保存する。
・暗号化されたファイルのマスターパスワードはアプリケーションは知る必要が無いのでソースを見ても問題ない。
・アプリケーションの起動時or最初にパスワードが必要になるタイミングなどにマスターパスワードの入力をさせて、起動中はそれをメモりに覚えておく。
・アプリケーションはメモリ中のマスターパスワードでファイルを復号化して保存されたパスワードを取得する。
こんな感じです。
多分、可逆な暗号方式を使って保存という考え方そのものが問題です
例えばUnixの場合は/etc/passwd(最近は/etc/shadow)にパスワードが保存されていますが
暗号化アルゴリズムを使って暗号化された後のパスワードを保存しています
多分、今の認証方式は
1. ファイルに生のパスワードを保存
2. ユーザから入力されたパスワードが1.と同じかどうかチェック
3. 同じ場合、認証成功
方式だと思いますが
1. ファイルに暗号化した後のパスワードを保存
# 簡易な暗号化アルゴリズムは例えばcryptなどがあります
2. ユーザから入力されたパスワードを1.と同様の方法で暗号化する
3. ユーザから入力された暗号化されたパスワードが1.と同じかどうかチェック
4. 同じ場合、認証成功
という方法が一般的だと思います
一応、cryptのアルゴリズムは非可逆の為、
暗号化されたパスワードが漏洩したとしても
それから元のパスワードを推測することは難しいです
まぁ、総当り攻撃をすればどんな暗号でもいずれ破られてしまいますが...
FirefoxやThunderbirdがやっているようにマスターパスワードを使うやり方はどうでしょう?
・パスワードはファイルに保存する。
・ただし平文では保存せずに、マスターパスワードを入力させてそれで暗号化したファイルを保存する。
・暗号化されたファイルのマスターパスワードはアプリケーションは知る必要が無いのでソースを見ても問題ない。
・アプリケーションの起動時or最初にパスワードが必要になるタイミングなどにマスターパスワードの入力をさせて、起動中はそれをメモりに覚えておく。
・アプリケーションはメモリ中のマスターパスワードでファイルを復号化して保存されたパスワードを取得する。
こんな感じです。
コメント(1件)
CryptProtectData関数 https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa380261(v=vs.85).aspx というAPIがあり、これによって「暗号化したユーザーにしか復号できない」もしくは「暗号化したコンピュータでしか復号できない」暗号文を生成可能です。
これならばアプリがキーを持つことがないため質問の要件を満たせます。