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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-17 01:41:03338ブラウズ

How Can I Securely Encrypt Passwords in Configuration Files Using Java?

設定ファイル内のパスワードの暗号化: 安全なアプローチ

問題:

設定ファイルに平文のパスワードを保存するとセキュリティ上のリスクが生じる。これらのリスクを軽減するには、プログラムへのアクセス可能性を維持しながらパスワードを暗号化する必要があります。

Java の PBE を使用した解決策:

堅牢なアプローチは、Java のパスワードを利用することです。 Based Encryption (PBE) メカニズム。これには、ユーザーが指定したパスワードとソルト値から秘密キーを生成することが含まれます。次に、秘密キーを使用してパスワードが暗号化されます。

実装:

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class PasswordEncryption {

    public static void main(String[] args) {
        String password = "mySecretPassword";
        String salt = "someUniqueSaltValue";
        int iterationCount = 40000;
        int keyLength = 128;

        // Create a secret key
        SecretKeySpec secretKey = createSecretKey(password.toCharArray(), salt, iterationCount, keyLength);

        // Encrypt the password
        String encryptedPassword = encrypt(password, secretKey);

        // Decrypt the password
        String decryptedPassword = decrypt(encryptedPassword, secretKey);

        System.out.println("Original password: " + password);
        System.out.println("Encrypted password: " + encryptedPassword);
        System.out.println("Decrypted password: " + decryptedPassword);
    }

    private static SecretKeySpec createSecretKey(char[] password, String salt, int iterationCount, int keyLength) {
        try {
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
            PBEKeySpec keySpec = new PBEKeySpec(password, salt.getBytes("UTF-8"), iterationCount, keyLength);
            return new SecretKeySpec(keyFactory.generateSecret(keySpec).getEncoded(), "AES");
        } catch (NoSuchAlgorithmException | InvalidKeySpecException | UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    private static String encrypt(String password, SecretKeySpec secretKey) {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            return Base64.getEncoder().encodeToString(cipher.doFinal(password.getBytes("UTF-8")));
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    private static String decrypt(String encryptedPassword, SecretKeySpec secretKey) {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            return new String(cipher.doFinal(Base64.getDecoder().decode(encryptedPassword)));
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | BadPaddingException | IllegalBlockSizeException e) {
            throw new RuntimeException(e);
        }
    }
}

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

PBE はパスワードのセキュリティを強化します。秘密キーの生成に使用されるマスター パスワードを保護することが重要です。マスター パスワードは外部の安全な場所に保存することも、コード内で難読化することもできます。さらに、ブルート フォース攻撃を防止するために、レート制限またはその他の措置を導入することを検討してください。

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

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