Maison > Java > javaDidacticiel > le corps du texte

Comment puis-je chiffrer en toute sécurité les mots de passe dans les fichiers de configuration à l'aide de Java ?

Mary-Kate Olsen
Libérer: 2024-11-17 01:41:03
original
337 Les gens l'ont consulté

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

Crypter le mot de passe dans les fichiers de configuration : une approche sécurisée

Problème :

Le stockage de mots de passe en clair dans les fichiers de configuration présente des risques de sécurité . Pour atténuer ces risques, vous souhaitez chiffrer le mot de passe tout en préservant son accessibilité à votre programme.

Solution utilisant le PBE de Java :

Une approche robuste consiste à utiliser le mot de passe de Java Mécanisme de chiffrement basé (PBE). Cela implique de générer une clé secrète à partir d'un mot de passe fourni par l'utilisateur et d'une valeur salt. La clé secrète est ensuite utilisée pour chiffrer le mot de passe.

Mise en œuvre :

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);
        }
    }
}
Copier après la connexion

Considérations de sécurité :

Pendant que PBE améliore la sécurité des mots de passe, il est crucial de protéger le mot de passe principal utilisé pour générer la clé secrète. Vous pouvez stocker le mot de passe principal dans un emplacement sécurisé externe ou le masquer dans votre code. En outre, envisagez de mettre en œuvre une limitation du débit ou d'autres mesures pour empêcher les attaques par force brute.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal