暗号化の演習として、少し前に「Password Locker」C#アプリを作成しました。パスワードデータを危険にさらすことなくどこからでもアクセスできるように、データをWebに移動したいと思います。私は暗号化の専門家ではないので、間違いを犯さないように、コミュニティでアイデアを実行したいと思います。
これが私が想像するものです:
- C#アプリでは、すべてのパスワードデータは、ユーザーが指定したパスワードを使用して1つのテキストチャンクとして暗号化されます。CBCモードでRijndael(対称暗号化)を使用しています。パスワードは、ハードコードされた値を使用してソルトされます。
- 暗号化されたデータがデータベースに送信されます
- サーバーのWebページにアクセスし、暗号化されたテキストをダウンロードします。クライアント側のJavaScriptを使用して、パスワードを入力します。javascriptはすべてを復号化します(まだクライアント側)
これが私の仮定です:
- すべての送信を傍受できると思います
- javascript(復号化アルゴリズムとハードコードされたソルトを含む)は傍受できると思います(実際にはWeb上にあるため)
- パスワードを傍受することはできません(入力クライアント側のみであるため)
- その結果、スヌーピングしている人がパスワード以外のすべてを持っている可能性があります。
それで、それらの仮定に基づいて:私のデータは安全ですか?私のデータはパスワードの強度と同じくらい安全であることに気づきました...それを改善するために私にできることはありますか?Rijndaelの復号化は、ブルートフォース攻撃を防ぐのに十分遅いですか?
ランダムなソルト値を使用することを考えましたが、それでも送信する必要があり、そのため、安全ではないようです。私の好みは、パスワードをWeb上に(ハッシュ化されているかどうかにかかわらず)どのような形式でも保存しないことです。
編集: 私はSSLの使用を検討しているので、その場合、私の「傍受」の仮定は有効ではない可能性があります。
編集2: Joachim Isakssonからのコメントに基づいて、SSLを使用して実行します。私の仮定を分解し続けてください!
編集3: Nemoからのコメントに基づいて、ユーザーごとにソルトを使用します。また、私はPBKDF2を使用してパスワードに基づいてキーを導出しているので、ここでブルートフォース攻撃に抵抗するための「遅さ」を得ることができます。