ホームページ  >  記事  >  Java  >  Java のパスワードベースの暗号化を使用して、構成ファイルに保存されているパスワードを安全に暗号化するにはどうすればよいですか?

Java のパスワードベースの暗号化を使用して、構成ファイルに保存されているパスワードを安全に暗号化するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-17 04:17:03675ブラウズ

How can I securely encrypt passwords stored in configuration files using Java's Password Based Encryption?

設定ファイル内のパスワードの暗号化

設定ファイルに保存されているパスワードを保護することは非常に重要です。 Java のパスワード ベースの暗号化を使用した安全なアプローチは次のとおりです。

問題の概要:

設定ファイル内のパスワードを暗号化すると、プログラムによる安全な保存と取得が可能になります。この方法により、機密情報の漏洩が防止されます。

Java のパスワード ベースの暗号化ソリューション:

Java のパスワード ベースの暗号化 (PBE) は、次を使用してパスワードを暗号化および復号化する便利な方法を提供します。パスワードベースのキー。これには次の手順が含まれます。

  • 「AES/CBC/PKCS5Padding」アルゴリズムを使用して Cipher オブジェクトを初期化します。
  • javax を使用してパスワードから javax.crypto.SecretKey を計算します。 「PBKDF2WithHmacSHA512」アルゴリズムを使用した crypto.SecretKeyFactory。

コード例:

import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.InvalidKeySpecException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PBEKeySpec;
import java.util.Base64;

public class PasswordEncryption {

    public static void main(String[] args) throws Exception {
        // Generate a secret key from the password
        char[] password = "mySecurePassword".toCharArray();
        byte[] salt = new String("12345678").getBytes();
        int iterationCount = 40000;
        int keyLength = 128;
        SecretKeySpec key = createSecretKey(password, salt, iterationCount, keyLength);

        // Encrypt a password using the secret key
        String originalPassword = "secretPassword";
        String encryptedPassword = encrypt(originalPassword, key);

        // Decrypt the encrypted password
        String decryptedPassword = decrypt(encryptedPassword, key);
    }

    private static SecretKeySpec createSecretKey(char[] password, byte[] salt, int iterationCount, int keyLength) throws NoSuchAlgorithmException, InvalidKeySpecException {
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
        PBEKeySpec keySpec = new PBEKeySpec(password, salt, iterationCount, keyLength);
        SecretKey keyTmp = keyFactory.generateSecret(keySpec);
        return new SecretKeySpec(keyTmp.getEncoded(), "AES");
    }

    private static String encrypt(String property, SecretKeySpec key) throws GeneralSecurityException, UnsupportedEncodingException {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        AlgorithmParameters parameters = cipher.getParameters();
        IvParameterSpec ivParameterSpec = parameters.getParameterSpec(IvParameterSpec.class);
        byte[] cryptoText = cipher.doFinal(property.getBytes("UTF-8"));
        byte[] iv = ivParameterSpec.getIV();
        return base64Encode(iv) + ":" + base64Encode(cryptoText);
    }

    private static String base64Encode(byte[] bytes) {
        return Base64.getEncoder().encodeToString(bytes);
    }

    private static String decrypt(String string, SecretKeySpec key) throws GeneralSecurityException, IOException {
        String iv = string.split(":")[0];
        String property = string.split(":")[1];
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(base64Decode(iv)));
        return new String(cipher.doFinal(base64Decode(property)), "UTF-8");
    }

    private static byte[] base64Decode(String property) throws IOException {
        return Base64.getDecoder().decode(property);
    }
}

セキュリティに関する考慮事項:

この方法では、強力な暗号化アルゴリズム (AES) と安全なキー導出関数 (PBKDF2WithHmacSHA512) が利用されます。強力なパスワードを選択し、安全に保管することが重要です。

マスター パスワードの保管:

構成ファイルの暗号化に使用されるパスワードは、安全な保管場所が必要です。環境変数または別の安全な場所に保存します。

以上がJava のパスワードベースの暗号化を使用して、構成ファイルに保存されているパスワードを安全に暗号化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。