Maison >base de données >tutoriel mysql >Comment sécuriser les informations d'identification MySQL dans le code Java contre la décompilation ?

Comment sécuriser les informations d'identification MySQL dans le code Java contre la décompilation ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-17 19:51:12148parcourir

How to Secure MySQL Credentials in Java Code Against Decompilation?

Comment protéger le nom d'utilisateur et le mot de passe MySQL de la décompilation

Problème :

Java .class les fichiers peuvent être décompilés sans effort. Comment peut-on protéger une base de données s'il doit utiliser des informations de connexion dans le code ?

Réponse :

Ne jamais coder en dur les mots de passe dans le code. Cela a été récemment souligné dans le « Top 25 des erreurs de programmation les plus dangereuses » :

« Codage en dur d'un compte secret et d'un mot de passe dans votre logiciel est exceptionnellement pratique, pour les ingénieurs inverseurs qualifiés. Si le mot de passe est cohérent dans l'ensemble de votre logiciel , chaque client devient vulnérable lorsque ce mot de passe est inévitablement connu. De plus, étant codé en dur, il constitue un inconvénient important à résoudre. "

Les informations de configuration, y compris les mots de passe, doivent être stockées dans. un fichier séparé que l'application lit lors de l'initialisation. C'est la seule véritable méthode pour empêcher la fuite du mot de passe due à la décompilation (ne le compilez jamais en binaire en premier lieu).

Solution :

Pour Java , une solution simple consiste à utiliser la classe Preferences, conçue pour stocker divers paramètres du programme, notamment les noms d'utilisateur et les mots de passe.

import java.util.prefs.Preferences;

public class DemoApplication {
  Preferences preferences = Preferences.userNodeForPackage(DemoApplication.class);

  public void setCredentials(String username, String password) {
    preferences.put("db_username", username);
    preferences.put("db_password", password);
  }

  public String getUsername() {
    return preferences.get("db_username", null);
  }

  public String getPassword() {
    return preferences.get("db_password", null);
  }

  // your code here
}

Dans ce code, la méthode setCredentials définit le nom d'utilisateur et le mot de passe après avoir affiché une boîte de dialogue de saisie. Lors de la connexion à la base de données, les méthodes getUsername et getPassword récupèrent les valeurs stockées. Les informations d'identification ne sont pas codées en dur dans les binaires, ce qui atténue le risque de sécurité posé par la décompilation.

Remarques importantes :

  • Les fichiers de préférences sont des fichiers XML en texte brut. Empêchez les utilisateurs non autorisés d'y accéder (autorisations UNIX et Windows, etc.).
  • L'architecture correcte dépend du contexte de l'application. Si l'utilisateur connaît (et est autorisé à connaître) les informations d'identification, la solution ci-dessus fonctionne. Cependant, si vous essayez de cacher les informations d'identification de l'utilisateur, une architecture à plusieurs niveaux est recommandée avec une couche intermédiaire authentifiant les utilisateurs et accordant des opérations limitées.
  • Dans l'architecture à plusieurs niveaux, les utilisateurs disposent de leurs propres informations d'identification pour l'authentification avec le niveau de logique métier, mais pas la base de données. Ainsi, l'application cliente ne se connecte jamais directement à la base de données.

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!

Déclaration:
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