1. 概要

実際のシナリオでは、セキュリティの目的で暗号化と復号化が必要ないくつかの状況に遭遇します。 これは、秘密鍵を使用して簡単に実現できます。 したがって、秘密鍵を暗号化および復号化するには、秘密鍵を文字列に、またはその逆に変換する方法を知っている必要があります。 このチュートリアルでは、Javaでの秘密鍵とString変換について説明します。 また、例を使用して、Javaで秘密鍵を作成するさまざまな方法について説明します。

2. シークレットキー

秘密鍵は、メッセージの暗号化と復号化に使用される情報またはパラメーターです。  Javaには、 SecretKey を秘密(対称)鍵として定義するインターフェースがあります。 このインターフェースの目的は、すべての秘密鍵インターフェースをグループ化する(そして型安全性を提供する)ことです。

Javaで秘密鍵を生成するには、ランダムな番号から生成する方法と、特定のパスワードから取得する方法の2つがあります。

最初のアプローチでは、秘密鍵は SecureRandom クラスのような暗号的に安全な(疑似)乱数ジェネレーターから生成されます。

秘密鍵を生成するために、KeyGeneratorクラスを使用できます。 SecretKey を生成する方法を定義しましょう—パラメーター n は、キーの長さ(128、192、または256)をビット単位で指定します。

public static SecretKey generateKey(int n) throws NoSuchAlgorithmException {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(n);
    SecretKey originalKey = keyGenerator.generateKey();
    return originalKey;
}

2番目のアプローチでは、秘密鍵は、PBKDF2のようなパスワードベースの鍵導出関数を使用して特定のパスワードから導出されます。 パスワードを秘密鍵に変換するためのソルト値も必要です。 ソルトもランダムな値です。

SecretKeyFactoryクラスをPBKDF2WithHmacSHA256アルゴリズムとともに使用して、指定されたパスワードからキーを生成できます。

65,536回の反復と256ビットのキー長で指定されたパスワードからSecretKeyを生成する方法を定義しましょう。

public static SecretKey getKeyFromPassword(String password, String salt)
  throws NoSuchAlgorithmException, InvalidKeySpecException {
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
    KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
    SecretKey originalKey = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
    return originalKey;
}

3. SecretKeyと文字列変換

3.1. SecretKeyからString

SecretKeybyte配列に変換します。 次に、 Base64 エンコーディングを使用して、byte配列をStringに変換します。

public static String convertSecretKeyToString(SecretKey secretKey) throws NoSuchAlgorithmException {
    byte[] rawData = secretKey.getEncoded();
    String encodedKey = Base64.getEncoder().encodeToString(rawData);
    return encodedKey;
}

3.2. StringからSecretKey

Base64 デコードを使用して、エンコードされたStringキーをbyte配列に変換します。 次に、 SecretKeySpecs を使用して、byte配列をSecretKeyに変換します。

public static SecretKey convertStringToSecretKeyto(String encodedKey) {
    byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
    SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
    return originalKey;
}

変換をすばやく確認しましょう。

SecretKey encodedKey = ConversionClassUtil.getKeyFromPassword("Baeldung@2021", "@$#baelDunG@#^$*");
String encodedString = ConversionClassUtil.convertSecretKeyToString(encodedKey);
SecretKey decodeKey = ConversionClassUtil.convertStringToSecretKeyto(encodedString);
Assertions.assertEquals(encodedKey, decodeKey);

4. 結論

要約すると、SecretKeyStringに、またはその逆にJavaで変換する方法を学びました。 さらに、JavaでSecretKeyを作成するさまざまな方法について説明しました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。