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

Développement Web en Java Discussion :

Cryptage du mot de passe – votre avis SVP!


Sujet :

Développement Web en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut Cryptage du mot de passe – votre avis SVP!
    Bonjour à tous,

    Pour mon application web de fin d'études (dont l'URL est disponible exclusivement en https) j'ai utilisé le cryptage du mot de passe de l'utilisateur en suivant les indications disponibles ici

    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
    public boolean authenticate(String attemptedPassword, byte[] encryptedPassword, byte[] salt)
                throws NoSuchAlgorithmException, InvalidKeySpecException {
            // Encrypt the clear-text password using the same salt that was used to
            // encrypt the original password
            byte[] encryptedAttemptedPassword = getEncryptedPassword(attemptedPassword, salt);
     
            // Authentication succeeds if encrypted password that the user entered
            // is equal to the stored hash
            return Arrays.equals(encryptedPassword, encryptedAttemptedPassword);
        }
     
        public byte[] getEncryptedPassword(String password, byte[] salt)
                throws NoSuchAlgorithmException, InvalidKeySpecException {
            // PBKDF2 with SHA-1 as the hashing algorithm. Note that the NIST
            // specifically names SHA-1 as an acceptable hashing algorithm for PBKDF2
            String algorithm = "PBKDF2WithHmacSHA1";
            // SHA-1 generates 160 bit hashes, so that's what makes sense here
            int derivedKeyLength = 160;
            // Pick an iteration count that works for you. The NIST recommends at
            // least 1,000 iterations:
            // http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf
            // iOS 4.x reportedly uses 10,000:
            // http://blog.crackpassword.com/2010/09/smartphone-forensics-cracking-blackberry-backup-passwords/
            int iterations = 20000;
     
            KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, derivedKeyLength);
            SecretKeyFactory f = SecretKeyFactory.getInstance(algorithm);
     
            return f.generateSecret(spec).getEncoded();
        }
     
        public byte[] generateSalt() throws NoSuchAlgorithmException {
            // VERY important to use SecureRandom instead of just Random
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
     
            // Generate a 8 byte (64 bit) salt as recommended by RSA PKCS5
            byte[] salt = new byte[8];
            random.nextBytes(salt);
     
            return salt;
        }
    Vue qu'il m'a été impossible de récupérer les tableaux de byte de la base de données PostgreSQL, dans la classe où ces méthodes sont appelées j'ai fait des conversions pour pouvoir stoker les valeurs en chaînes de caractères et les récupérer en binaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static String toHexString(byte[] array) {
            return DatatypeConverter.printHexBinary(array);
        }
     
        public static byte[] toByteArray(String s) {
            return DatatypeConverter.parseHexBinary(s);
        }
    Je voudrais améliorer cette fonctionnalité pour l'application que je suis en train de développer mais en regardant sur Internet (sujets datant de moins d'un an) je trouve des avis assez différents, en commençant par ceux qui proposent d'utiliser des API et / ou des librairies pour faire le cryptage jusqu'à ceux qui disent que même MD5 reste un algorithme de hachage acceptable si l'on l'applique plusieurs fois sur la séquence de byte.

    Aucune vente via l'application n'est prévue, il n'y a pas de numéro de carte bancaire stocké. Le salt me serait utile pour crypter autre valeur concernant l'utilisateur et envoyer cette valeur cryptée par mail dans un bouton qui confirme l'enregistrement sur le site. L'URL sera disponible uniquement en https. Ce n'est pas le site d'une banque mais les données des utilisateurs doivent bien sûr être protégées de la meilleure façon.

    Si vous pourriez me donner votre avis... Merci par avance!

  2. #2
    Membre éclairé Avatar de spring.time
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 294
    Par défaut
    Bonjour Mishulyna,
    je n'ai pas encore d'expériences sur ce genre de situation
    mais moi aussi, je cherche à sécuriser les données de l'application que je vais développer, est ce que vous pourriez me faire bénéficier de votre retour d'expérience ?
    comment utiliser le https avec l'application, je parle de la configuration ?
    la base de données que tu utilises est PostgreSQL, pourquoi précisément ce type et non Mysql? parce que je suis en train de voir quel SGBD me serait utile pour une centaines connexions simultanées de la future BD.
    et excuse moi de t'avoir dérangé

  3. #3
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Bonjour spring.time,

    En fait, comme il s'agissait d'un travail de fin d'études: nous devions utiliser les technologies enseignées. D'où mon "choix" d'utiliser PostgreSQL et le serveur GlassFish qui offre la possibilité de lancer l'application via une URL sécurisée. En Java 6 ça fonctionnait avec des certificats auto-signés, je ne pense pas que ce soit encore possible avec Java 7.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 174
    Par défaut
    J'ai déjà fait, dans le cadre de mes études, des projets où je hashais le mot de passe en MD5 et en SHA1 (avec des fonctions trouvées sur Internet mais tu peux aussi appeler directement les fonctions du SGBD) mais le MD5 est je pense dépassé, surtout qu'il y a des outils qui peuvent retrouver n'importe quel mot de passe hashé en MD5 en 24h max avec un PC puissant.

    Pour le SHA1, c'était déjà plus long quand je m'étais renseigné (je n'avais pas compris pourquoi d'ailleurs car ce sont des outils qui à priori essayent toutes les chaines jusqu'à trouver la bonne en les cryptant puis en comparant le résultat même si je pense qu'il y a des algos qui optimisent la recherche...).

    Après j'ai déjà fais un site internet en PHP pour une société et j'avais utilisé le SHA1 mais avec ajout de caractères en début et en fin pour "dissimuler" le mot de passe original. Comme ca, même si un hacker accède à la BD, récupère le mot de passe chiffré et arrive à le déchiffrer, alors il n'aura quand même pas le bon mot de passe. On pourrait même imaginer d'ajouter des caractères avant et après le hashage (ce qui pourrait empêcher au hacker d'identifier facilement le type de hashage utilisé mais aussi le "véritable" hash). Le seul moyen de savoir quel est le mot de passe initial serait alors d'accéder au code source PHP (sur le serveur donc).

  5. #5
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Bonjour philou44300,

    Merci beaucoup de ta réponse! Désolée pour le retard mais j'étais toujours en train de creuser...
    J'ai trouvé plein d'explications, conseils, liens et exemples intéressant(e)s sur crackstation.net, je pense disposer de toute l'information nécessaire pour arriver à mes fins.

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

Discussions similaires

  1. cryptage de mot de passe
    Par chti_juanito dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 07/02/2006, 23h29
  2. Oracle 9i - Cryptage de mots de passe sous sql
    Par momo9237 dans le forum Oracle
    Réponses: 2
    Dernier message: 04/01/2006, 11h11
  3. [VB.NET] cryptage de mot de passe.
    Par leSeb dans le forum Windows Forms
    Réponses: 16
    Dernier message: 28/05/2005, 14h06
  4. [cryptage] cryptage de mot de passe
    Par LoLoSS dans le forum Sécurité
    Réponses: 5
    Dernier message: 11/05/2004, 12h04

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