Javaで機密データを保存するならchar[]配列が安全な理由とは?Stringとの違いを徹底解説
Javaでは、Stringとchar[]配列のどちらもテキストデータを格納できますが、パスワードやSSN(社会保障番号)などの機密情報を扱う場合、どちらを選ぶかは非常に重要な判断ポイントになります。その鍵を握るのがStringの不変性(イミュータブル性)という特性です。本記事では、なぜ機密データの保存にはStringではなくchar[]配列が推奨されるのか、その理由を詳しく解説します。
char[]配列が推奨される5つの理由
- 誤出力のリスクが低い: プレーンな文字列(String)を使うと、ログファイルなど安全でない場所に誤ってパスワードを出力してしまう危険性が高くなります。一方、char[]配列は情報漏えいに対する脆弱性が相対的に低いという特徴があります。
- 内容を上書きできない: Stringはイミュータブル(不変)であるため、生成後に内容を変更・上書きするメソッドが存在しません。この特性により、Stringオブジェクトはパスワードなどの機密情報の保持には不向きです。機密情報は必ずchar[]配列に保存しましょう。
- メモリに長く残り続ける: Stringはイミュータブルなため、パスワードを平文で保存すると、ガベージコレクタ(GC)が回収するまでメモリ上に残ります。さらに、Stringは再利用のために文字列定数プール(SCP:String Constant Pool)を使用するため、メモリ内に長期間留まる可能性が高まります。メモリダンプへアクセスできる攻撃者なら、平文のパスワードを容易に抜き出せるため、平文ではなく暗号化されたパスワードを扱うべきです。
- Java自身がchar[]を推奨している: Java SwingアプリケーションのJPasswordFieldを見ると、char[]を返すgetPassword()メソッドと、非推奨(deprecated)となった平文を返すgetText()メソッドが存在します。これは、Java自体がgetPassword()メソッドの利用を推奨していることを意味します。
- 使用後に消去(サニタイズ)できる: char[]配列はサニタイズ可能です。使用後はダミーデータで上書きすることでパスワードを実質的に消去できますが、Stringはイミュータブルなため上書きによる消去ができません。
サンプルコード
public class SecureInfoData {
public static void main(String args[]) {
String pwd = "string_pass_word";
System.out.println("String Password is: " + pwd);
char charPwd[] = "char_pass_word".toCharArray();
System.out.println("Character Password is: " + charPwd);
}
}
実行結果
String Password is: string_pass_word Character Password is: [C@6d06d69c
実行結果を見ると、Stringの場合はパスワードがそのまま平文で表示されるのに対し、char[]配列の場合は「[C@6d06d69c」というオブジェクトのハッシュ値のような表現が出力されます。これは、char[]配列を直接文字列として扱わない限り、中身のパスワードが意図せず露出しにくいことを示しています。
まとめ
Stringのイミュータブル性と文字列定数プールの仕組みは、通常の文字列操作においては大きなメリットですが、機密情報の取り扱いにおいてはむしろリスクとなります。パスワードなどの機密データはchar[]配列で保持し、使用後は速やかに上書きして消去する——これがJavaにおけるセキュアコーディングの基本原則です。
-
Oracle Data Redactionで機密データを保護する方法
組織にとって、社会保障番号、銀行口座番号や金融機関コードといった機密データを確実に保護することは、重大な課題となっています。 はじめに 法令や規制により、組織は自社のデータおよび顧客情報が不正な手に渡らないよう保護することが求められています。データリダクション(Data Redaction)、すなわち動的データマスキング(DDM)とは、機密性の高いデータ要素を難読化または非表示にするプロセスのことです。 Oracle® Data Redactionは、機密情報の露出を低減し、アプリケーションページ上で機密データを漏えいさせる恐れのあるアプリケーションの脆弱性が悪用されるのを防ぐのに役立ちます。
-
AndroidがiPhoneより人気の理由とは?市場シェア80%の秘密を徹底解説
AndroidとiPhoneは、画面、プロセッサチップ、カメラなどをめぐって、終わりのない競争を続けてきました。2007年、Appleは世界初のタッチスクリーン搭載スマートフォンを発表し、多くの消費者を魅了しました。しかし、その価格帯ゆえに、すべての人にとって手の届くものではありませんでした。2008年にAndroidが登場すると、2010年末までには市場は二つの勢力に分かれました。Androidはプラットフォームとして提供されたため、他のスマートフォンメーカーもOSとして利用できました。一方、iOSプラットフォームはiPhoneに限定されています。こうしてAndroidは徐々に世界で最も人気