特定のパスワードを使用して暗号化キーを作成する場合、一般的にはPassword-Based Encryption (PBE) を使用します。これは、パスワードから暗号化キーを生成する方法で、PBKDF2 (Password-Based Key Derivation Function 2) などが広く使用されています。
以下に、特定のパスワードを使用してAES暗号化キーを作成するサンプルコードを示します:
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.SecureRandom;
import java.security.spec.KeySpec;
import java.util.Base64;
public class PasswordBasedEncryption {
public static void main(String[] args) throws Exception {
// パスワードとソルト(ランダムな値)
String password = “my_secure_password”;
byte[] salt = generateSalt(); // ソルトをランダムに生成
// 暗号化キーを生成
SecretKey secretKey = createSecretKey(password, salt);
// テスト用データ
String plainText = "これは暗号化されるデータです。";
// AES 暗号化
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = generateIV(cipher.getBlockSize()); // 初期化ベクトル (IV)
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));
byte[] encryptedData = cipher.doFinal(plainText.getBytes());
String encryptedBase64 = Base64.getEncoder().encodeToString(encryptedData);
System.out.println("暗号化データ (Base64): " + encryptedBase64);
}
// ソルトの生成 (16バイト推奨)
private static byte[] generateSalt() {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
return salt;
}
// 初期化ベクトル (IV) の生成
private static byte[] generateIV(int blockSize) {
SecureRandom random = new SecureRandom();
byte[] iv = new byte[blockSize];
random.nextBytes(iv);
return iv;
}
// パスワードとソルトを基に暗号化キーを生成
private static SecretKey createSecretKey(String password, byte[] salt) throws Exception {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128); // 128ビットキー
SecretKey tmp = factory.generateSecret(spec);
return new SecretKeySpec(tmp.getEncoded(), "AES");
}
}
コードのポイント
- PBKDF2 アルゴリズム:
- パスワードからキーを安全に導出するための標準的な方法です。
- ソルトを使用して辞書攻撃や総当たり攻撃を防ぎます。
65536は繰り返し回数を指定しており、これを増やすとセキュリティが向上しますが処理が遅くなります。
- ソルトの役割:
- 同じパスワードでも異なるソルトを使用することで、異なる暗号化キーを生成します。
- ソルトは暗号化データと一緒に保存する必要があります。
- 初期化ベクトル (IV):
AES/CBC/PKCS5Paddingでは、ブロック暗号化に初期化ベクトル (IV) が必要です。- IVも暗号化データと一緒に保存します。
保存のヒント
- 暗号化データの保存: 暗号化データには、ソルトやIVも保存する必要があります。例えば、Base64エンコードして一緒に保存する方法があります。
- パスワード管理: パスワードは安全に管理してください。漏れると復号化されるリスクがあります。



コメント