IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Comment crypter un mot de passe ?


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut Comment crypter un mot de passe ?
    Bonjour à tous,

    J'ai trouvé comment vérifié si un utilisateur existe dans la table "USER" de la base "MYSQL" maintenant mon problème c'est comment je peux crypter un mot de passe que je récupères depuis mon formulaire avec la fonction "Password" afin que je puisses vérifier si le mot de passe sélectionné dans la base (Qui est en version hashée) est égal à la version hashée de celui que je récupères depuis mon formulaire.
    Je sais comment faire avec la fonction "SHA-256" et "MD5" mais c'est avec "Password" que je ne me trouves pas,donc si quelqu'un sait comment faire merci de me guider.

    Il se peut que je doit ajouter une librairie dont je connaît pas puisque lorsque j'ai utilisé "SHA-256" j'ai téléchargé la librairie "JASYPt 1.9.0" et voici comment j'ai fait avec "SHA-256" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		String pass = request.getParameter("passCons");
    ConfigurablePasswordEncryptor passwordEncryptor = new ConfigurablePasswordEncryptor();
    				passwordEncryptor.setAlgorithm("SHA-256");
    				passwordEncryptor.setPlainDigest( false );
    				String motDePasseChiffre = passwordEncryptor.encryptPassword(pass );
    J'aimerais faire pareil avec la fonction Password et si ce n'est pas faisable,j'ai besoin de votre aide pour modifier la fonction de hashage par défaut de "MYSQL SERVER".

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 173
    Points : 187
    Points
    187
    Par défaut
    Salut,
    Tu parles de la fonction PASSWORD de MySQL?

    Si oui, voici une soluion:
    - Tu construis une requête SELECT de ce type (un String en java qui représente ta requête): SELECT * FROM USERS WHERE id="identifiantSaisi" and pass=PASSWORD('passSaisi') (identifiantSaisi et passSaisi sont les valeurs récupérées à partir des champs sous forme de String)
    - Tu exécutes la requête et tu regardes si un résultat est retourné. Si c'est le cas, tu stockes les informations de session (ex: nom et prénom pour pouvoir les afficher sur chaque page, droits de l'utilisateur...).

    Cependant, je ne conseille pas de faire comme ca car cela implique les choses suivantes:
    - L'utilisateur va saisir ses identifiants dans le navigateur (sur son poste client donc)
    - La requête va être exécutée là où il y a la base de données et c'est elle qui hashe le mot de passe (sur le serveur donc)
    - Il va donc falloir faire transiter ces informations entre le client et le serveur mais là elles sont en clair si tu n'appelles la fonction de hashage seulement dans la requête à exécuter côté serveur.
    - La fonction PASSWORD est plutôt déconseillée car il y a des fonctions de hashage plus "fortes" et qui sécurisent mieux le mot de passe

    En général, voici ce que je fais:
    - Coté client, je récupère la valeur des champs et je hashe cette valeur directement avec un hash fort
    - Coté serveur, j'exécute la requête avec la valeur déjà hashée coté client
    - Ainsi, le mot de passe ne passe pas en clair sur le réseau

    Pour avoir un équivalent de la fonction PASSWORD en java, j'ai trouvé cette discussion mais je n'ai pas testé: http://stackoverflow.com/questions/5...nction-in-java
    Diplomes: DUT informatique et Master 2 MIAGE.
    Développeur Java/J2EE (principalement), .NET (niveau scolaire mais je compte m'améliorer ) et Web (HTML, PHP...).

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Merci pour votre réponse,

    En réalité,faire un select dans la table user depuis la base de données "MYSQL" n'est pas du tout convenable puisque je l'ai fait et ça marche.Le grand problème je me suis rendu compte que n'importe quelle utilisateur tant qu'il existe dans la table "User" peut avoir accès à l'application(donc même n'ayant pas de privilèges sur la base de données choisie). Par exemple j'ai 2 base de données et chacune avec un utilisateur différent mais quand je fais "select * from user where User = "Utilisateur" and Password = Password "12345" " ça me retourne un utilisateur que j'ai créé pour une base de données autre que celle sur laquelle je travaille et selon mon contrôle dès que je trouve un utilisateur je redirige vers la page d'accueil.

    Ben,voilà mon souci actuel : Je voulais un moyen me permettant de récupérer les informations saisies depuis le formulaire de connexion dans ma class chargée de fournir la connexion afin de les utiliser lors du chargement du "driver" et de l'établissement de la connexion ensuite je vérifie si la connexion est "null" alors pas d'accès à l'application sinon redirection vers la page d'accueil.

    Voilà ce que j'ai fais mais y a un un problème dans la class chargée de fournir la connexion :

    Code de la Servlet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package TPServlet;
     
    import static CoucheMetier.ValidationFormUtilitaire.getValeurSaisie;
     
    import java.io.IOException;
     
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    import CoucheMetier.UtilisateurMetier;
    import DAO.DAOFactoryMysql;
    import DAO.UtilisateurDao;
    import LesObjets.Utilisateur;
     
     
    @WebServlet("/index")
    public class index extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	private static final String utiliCons = "NomUti";
    	private static final String passCons = "Password";
    	private static final String indexCons = "/WEB-INF/Index.jsp";
    	private static final String accueilCons = "/WEB-INF/MonMenu.jsp";
    	private static final String utilisateurCons = "utili";
    	private static final String passwordCons = "pass";
     
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	      this.getServletContext().getRequestDispatcher(indexCons).forward(request, response);
    		}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    		ServletContext application = getServletContext();
     
    		String utili = getValeurSaisie(request,utiliCons);
    		String pass = getValeurSaisie(request,passCons);
     
    		application.setAttribute(utilisateurCons, utili);//Je stocke le nom d'utilisateur dans un attribut de portée application
    		application.setAttribute(passwordCons, pass);//Je stocke le mot de passe de l'utilisateur dans un attribut de portée application
     
    		if(pass != null && utili != null){
           	 this.getServletContext().getRequestDispatcher(accueilCons).forward(request, response);
            }else{
           	 this.getServletContext().getRequestDispatcher(indexCons).forward(request, response);
     
            }
     
    		}
     
    }
    Code de la Factory(classe chargée de fournir la connexion)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    package DAO;
     
     
    import static CoucheMetier.ValidationFormUtilitaire.getValeurSaisie;
     
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
     
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
     
    import DAOException.DAOExceptionConfig;
    import LesObjets.Utilisateur;
     
    import com.jolbox.bonecp.BoneCP;
    import com.jolbox.bonecp.BoneCPConfig;
     
    public class DAOFactory {
    	private static final String info = "/DAO/InfoConnexion";
    	private static final String URL = "url";
    	private static final String USER = "user";
    	private static final String MOTDEPASSE = "password";
    	private static final String DRIVER = "driver";
    	private static final String motDePasse = "pass";
    	private static final String utilisateur = "utili";
     
    	BoneCP connextionbonne = null;
    	DAOFactory(BoneCP connect){
    		this.connextionbonne = connect;
    	}
       public static DAOFactory getInstance(ServletContext application) throws DAOExceptionConfig{
     
     
    		 String motDepasse = (String) application.getAttribute(motDePasse);/*Récupération du mot de passe que j'ai placé dans un attribut de portée application dans la Servlet*/
    	        String uti = (String) application.getAttribute(utilisateur);/*Récupération du nom de l'utilisateur que j'ai placé dans un attribut de portée application dans la Servlet*/
     
    	     System.out.println(motDepasse + uti);/*Cet affichage m'affiche "null null" donc j'ai pu comprendre que je n'arrive pas à récupérer les identifiants dans la classe chargée de fournir la connexion afin de les utiliser*/
     
    	   Properties proprieteInfoConnextion = new Properties();
    	   BoneCP connextionbonne = null;
    	   String url;
    	   String user;
    	   String motdepasse;
    	   String driver;
     
    	  ClassLoader ouvertureInfoConnexion = Thread.currentThread().getContextClassLoader();
    	  InputStream monFichier = ouvertureInfoConnexion.getResourceAsStream(info);
    	  if(monFichier == null){
    		  throw new DAOExceptionConfig("Le fichier est introuvable.");
    	  }
    	  try{
    		  proprieteInfoConnextion.load(monFichier);
    		  url = proprieteInfoConnextion.getProperty(URL);
    		  user = proprieteInfoConnextion.getProperty(USER);
    		  motdepasse = proprieteInfoConnextion.getProperty(MOTDEPASSE);
    	      driver = proprieteInfoConnextion.getProperty(DRIVER);
    	  }catch(FileNotFoundException f){
    		  throw new DAOExceptionConfig("Le fichier properties" + info + "est introuvable",f);
    	  }catch(IOException i){
    		  throw new DAOExceptionConfig("impossible de charger le driver.",i);
    	  }
    	  try{
    		  Class.forName(driver);
    	  }catch(ClassNotFoundException c){
    		  throw new DAOExceptionConfig("Le driver est introuvable.",c);
    	  }
    	    try{
    	    BoneCPConfig configurationConnextion = new BoneCPConfig();
    	    configurationConnextion.setJdbcUrl(url);
    	    configurationConnextion.setUsername(user);/*j'aimerais mettre le nom de l'utilisateur récupéré depuis le formulaire de connexion au lieu de celui qui se trouve dans le fichier*/
    	    configurationConnextion.setPassword(motdepasse);/*j'aimerais mettre le mot de passe récupéré depuis le formulaire de connexion au lieu de celui qui se trouve dans le fichier*/
    	    configurationConnextion.setMaxConnectionsPerPartition(10);
    	    configurationConnextion.setMinConnectionsPerPartition(5);
    	    configurationConnextion.setPartitionCount(2);
    	    connextionbonne = new BoneCP(configurationConnextion);
    	    }catch(SQLException s){
    	    	throw new DAOExceptionConfig("Le driver est introuvable.");//Message qui s'affiche lorsque j'utilise les identifiants récupérés depuis le formulaire
    	    }
    	  DAOFactory instance = new DAOFactory(connextionbonne);  
     
    	  return instance;   
       }
       Connection getConnection() throws SQLException{
    	return connextionbonne.getConnection();
     
       } 
       public EtudiantDao getEtudiantDao(){
    	   return new EtudiantDaoImpl(this);
       }
      public MatiereDao getMatiereDao(){
    	   return new MatiereDaoImpl(this);
       }
      public dateDao getDateDao(){
    	   return new DateDaoImpl(this);
      }
      public NoteDao getNoteDao(){
    	   return new NoteDaoImpl(this);
       }
    }
    Code de la configuration de la factory(classe chargée de fournir la connexion) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package DAOFactoryConfiguration;
     
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.http.HttpServletRequest;
     
    import DAO.DAOFactory;
     
    public class FactoryConfig implements ServletContextListener{
    	private static final String daoFactoryCons = "daoFactory";
    	private DAOFactory daoFactory;
    	@Override
    	public void contextInitialized(ServletContextEvent Configuration) {
     
    		ServletContext servletContext = Configuration.getServletContext();
     
    		this.daoFactory = DAOFactory.getInstance(servletContext);
     
    		servletContext.setAttribute( daoFactoryCons,this.daoFactory );
    	}
    	@Override
    	public void contextDestroyed(ServletContextEvent Configuration) {
    		// TODO Auto-generated method stub
     
    	}
     
    }
    Avec ce code la page de connexion s'affiche bien mais dès que j'utilise "le mot de passe et le nom de l'utilisateur récupérés" depuis le formulaire de connexion elle ne s'affiche plus et j'ai l'erreur suivante dans le navigateur:

    Nom : Capture.PNG
