Java ジュニアのポジションの面接でそのような質問を聞くことがあるかもしれません。しかし、私の友人はテクニカルリードのポジションの面接でこう尋ねられました。
String
と文字配列の 両方をテキスト データの格納に使用できます。しかし、同様の状況にまだ遭遇したことがない場合、特定のタスクでどちらかを意識的に選択することは困難です。ただし、友人が指摘したように、 に関連する質問には
String
通常、不変性 ( ) と呼ばれる文字列の特別なプロパティが含まれており
Immutable
、彼はインタビューでこれを利用しました。
char []
それでは、パスワードの保存にではなくを使用する必要がある理由をいくつか見てみましょう
String
。
理由 1. 文字列は不変です
Java では文字列は不変であるため、プレーン テキストのパスワードは、ガベージ コレクターによってクリアされるまでメモリ内で使用できます。また、パスワード
String
は繰り返し使用される
String pool
ため、かなりの確率で長期間メモリに残り、まったく安全ではありません。
Java String プールは、特別な場所 (ヒープ) に配置されるプールまたはオブジェクト (文字列) のセットです。Java の文字列は、最も一般的なデータ型の 1 つです。リソースを非常に消費するため、これはプリミティブ型ではなくオブジェクトです。したがって、4 文字の文字列を格納するには、56 バイトのメモリを割り当てる必要があります。これが、文字列が他のオブジェクトと同様にヒープに保存される理由です。 |
メモリ ダンプにアクセスできる人は誰でもパスワードを平文で見つけることができるため、平文ではなく暗号化されたパスワードを使用する十分な理由になります。文字列は不変であるため、その内容を変更することはできません。変更を加えると新しい行が作成されます。ただし、 の場合は
char []
、その要素をゼロまたは空の文字に置き換えることができます。したがって、パスワードを文字配列に保存すると、パスワードが傍受されるリスクが明らかに軽減されます。
理由 2. 著者の推奨事項
Java 自体は (もちろん、その作成者を通じて) を返す
getPassword ()
クラスのメソッドを使用することを推奨しています。非推奨のメソッドを試すこともできます。言語作成者の推奨事項に従わないのはなぜでしょうか?
JPasswordField
char []
getText ()
理由 3. 印刷する
型を使用すると、
String
文字列に格納されたテキストがログ ファイルまたはコンソールに出力される危険性が常にあります。同時に、 を使用すると
Array
、配列の内容は表示されず、メモリ内の位置のみが表示されます。もちろん、これは深刻な理由ではありませんが、それでも意味はあります。
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);
String password: Unknown
Character password: [C@110b053
もちろん、
char []
Java を使用してパスワードを保存すること自体が万能薬ではありません。ハッシュを操作したり、パスワードをプレーン テキストで保存するのではなく暗号化したりするなど、セキュリティ上の予防措置を講じる必要があります。そしてもちろん、認証手順の直後にメモリから削除してください。
Javarevisit の資料に基づく
GO TO FULL VERSION