【Android】特定のパスワードで暗号化キーを作成

Android

特定のパスワードを使用して暗号化キーを作成する場合、一般的には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");
}
}

コードのポイント

  1. PBKDF2 アルゴリズム:
    • パスワードからキーを安全に導出するための標準的な方法です。
    • ソルトを使用して辞書攻撃や総当たり攻撃を防ぎます。
    • 65536 は繰り返し回数を指定しており、これを増やすとセキュリティが向上しますが処理が遅くなります。
  2. ソルトの役割:
    • 同じパスワードでも異なるソルトを使用することで、異なる暗号化キーを生成します。
    • ソルトは暗号化データと一緒に保存する必要があります。
  3. 初期化ベクトル (IV):
    • AES/CBC/PKCS5Padding では、ブロック暗号化に初期化ベクトル (IV) が必要です。
    • IVも暗号化データと一緒に保存します。

保存のヒント

  • 暗号化データの保存: 暗号化データには、ソルトやIVも保存する必要があります。例えば、Base64エンコードして一緒に保存する方法があります。
  • パスワード管理: パスワードは安全に管理してください。漏れると復号化されるリスクがあります。

コメント