Affichages : 4028
Taille : 14,1 Ko

    et j'ai ça dans la console :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GRAVE: Exception lors de l'envoi de l'évènement contexte initialisé (context initialized) à l'instance de classe d'écoute (listener) DAOFactoryConfiguration.FactoryConfig
    DAOException.DAOExceptionConfig: Le driver est introuvable.
    	at DAO.DAOFactory.getInstance(DAOFactory.java:84)
    	at DAOFactoryConfiguration.FactoryConfig.contextInitialized(FactoryConfig.java:18)
    Merci d'avance!!!

Discussions similaires

  1. Comment Crypter un mot de passe dans un fichier .ini?
    Par Hamdi Hedhili dans le forum C++/CLI
    Réponses: 4
    Dernier message: 12/10/2010, 14h09
  2. Comment crypter un mot de passe (QString) en Sha1 ?
    Par Ðalven dans le forum Débuter
    Réponses: 4
    Dernier message: 04/01/2010, 21h47
  3. Réponses: 4
    Dernier message: 20/03/2009, 16h39
  4. Comment crypter les mots de passe avec MD5 ?
    Par Fngonka dans le forum ASP.NET
    Réponses: 19
    Dernier message: 31/07/2008, 09h48
  5. comment crypter les mots de passe?
    Par JauB dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/11/2005, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo