【Java入門】パスワード管理ツールを自作!暗号化&保存まで完全解説

プログラミング

「いろいろなサービスで使うパスワードを安全に管理したい」
「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暗号化の基礎
  • シンプルなツール設計の流れ

このツールをベースに、自分仕様のセキュアなパスワード管理アプリへと発展させていってください!

タイトルとURLをコピーしました