Voici un exemple très "machiné" donc NE L'UTILISEZ PAS DANS VOTRE CODE.
Je pense que l'effet peut être mieux démontré avec un prédicat plutôt qu'avec un fournisseur.
Supposons que vous mettre en œuvre un vérificateur de mot de passe comme suit:
public class PasswordChecker {
private final String secretPassword;
public PasswordChecker(String secretPassword) {
this.secretPassword = secretPassword;
}
public boolean test(String password) {
return Objects.equals(this.secretPassword, password);
}
}
Ensuite, vous pouvez créer une instance d'une passe autour de:
final PasswordChecker passwordChecker = new PasswordChecker("changeit");
Et un autre endroit que vous pouvez l'utiliser pour vérifier le mot de passe:
assertThat(passwordChecker.test("foobar")).isFalse();
Cependant pour le client qui a une instance de PasswordChecker
à portée de main, il est pas si difficile d'extraire le mot de passe avec une certaine réflexion:
Field secretPasswordField = passwordChecker.getClass().getDeclaredField("secretPassword");
secretPasswordField.setAccessible(true);
String secretPassword = (String) secretPasswordField.get(passwordChecker);
System.out.print(secretPassword);
Maintenant, voici la même chose avec une fermeture:
final String secretPassword = "changeit";
final Predicate<String> passwordChecker = password -> Objects.equals(secretPassword, password);
Maintenant vous pouvez pas extraire secretPassword
du passwordChecker
.
J'aime ça - il me semble que vous pourriez faire toutes sortes de fonctionnalités (valdiation, hachage, etc) dans votre prédicat. – Raudbjorn
Désolé, j'ai été "int érupté" par le travail, je mangeais un sandwich en regardant les réponses. Peut-être que j'aurais mis en doute si la question a commencé avec: l'utilisation d'une fermeture protège vos champs contre l'exposition par réflexion. Mais en plus de cela, * la vérification * des mots de passe devrait être implémentée en utilisant des mots de passe de hachage ou SRP ou similaire. Dans ce cas, la fermeture n'a plus de sens. Et votre code introduit une attaque basée sur le temps contre la vérification du mot de passe grâce à la méthode 'equals'. –
Si vous prolongez l'avertissement que le code n'est pas sécurisé et montrez une référence pour votre réclamation que la réflexion ne peut pas fonctionner alors je suis heureux d'upvote. –