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); } } }
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!