私は、パスワードのために、それは使用する方が理想的だと読んでchar[]
以来Strings
不変です。問題は、私はHTTP呼び出しを呼び出すサードパーティの依存関係にパスワード引数を渡す必要があり、です。これは、文字列のみを受け入れます。コールは、私はこの方法を使用して、メッセージにパスワードを送っ含まれます。
new Request.Builder()
.url("notmyapi.com/login")
.method("POST", new FormBody.Builder()
.add("name", username)
.add("password", password)
.build())
.build()
私はそれはそれではなく、base64でエンコードされたバージョンまたは何を受け入れるのであるとしてWeb APIは、単にパスワードを受け入れていることおそらく悪いと知っているが、それは私のものではない、と私は単に私の仕事をしなければなりません。
質問:
私は今のようにパスワードの周りに渡しているのでchar[]
、しかし、.add(key, value)
上記の方法は、文字列のみを受け入れ、それが行うには安全ですか.add("password", new String(password))
?これは、私はおそらくセキュリティ上の懸念のために避けるためにしようとしているメモリに新しいStringインスタンスを作成しませんか?
私は、パスワードのために、それは使用する方が理想的だと読んで
char[]
以来Strings
不変です。
それは、(全体の)理由はありません。実際の理由は次のとおりです。
あなたはセキュリティのため、パスワードを使用しています。
悪い男は実行中のJVMのメモリダンプを取得することができ...またはそのホールド(または保有)ディスクブロックから部分ダンプを抽出JVMのメモリページがあります。そのダンプがクリアテキストでパスワードが含まれていてもよいです。
彼らはもはや必要とされたときにこれを緩和するためには、パスワードを含むメモリを上書きしない(必要がある)ことができます。
上書きすることは困難である
String
ことは不変であるから。
あなたはそれらの点のそれぞれを調べる場合は、疑問視することができ前提があります。
パスワードはセキュリティを実装するための良い方法ではありません。高レベルのセキュリティのためには、公開鍵/秘密鍵や秘密鍵認証を使用する必要があります。つまり、あなたのシステムに「あまり重要」なパスワードについて話している...またはあなたがここにアドレスしようとしているものよりも大きな問題を抱えているのどちらか。
悪い男はJVMのメモリやページファイルを読み込むことができれば、彼らはあなたのインフラストラクチャにかなり深いです。あなたは既に致命的に危険にさらされています。彼らは、この深いである場合さらに、彼らが最も可能性の高いパスワードを盗むために他の方法を見つけることができます。例えば、あなたのSSL証明書の秘密鍵を盗むとスヌーピング/暗号化されたネットワークトラフィックをデコードします。
これが唯一の緩和です。
- パスワードはで明らかになります
char[]
期間について。 - パスワードはあなたのコードに到着する前に、彼らが最も可能性が高いに変換されています
String
サーブレットスタックによってオブジェクト(またはあなたが使用してどのようなフレームワーク)。 - あなたがいる場合に加えて、この軽減にのみ有効であるか上書き
char[]
あなたのコードで。
- パスワードはで明らかになります
あなたは本当にこのことについて心配している場合、実際には、文字列を消去するためにリフレクションを使用することが可能です。すなわち変異させる
String
オブジェクトを。一般的には、これを行うのは危険なことです。パスワード/パスワードの確認のために、これは許容できるかもしれません。
要するに、私が使用していることを主張char[]
代わりにすることはString
、あなたが完全にあなたのWebフレームワークを再設計に用意されていない限り.... Javaで実装するにはあまりにも高価です。さらに、この議論の余地を行うことの利点は、深いアクセス権を持つ誰かがパスワードを盗むことができ、他の方法を与えられました。
今すぐあなたの特定の質問に:
行うには、それが安全です
.add("password", new String(password))
あなたが考える場合には、使用するのは危険であることをString
コードが助けにはならないことを、その後、パスワードの。実際には、それを想定したことpassword
であるString
あなたが今持っている2つのString
パスワードのテキストを含むメモリ内のオブジェクトを。
使用しているAPIは、パスワードを提供する必要がある場合として
String
、あなたは問題を抱えています。(ユーザーインターフェイスからそれを取得する方法、すなわち、サーブレットフレームワーク、何でも)パスワードのソースがある場合
String
、あなたは問題を抱えています。いずれの場合も、あなたが問題を解決するために対話していることを、コードの側面を手直しする必要があります。これは難しいかもしれません。
そして:
私はそれがウェブAPIはちょうどそれがあるとして、パスワードを受け入れる代わりに、base64でバージョンまたは何を受け入れていることおそらく悪いことを知っています。
Base64では、以上の分かそこらのための悪いやつのダウンを遅らせることはありません。任意の可逆符号化のための同上。しかし、私は、あなたがパスワードでのみSSL経由で送信されることを主張していることを願っています/セキュアな接続をTLS。