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

Sécurité Java Discussion :

Cryptage mot de passe Connection


Sujet :

Sécurité Java

  1. #1
    Membre éclairé Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Points : 656
    Points
    656
    Par défaut Cryptage mot de passe Connection
    Bonjour.

    Voilà ma question : j'ai une application qui crée un objet Connection pour se connecter à une base de données mutualisée. Cette BD utilise un login et un mot de passe fixes.

    Seulement voilà, les utilisateurs finaux ne connaissent pas ce mot de passe, et je ne veux pas qu'ils le connaissent.

    Est-il possible de trouver un moyen pour le "crypter" pour qu'il ne puissent pas le lire en décompilant les binaires générés ?

    Merci d'avance.
    @+ Rémi

  2. #2
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Tes identifiants de connexion (login/password) se trouvent où : fichier de config XML d'une API de persistance ? constante Java ? fichier de propriété quelconque ?

  3. #3
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Voilà ce que tu peux faire pour encrypter :

    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
     
    import java.io.*;
    public class Encryptor
    {
        public Encryptor(int aKey)
        {
           key = aKey;
        }
     
        public void encryptFile(String inputFileName, String outputFileName) throws IOException
        {       
            InputStream in = null;
            OutputStream out = null;
            try
               {
                  in = new FileInputStream(inputFileName);
                  out = new FileOutputStream(outputFileName);
                  encryptStream(in,out);
     
               }
           finally
               {
                 if(in != null)
                    in.close();
                 if(out != null)       
                    out.close();      
               }
        }
     
        public void encryptStream(InputStream in, OutputStream out) throws IOException
        {
            boolean done = false;
            while(!done)
               {
                    int next = in.read();
                    if(next == -1)
                       done = true;
                   else
                   {
                      byte b = (byte)next;
                      byte c = encrypt(b);
                      out.write(c);
                   }
               }
        }
     
        public byte encrypt(byte b)
        {
             return (byte)(b + key);
        }    
     
        private int key;
    }
    Ca encrypte tout et n'importe quoi...

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par Razgriz
    Ca encrypte tout et n'importe quoi...
    et ça ce casse ... en 3s

    Je ne suis pas sûr qu'un simple cryptage de césar soit la solution , regarde plutôt du coté du package javax.crypto

  5. #5
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Si jamais t'as DB est une Oracle (récente + entreprise), alors regarde du côté du "cryptage transparent" : http://leoanderson.developpez.com/se...oracle/#LV-B-2


    ...sinon tu peux "obfuscer" ton code si tes login/password sont en constantes Java ; dans les autres cas c'est les droits sur le fichier de config. (XML, properties) qui doivent être définis au minimum vital pour tout autre utilisateur que celui de l'application.

    NB_ la crypto en Java se fait avec des <<JCE providers>> du type (SunJCE fourni par défaut ou Bouncy Castle en open-source) avec des algos 'standards' comme AES et RSA mais voir comment la base gère ses fonctions de déchiffrement car toutes n'en ont pas !

  6. #6
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    ouias ça se casse facilement mais c'est la base, c'est le premier encrypteur créé...

  7. #7
    Membre éclairé Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Points : 656
    Points
    656
    Par défaut
    Merci pour vos députs de réponse.

    C'est stocké dans un fichier de config (hibernate.cfg.xml).
    Le truc javax.crypto, vous avez de la doc ?

    @+
    Rémi

  8. #8
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    un lien que doit connaître tout developpeur Java : Javadoc

  9. #9
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    utilise le hachage MD5. Y a pas mieux!

    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
     
    import java.security.*;
     
     
     // GESTION MOT DE PASSE
     // Role: Prend en entree une chaine de caracteres et produit une nouvelle chaine cryptee.
     // Utilisation du hachage MD5 qui est un cryptage unidirectionnel.
     private String cryptPassword(String pass) {
      byte[] uniqueKey = pass.getBytes();
      byte[] hash = null;
      try {
       hash = MessageDigest.getInstance("MD5").digest(uniqueKey);
      }
      catch (Exception e) { // Il ne doit jamais avoir d'erreurs ici
       e.printStackTrace();
      }
      StringBuffer hashString = new StringBuffer();
      for (int i=0; i<hash.length; ++i ) {
       String hex = Integer.toHexString(hash[i]);
       if (hex.length() == 1) { 
        hashString.append('0');
        hashString.append(hex.charAt(hex.length()-1));
       }
       else {
        hashString.append(hex.substring(hex.length()-2));
       }
      }
      return hashString.toString();
     }

  10. #10
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    C'est pareil, un MD5 c'est vite cracké avec John The Ripper...

  11. #11
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par billynirvana
    utilise le hachage MD5. Y a pas mieux!


    Il existe des cryptanalyses (failles de sécurité) sur la fonction de hachage MD5 : utiliser plutôt SHA-1, voire SHA-256...

    Sinon de toute façon il faut au moins qu'il chiffre son mot de passe avec une clé GARDEE SECRETE DANS LE CODE APPLICATIF pour que le moteur de la base déchiffre le tout ; sinon les utilisateurs pourront rejouer son mot de passe haché comme il le veulent sans même savoir que c'est un condensé cryptographique.

    Bref le seul vrai moyen fiable et simple à mon sens est de n'accorder aucun droit aux utilisateurs sur le fichier "hibernate.cfg.xml" !!!

  12. #12
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Je finis mes exams et je poste dans les pages libres un encrypteur de chaque type, César, AES et DSA, les deux derniers étant théoriquement incassables...

  13. #13
    Membre habitué Avatar de Jose.N70
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Points : 130
    Points
    130
    Par défaut
    Bonjour, désolé de relancer ce sujet un peu ancien mais je souhaite faire la même chose, c'est à dire me connecter à une base de données Mysql sans pour autant donner le login / mot de passe aux utilisateurs de mon application
    Si vous pouviez m'éclairer sur ces points :

    I : Quelle est la meilleur ( d'après vous ) façon d'enregistrer les logins / mots de passe ( dans le code ? dans un fichier ? ... )

    II : En fonction de la réponse précédente, quelle serait la meilleur méthode pour protéger ces données, en sachant que l'application est portable (linux / windows)

    Merci à vous

  14. #14
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Pour chiffrer un mot de passe il faut un mot de passe.

    Stocker un mot de passe dans le code source n'est pas une bonne idée. Dans un fichier quelconque non plus.

    Quoi qu'il arrive tu devras faire saisir un mot de passe à ton utilisateur. Sinon il faudra utiliser des certificats X.509 avec une clef privée dans un magasin de clef mais là aussi il te faudra un mot de passe pour accéder au magasin.

    Bref, ça tourne en rond ^^

  15. #15
    Membre actif
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Points : 215
    Points
    215
    Par défaut
    Une chose que je n'ai pas saisie..

    On parle de crypter ou décrypter le mot de passe mais s'il faut le crypter, ça signifie qu'il doit apparaître en clair..
    Alors comment bien crypter (ou "chiffrer") le mot de passe de connexion sans qu'il ne soit jamais visible?

    En PHP il suffisait de mettre le code déjà crypté dans le fichier .htaccess et hop on ne voyait jamais le mdp..

    Comment faire en java pour se connecter donc à Oracle sans login ? (si un login est exigé la question ne se pose pas)

  16. #16
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    En passant par une appli serveur qui elle connait les pass pour l access a la base. Perso qd un client se connecte a mon appli serveur et est reconnu je lui attribu une session (generalement un truc bien aleatoire) et je lui renvoi renvoi juste son identifiant de session et a chaque qui essai de se connecter a la BDD je verifie que ca session est connue, ainsi mon client ne connais aucun mot de passe "system" mais seulement son pass perso.
    Après faut prevoir un mecanisme pour virer les sessions qd le client se deconnecte (proprement ou pas);

    Moi je fais ca a la mano, mais dois bien y avoir des outils pour faire ca.

  17. #17
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Ce bout de code permet de chiffrer ce que tu veux, avec l'algorithme que tu veux, pour peu que tu aies tout initialisé correctement.

    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
     
    public void crypt(InputStream in, OutputStream out, Cipher cipher)
            throws IOException
        {
            int blockSize = cipher.getBlockSize();
            int outputSize = cipher.getOutputSize(blockSize);
            byte[] inBytes = new byte[blockSize];
            byte[] outBytes = new byte[outputSize];
     
            int inLength = 0;
            boolean done = false;
            while(!done)
            {
                inLength = in.read(inBytes);
                if(inLength == blockSize)
                {
                    try
                    {
                        int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
                        out.write(outBytes, 0, outLength);
                    }
                    catch(ShortBufferException e)
                    {
                        e.printStackTrace();
                    }
                }
                else
                    done = true;
            }
     
            try
            {
                if(inLength > 0)
                    outBytes = cipher.doFinal(inBytes, 0, inLength);
                else
                    outBytes = cipher.doFinal();
                out.write(outBytes);
            }
            catch(IllegalBlockSizeException e)
            {
                e.printStackTrace();
            }
            catch(BadPaddingException e)
            {
                e.printStackTrace();
            }
        }
    Pour chiffrer un String, envoie-le dans un ByteArrayInputStream.

Discussions similaires

  1. Cryptage mot de passe
    Par Général03 dans le forum BSD
    Réponses: 20
    Dernier message: 15/02/2010, 08h42
  2. Cryptage mot de passe dans SQL Server 2000
    Par TheReturnOfMuton dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/02/2009, 22h43
  3. [cryptage] mot de passe en MD5
    Par afrodje dans le forum VB.NET
    Réponses: 17
    Dernier message: 11/02/2008, 15h29
  4. [Sécurité] Cryptage mot de passe
    Par elitemedia dans le forum Langage
    Réponses: 5
    Dernier message: 12/09/2006, 21h51
  5. cryptage mots de passe lors de la saisie
    Par ycef dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 14/09/2004, 13h22

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