「いろいろなサービスで使うパスワードを安全に管理したい」
「Javaの練習として役立つツールを作ってみたい」
そんな悩みを持つ方に最適なのが、パスワード管理ツールの自作です。
このツールでは、パスワードの登録・検索・暗号化保存といった機能を通じて、
Javaのファイル操作・暗号化・クラス設計・繰り返し処理をバランスよく学ぶことができます。
この記事では、誰でも簡単に実装できる安全設計のパスワード管理アプリの作成方法を、コード付きでやさしく解説します。
パスワード管理ツールとは?
Javaで学ぶ実用的なセキュリティツール
結論:パスワードを安全に保存・管理する機能をJavaで簡単に体験できます。
SNSやショッピング、仕事のアカウントなど、私たちは多くのパスワードを使っています。
それらを紙やメモ帳で管理するのはとても危険です。
そこで活躍するのが「パスワード管理ツール」です。
Javaを使えば、自分専用の簡易ツールを作ることで、ファイル保存や暗号化も同時に学べます。
作成するツールの構成を理解しよう
最低限の3機能でシンプルに設計
結論:以下の3機能だけで実用的な管理ツールが作成可能です。
- パスワードを登録(サービス名+ID+PWを保存)
- 登録済みの情報を検索
- ファイルに保存&読み込み(暗号化付き)
構造イメージ:
1 2 3 4 | PasswordManager.java ├─ List<Credential> データ保持 ├─ AESUtil.java 暗号化・復号処理 └─ password.dat 保存ファイル |
Credentialクラスの作成
登録情報(サービス名・ID・PW)を持つデータクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Credential { private String service; private String user; private String password; public Credential(String service, String user, String password) { this .service = service; this .user = user; this .password = password; } public String getService() { return service; } public String getUser() { return user; } public String getPassword() { return password; } @Override public String toString() { return "サービス: " + service + ", ユーザーID: " + user + ", パスワード: " + password; } } |
暗号化クラス AESUtil を作成
JavaのAES方式でパスワードを安全に
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class AESUtil { private static final String KEY = "1234567890123456" ; // 16文字 public static String encrypt(String data) throws Exception { SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "AES" ); Cipher cipher = Cipher.getInstance( "AES" ); cipher.init(Cipher.ENCRYPT_MODE, key); byte [] encrypted = cipher.doFinal(data.getBytes()); return Base64.getEncoder().encodeToString(encrypted); } public static String decrypt(String encrypted) throws Exception { SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "AES" ); Cipher cipher = Cipher.getInstance( "AES" ); cipher.init(Cipher.DECRYPT_MODE, key); byte [] decoded = Base64.getDecoder().decode(encrypted); byte [] decrypted = cipher.doFinal(decoded); return new String(decrypted); } } |
メイン処理:PasswordManagerクラス
コマンドラインから登録・検索できる機能を実装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | import java.io.*; import java.util.*; public class PasswordManager { private static final String FILE = "password.dat" ; private static List<Credential> credentials = new ArrayList<>(); public static void main(String[] args) throws Exception { load(); Scanner scanner = new Scanner(System.in); while ( true ) { System.out.println( "\n1. 登録 | 2. 検索 | 0. 終了" ); System.out.print( "選択してください: " ); String input = scanner.nextLine(); if (input.equals( "1" )) { System.out.print( "サービス名: " ); String service = scanner.nextLine(); System.out.print( "ユーザーID: " ); String user = scanner.nextLine(); System.out.print( "パスワード: " ); String password = scanner.nextLine(); credentials.add( new Credential(service, user, password)); save(); System.out.println( "登録しました。" ); } else if (input.equals( "2" )) { System.out.print( "サービス名を入力: " ); String keyword = scanner.nextLine(); for (Credential c : credentials) { if (c.getService().equalsIgnoreCase(keyword)) { System.out.println(c); } } } else if (input.equals( "0" )) { break ; } else { System.out.println( "無効な入力です。" ); } } } private static void save() throws Exception { BufferedWriter writer = new BufferedWriter( new FileWriter(FILE)); for (Credential c : credentials) { String encrypted = AESUtil.encrypt(c.getService() + "," + c.getUser() + "," + c.getPassword()); writer.write(encrypted); writer.newLine(); } writer.close(); } private static void load() throws Exception { File f = new File(FILE); if (!f.exists()) return ; BufferedReader reader = new BufferedReader( new FileReader(FILE)); String line; while ((line = reader.readLine()) != null ) { String decrypted = AESUtil.decrypt(line); String[] parts = decrypted.split( "," , 3 ); credentials.add( new Credential(parts[ 0 ], parts[ 1 ], parts[ 2 ])); } reader.close(); } } |
セキュリティで注意すべき点
安全に扱うための基本対策
- 暗号鍵はアプリ内に埋め込まず、環境変数にする
- ファイルにはアクセス制限をかける(Windowsなら右クリック→プロパティ)
- 自動ログアウトやPINコードなどの追加でより安全に
応用アイデア:GUI化やエクスポート機能
より便利なツールにするには?
- SwingでGUI化して視覚的に使いやすく
- CSVファイルにエクスポートして外部連携
- マスターパスワード導入による保護強化
完成形コードまとめ
- Credential.java:登録情報のモデルクラス
- AESUtil.java:暗号化・復号の管理クラス
- PasswordManager.java:ツール本体
- password.dat:保存ファイル(暗号化済み)
まとめ:Javaでセキュアな管理を学ぼう
この記事では、Javaで作るパスワード管理ツールを紹介しました。
学べたこと:
- ファイル入出力の仕組み
- JavaによるAES暗号化の基礎
- シンプルなツール設計の流れ
このツールをベースに、自分仕様のセキュアなパスワード管理アプリへと発展させていってください!