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

Servlets/JSP Java Discussion :

Récuperer password d'un LDAP et le décrypter


Sujet :

Servlets/JSP Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut Récuperer password d'un LDAP et le décrypter
    bonjour,


    je débute en jsp et l'on m'a demandé de récupérer des informations d'un LDAP tels que le nom d'utilisateur et le password d'une entrée de ce LDAP.

    j'utilise donc l'API JNDI pour interagir avec mon annuaire LDAP (au passage, j'utilise OpenDS).

    je récupère donc aisément l'uid de l'utilisateur (en string) mais je n'arrive pas a récupérer le password car il est bien évidemment crypté !!!!!!

    j'ai donc deux questions :
    -si jamais quelqu'un sait, quel est l'algo de cryptage par défaut de OpenDS (je sais qu'on peut le choisir mais je ne sais pas lequel est par défaut)

    -si l'on suppose que je sais quel algo est utilisé, comment décrypter ce mot de passe et le rendre lisible et affichable ?



    --Question subsidiaire : si jamais c'est pas possible, ou non sécurisé, comment crypter alors le mot de passe en clair pour pouvoir le comparer avec le mot de passe crypté (toujours en sachant l'algo utilisé) ????



    mon morceau de code des fois que ça aiderait :

    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
     
    try {
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT);
            env.put(Context.PROVIDER_URL, HOST);
     
            DirContext ctx = new InitialDirContext(env);
     
            SearchControls sc = new SearchControls();
            sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
     
            NamingEnumeration items = ctx.search(BASE, filter, sc);
     
            SearchResult sr = (SearchResult)items.next();
            Attributes attrs = sr.getAttributes();
            Attribute resUID=attrs.get("UID");
            String res=(String)resUID.get();
            Attribute resMDP=attrs.get("userPassword");
            String res2=(String)resMDP.get();
            out.println("Login : "+res+"\nMot de Passe : "+res2.toString()+"\n"); //test pour voir s'ils sont corrects
       }
        catch(Exception e) {
        	out.println(e.getMessage());
        	out.println(e.getStackTrace());
       }
    le e.getMessage() ==> null
    le e.getStackTrace ==> [Ljava.lang.StackTraceElement;@1ba8574


    merci d'avance de votre aide !

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    Es-tu sûr que le mot de passe est un string?
    Généralement, il est souvent retourné comme un tableau de caractères (char[]). D'où l'explication de ton exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char[] res2=(char[])resMDP.get();
     out.println("Login : "+res+"\nMot de Passe : "+res2+"\n"); //test pour voir s'ils sont corrects
    A tester !!
    Bien le bonjour chez vous
    Jowo

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    j'viens de tester et ça donne exactement la même exception.

    et oui je sais que le type retourné n'est pas un String mais je ne sais pas quel type justement qui est retourné (et donc bah char[] ça marche pas, j'ai aussi testé avec byte[] c'est la même chose) :s

  4. #4
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Pour découvrir la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    out.println(resMDP.get().getClass().gnetName()):
    Bien le bonjour chez vous
    Jowo

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Citation Envoyé par C-Jay Voir le message
    -si l'on suppose que je sais quel algo est utilisé, comment décrypter ce mot de passe et le rendre lisible et affichable ?
    Rendre lisible un mot de passe ? Je sais pas trop ce que c'est comme application, mais c'est étrange, voir louche.

    En principe les mots de passe ne se décrypte pas. Tu utilises une fonction de hachage cryptographique comme SHA256 par exemple et tu stockes le mot de passe haché. Pour valider une connection, tu haches le mot de passe entré par l'utilisateur et tu compares les deux hachages.
    En imaginant qu'un pirate récupère ta base de mot de passe, il lui est impossible uniquement avec le hachage d'en déduire le vrai mot de passe. Sauf à les attaquer par la force brute bien sûr, mais après c'est une autre histoire.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    waip, bein j'ai le même message d'erreur, ça veut donc dire que ça vient pas au moment ou j'essaye de récupérer la valeur de l'attribut mais bien au momnt ou je récupère l'attribut en lui-même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         Attribute resMDP=attrs.get("userPassword");
    or je suis sur du libellé "userPassword" (j'ai essayé sans et avec les majuscules) donc je sais vraiment pas quoi faire :/

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'abord, fait un

    e.printStackTrace();


    Qu'on sache quelle est l'erreur! On a même pas la moindre idée de ce que c'est, si ca tombe c'est LDAP qui te dit "tatata, vous n'avez pas le droit de consulter le mot de passe"

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Jimmy_ Voir le message
    Rendre lisible un mot de passe ? Je sais pas trop ce que c'est comme application, mais c'est étrange, voir louche.
    ouais quand je mets "rendre lisible" c'est pour dire "déhacher" le mot de passe stocké. je sais que c'est pas bien et tout mais pour l'instant je ne fais que des test et donc c'était pour savoir si c'était possible.

    Citation Envoyé par Jimmy_ Voir le message
    En principe les mots de passe ne se décrypte pas. Tu utilises une fonction de hachage cryptographique comme SHA256 par exemple et tu stockes le mot de passe haché. Pour valider une connection, tu haches le mot de passe entré par l'utilisateur et tu compares les deux hachages.
    En imaginant qu'un pirate récupère ta base de mot de passe, il lui est impossible uniquement avec le hachage d'en déduire le vrai mot de passe. Sauf à les attaquer par la force brute bien sûr, mais après c'est une autre histoire.
    et donc y'a une fonction qui permet de hacher le mot de passe que tu veux avec la fonction de hachage que tu veux ?

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par C-Jay Voir le message

    et donc y'a une fonction qui permet de hacher le mot de passe que tu veux avec la fonction de hachage que tu veux ?
    L'api cryptographique. Mais si ton but est de faire de l'authentification, le plus simple, normalement, c'est simplement: tu prend l'utilisateur, tu prend sont mot de passe et avec cet ensemble tu tente un bind sur le serveur ldap. Si ca passe, le serveur ldap a accepté le mot de passe, si ca passe pas, le mot de passe ou le nom d'utilisateur est incorrect

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    L'api cryptographique. Mais si ton but est de faire de l'authentification, le plus simple, normalement, c'est simplement: tu prend l'utilisateur, tu prend sont mot de passe et avec cet ensemble tu tente un bind sur le serveur ldap. Si ca passe, le serveur ldap a accepté le mot de passe, si ca passe pas, le mot de passe ou le nom d'utilisateur est incorrect

    ça ça m'plait !!!! merci j'vais tenter ça

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    ouais quand je mets "rendre lisible" c'est pour dire "déhacher" le mot de passe stocké. je sais que c'est pas bien et tout mais pour l'instant je ne fais que des test et donc c'était pour savoir si c'était possible.
    La propriété principale des fonctions de hachage cryptographique est justement de ne pas pouvoir retrouver le mot d'origine.


    et donc y'a une fonction qui permet de hacher le mot de passe que tu veux avec la fonction de hachage que tu veux ?
    Non il existe beaucoup de fonction de hachage différente. La taille du résultat haché est un indicateur de celle qui est utilisée, vu que c'est une constante. Mais cela ne donne pas l'algorithme pour autant.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    L'api cryptographique. Mais si ton but est de faire de l'authentification, le plus simple, normalement, c'est simplement: tu prend l'utilisateur, tu prend sont mot de passe et avec cet ensemble tu tente un bind sur le serveur ldap. Si ca passe, le serveur ldap a accepté le mot de passe, si ca passe pas, le mot de passe ou le nom d'utilisateur est incorrect
    bon j'ai la javadoc sous les yeux mais impossible de comprendre comment s'en servir de la fonction "bind" =/
    je sais ce que ça ait mais je sais pas comment l'utiliser.
    j'ai mes deux strings user et password. comment je fais pour les utiliser avec "bind" ?

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    d'abord, désolé de t'induire en erreur, je parlais de la commande "bind" de ldap qui est utilisée pour l'authentification, pas de la commande bind de jndi qui est utilisé pour accrocher une nouveau noeud


    En pratique, bout de code de sun:
    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
    // Set up the environment for creating the initial context
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
     
    // Authenticate as S. User and password "mysecret"
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
    env.put(Context.SECURITY_CREDENTIALS, "mysecret");
     
    // Create the initial context
    DirContext ctx = new InitialDirContext(env);
    ctx.lookup("cn=S. User, ou=NewHires, o=JNDITutorial");
    // si pas d'erreur, on est accepté

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    d'abord, désolé de t'induire en erreur, je parlais de la commande "bind" de ldap qui est utilisée pour l'authentification, pas de la commande bind de jndi qui est utilisé pour accrocher une nouveau noeud


    En pratique, bout de code de sun:
    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
    // Set up the environment for creating the initial context
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
     
    // Authenticate as S. User and password "mysecret"
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
    env.put(Context.SECURITY_CREDENTIALS, "mysecret");
     
    // Create the initial context
    DirContext ctx = new InitialDirContext(env);
    ctx.lookup("cn=S. User, ou=NewHires, o=JNDITutorial");
    // si pas d'erreur, on est accepté
    ouaip, j'avais trouvé autre part dans l'attente d'une réponse ici mais c'est exactement comme tu montres la.
    PS : j'avais fait le boulet aussi parce que j'ai changé de LDAP et donc de port et j'avais oublié de modifier le port dans mon code

    merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récuperer password d'un LDAP et le décrypter
    Par dunod dans le forum Général Java
    Réponses: 3
    Dernier message: 04/04/2011, 07h30
  2. SSH, LDAP, no password
    Par rulianf dans le forum Sécurité
    Réponses: 2
    Dernier message: 04/10/2009, 15h06
  3. Probleme récuperation mot de passe LDAP
    Par chouchou92 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 14/06/2006, 15h39
  4. Réponses: 17
    Dernier message: 19/01/2006, 13h51
  5. Identification via un LDAP, password crypté
    Par brice.antoine dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 15/06/2004, 13h04

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