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 :

Question sur le chiffrement/dechiffrement


Sujet :

Sécurité Java

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 104
    Points
    104
    Par défaut Question sur le chiffrement/dechiffrement
    Bonjour à tous

    je souhaite envoyez un mot de passe d'une application cliente jusqu'à mon serveur

    pour sécuriser le tout,j'envoie les donnée par SSL,

    première question, si je récupère un password sous forme de String, est ce que le fait de transférer ce password du post client au serveur est suffisant niveau sécurité en utilisant SSL ? c'est à dire, est ce que quelqu'un pourrai entre le client et le serveur récupérer ce mot de passe ?


    sinon une autre solution, ou pourquoi pas combiner les deux, serait de passer par un couple clé privée/clé publique

    mon application cliente chiffre avec la clé publique et mon serveur déchiffre avec sa clé privé.

    donc les autres question sont :

    1) est ce que l'une ou l'autre solution se suffisent à elle même pour transporter les donnée de manière sécurisé ?

    2) la quelle des deux solution est la meilleurs ?

    3) vaut-il mieux combiner les deux solution pour un maximum de sécurité ou est-ce inutile ?

    ------------

    dans le même sujet, pour chiffrer/déchiffrer j'ai trouvé ce bout de code

    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
     
     /* -------------------------------------Cryptage-------------------------------------------------*/
     
     public MessageCrypteImpl crypterMessage(MessageImpl message) {
      /* transformation de la chaine en tableau d'Octets */
      byte[] msgEnOctets = message.getContenu().getBytes();
     
      /* ajoute un octet codant le "1" au début du tableau passé en parametres */
      byte[] resultat = new byte[msgEnOctets.length+1];
      resultat[0] = 1;
      for (int i = 0; i < msgEnOctets.length; i++) {
       resultat[i+1] = msgEnOctets[i];
      }
     
      /* transforme le résultat en BigInteger */
      BigInteger msgEnBigInteger = new BigInteger(resultat);
     
      /* crypte le message par la méthode RSA grace a la clef publique (cela renvoi un BigInteger) */
      BigInteger msgCrypte = msgEnBigInteger.modPow(clefPublique.getPublicExponent(), clefPublique.getModulus());
     
      /* on retourne le message crypté sous la forme d'un tableau d'octets */
      return new MessageCrypteImpl(msgCrypte.toByteArray(), null);
     }
     
     
     
     
     
     /* -------------------------------------Décryptage-------------------------------------------------*/
     
     
     
     public MessageImpl decrypterMessage(MessageCrypteImpl messageCrypte) {
      /* On repasse le tableau d'octets en BigInteger pour pouvoir le décrypter */
      BigInteger msgADecrypteEnBigInt = new BigInteger(messageCrypte.getContenuCrypte());
     
      /* on décrypte le message grace au RSA et a la clef privée */
      BigInteger msgDecrypteEnBigInt = msgADecrypteEnBigInt.modPow(clefPrivee.getPrivateExponent(), clefPrivee.getModulus());
     
      /* on repasse le message en octets pour pouvoir retirer l'octet qu'on lui avait ajouté */
      byte[] msgDecrypteEnOctets = msgDecrypteEnBigInt.toByteArray();
     
      /* on lui retire son octet en plus */
      byte[] resultat = new byte[msgDecrypteEnOctets.length-1];
      for (int i = 0; i < resultat.length; i++) {
       resultat[i] = msgDecrypteEnOctets[i+1];
      }
     
      /* on retourne une chaine de charactères qui provient du tableau d'octets transformé */
      return new MessageImpl (new String (resultat),null);
     }
    en le remaniant à ma sauce, il fonctionne très bien.

    par contre je me demandais à quoi servait le bout de code qui rajoute un octet dans le tableau, est ce vraiment necessaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     /* ajoute un octet codant le "1" au début du tableau passé en parametres */
    #  byte[] resultat = new byte[msgEnOctets.length+1];
    #  resultat[0] = 1;
    #  for (int i = 0; i < msgEnOctets.length; i++) {
    #   resultat[i+1] = msgEnOctets[i];
    #  }
    merci d'avance pour vos réponses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par deglingo592003 Voir le message
    Bonjour à tous

    je souhaite envoyez un mot de passe d'une application cliente jusqu'à mon serveur

    pour sécuriser le tout,j'envoie les donnée par SSL,

    première question, si je récupère un password sous forme de String, est ce que le fait de transférer ce password du post client au serveur est suffisant niveau sécurité en utilisant SSL ? c'est à dire, est ce que quelqu'un pourrai entre le client et le serveur récupérer ce mot de passe ?
    Ben si le protocole SSL est fiable, non Tout dépend aussi de la méthode d'envoi : POST OU GET ? Avec POST, le contenu est crypté avant l'envoi au server et décrypté par le server, donc pas de problème. Avec GET, les arguments sont dans l'URL, qui n'est pas chiffrée, donc à proscrire.

    Citation Envoyé par deglingo592003 Voir le message
    sinon une autre solution, ou pourquoi pas combiner les deux, serait de passer par un couple clé privée/clé publique

    mon application cliente chiffre avec la clé publique et mon serveur déchiffre avec sa clé privé.
    N'est-ce pas ce que fait (entre beaucoup d'autres choses, dont l'authentification, qui n'est pas à négliger) SSL ?

    Citation Envoyé par deglingo592003 Voir le message
    1) est ce que l'une ou l'autre solution se suffisent à elle même pour transporter les donnée de manière sécurisé ?
    SSL (sinon les banques l'utiliseraient pas )

    Citation Envoyé par deglingo592003 Voir le message
    2) la quelle des deux solution est la meilleurs ?
    SSL, car éprouvé, et il inclut des systèmes d'authentification du server (sinon un server pourrait se substituer au tien et enregistrer le mot de passe, éventuellement). Autant ne pas réinventer la roue, surtout si on la fait ovale plutôt que ronde.

    Citation Envoyé par deglingo592003 Voir le message
    3) vaut-il mieux combiner les deux solution pour un maximum de sécurité ou est-ce inutile ?
    Avec SSL, c'est inutile, c'est un cryptage hybride suffisamment sécurisé.

    Si tu veux voir que SSL inclut ton idée (qui n'est pas mauvaise loin de là), regarde du côté des schémas décrivant le protocole, tu verras que ça fait ce que tu veux

    A plus

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par deglingo592003 Voir le message
    dans le même sujet, pour chiffrer/déchiffrer j'ai trouvé ce bout de code

    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
     
     /* -------------------------------------Cryptage-------------------------------------------------*/
     
     public MessageCrypteImpl crypterMessage(MessageImpl message) {
      /* transformation de la chaine en tableau d'Octets */
      byte[] msgEnOctets = message.getContenu().getBytes();
     
      /* ajoute un octet codant le "1" au début du tableau passé en parametres */
      byte[] resultat = new byte[msgEnOctets.length+1];
      resultat[0] = 1;
      for (int i = 0; i < msgEnOctets.length; i++) {
       resultat[i+1] = msgEnOctets[i];
      }
     
      /* transforme le résultat en BigInteger */
      BigInteger msgEnBigInteger = new BigInteger(resultat);
     
      /* crypte le message par la méthode RSA grace a la clef publique (cela renvoi un BigInteger) */
      BigInteger msgCrypte = msgEnBigInteger.modPow(clefPublique.getPublicExponent(), clefPublique.getModulus());
     
      /* on retourne le message crypté sous la forme d'un tableau d'octets */
      return new MessageCrypteImpl(msgCrypte.toByteArray(), null);
     }
     
     
     
     
     
     /* -------------------------------------Décryptage-------------------------------------------------*/
     
     
     
     public MessageImpl decrypterMessage(MessageCrypteImpl messageCrypte) {
      /* On repasse le tableau d'octets en BigInteger pour pouvoir le décrypter */
      BigInteger msgADecrypteEnBigInt = new BigInteger(messageCrypte.getContenuCrypte());
     
      /* on décrypte le message grace au RSA et a la clef privée */
      BigInteger msgDecrypteEnBigInt = msgADecrypteEnBigInt.modPow(clefPrivee.getPrivateExponent(), clefPrivee.getModulus());
     
      /* on repasse le message en octets pour pouvoir retirer l'octet qu'on lui avait ajouté */
      byte[] msgDecrypteEnOctets = msgDecrypteEnBigInt.toByteArray();
     
      /* on lui retire son octet en plus */
      byte[] resultat = new byte[msgDecrypteEnOctets.length-1];
      for (int i = 0; i < resultat.length; i++) {
       resultat[i] = msgDecrypteEnOctets[i+1];
      }
     
      /* on retourne une chaine de charactères qui provient du tableau d'octets transformé */
      return new MessageImpl (new String (resultat),null);
     }
    en le remaniant à ma sauce, il fonctionne très bien.

    par contre je me demandais à quoi servait le bout de code qui rajoute un octet dans le tableau, est ce vraiment necessaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     /* ajoute un octet codant le "1" au début du tableau passé en parametres */
    #  byte[] resultat = new byte[msgEnOctets.length+1];
    #  resultat[0] = 1;
    #  for (int i = 0; i < msgEnOctets.length; i++) {
    #   resultat[i+1] = msgEnOctets[i];
    #  }
    merci d'avance pour vos réponses.
    Hum... ca ne ressemble pas vraiment à un padding... Serait-ce pour brouiller un peu le message ? Là je vois pas trop en fait, tu as trouvé ça où ? Ceci dit je trouve aussi dommage d'implémenter soi même RSA, C'est déjà fait en Java en utilisant JCA et un provider quelconque (Sun, BouncyCasttle, Flexiprovider, ...) tu auras une implémentation plus sûre, qui évite certaines trappes et respectent des standards, ce qui permet une interopérabilité avec d'autres systèmes au cas où tu en aies besoin

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 104
    Points
    104
    Par défaut
    En lisant tes réponse, les question me paraissent si bête que j'ai honte

    effectivement pour ssl j'ai générer au départ un couple clé privé/clé publique j'aurai mieux fait de tourner 7 foi ma langue avant de parler :p

    donc si je comprend bien un simple envoie de donnée en connectant le client et le serveur en utilisant SLL (SSLSocket et compagnie) suffiront pour garantir l'envoie des données en passant par une méthode POST

    ( par contre un gros doute il n'y a pas un problème entre POST et GET pour la taille des données a envoyer ? mais je ne sait plus la quel des deux :p enfin la c'est juste pour ma connaissance personnelle car je m'avance dans un domaine ou je ne suis pas à l'aise^^)

    Sinon pour ce qui est du bout de code, c'est ce que j'ai trouvé sur un forum par hasard (je n'ai pas garder le lien ...), mais je vais me pencher du coté de JCA même si de ce fait, si je passe par SSL je n'aurai pas besoin de réaliser cette étape (si j'ai bien comprit ^^).

    --
    Est-il possible que je poste mon code (Serveur et Client) pour voir si je n'ai pas fait de bêtise ? Je n'utilise aucune méthode post ou get (du moin pas manuellement ^^)donc la j'ai un gros doute sur mon début de code (pour le moment je lance le client et le serveur en local sur ma machine qui communique sans soucis)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Il n'y a pas de questions idiotes, t'inquiète pas
    Pour ce qui est de JCA, tu n'en a aps besoin si tu passes par les classes SSL de Java (encore que, tu l'utiliseras surement sans le savoir ), ensuite pour ta culture personnelle, tu peux bien sûr regarder comment ça marche, ça pourra peut-être te servir plus tard.

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 104
    Points
    104
    Par défaut
    Donc si je post les code suivant

    Coté serveur :

    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
     
    import javax.net.ssl.SSLServerSocket;
    import javax.net.ssl.SSLServerSocketFactory;
    import javax.net.ssl.SSLSocket;
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
     
    public
    class EchoServer {
     
        public static void main(String[] arstring) {
            try {
                SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
                SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory.createServerSocket(8080);
                SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
     
                InputStream inputstream = sslsocket.getInputStream();
                InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
                BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
     
                String string = null;
                while ((string = bufferedreader.readLine()) != null) {
                    System.out.println(string);
                    System.out.flush();
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
    }
    Puis coté client :

    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
     
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.SSLSocketFactory;
    import java.io.*;
     
    public
    class EchoClient {
        public
                static
        void
                main(String[] arstring) {
            try {
                SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
                SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 8080);
     
                InputStream inputstream = System.in;
                InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
                BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
     
                OutputStream outputstream = sslsocket.getOutputStream();
                OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
                BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);
     
                String string = null;
                while ((string = bufferedreader.readLine()) != null) {
                    bufferedwriter.write(string + '\n');
                    bufferedwriter.flush();
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
    }

    j'ai générer ma pair de clé avec l'outil keytool.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    keytool -genkey -keystore monkeystore -keyalg RSA
    je lance le serveur comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -Djavax.net.ssl.keyStore=monkeystore -Djavax.net.ssl.keyStorePassword=password EchoServer
    puis de la "même" manière je lance le client de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -Djavax.net.ssl.trustStore=monkeystore -Djavax.net.ssl.trustStorePassword=password EchoClient
    est ce que tout ce que le client envoi (avec ce code) est bien chiffré ou ai-je loupé quelque chose ?

    les donnée parte bien du client et arrive bien sur ma console coté serveur.

    je sais qu'il existe des logiciel qui écoute les flux (des sniffeur c'est ca ?) si j'arrivais à trouver un de ces logiciel je pourrai tester l'envoi de flux et bien vérifier que mes données sont chiffré ? sinon y a-t-il un autre moyen de vérifier cela ?

    merci encore pour toute ton aide

    ps: effectivement j'aurai du regarder le fonctionnement du protocol ssl, cela aurait évité certaine questions :p

    pour ceux qui cherche des information "vulgarisé" sur ssl j'ai trouvé ceci
    http://sebsauvage.net/comprendre/ssl/
    http://www.securiteinfo.com/cryptographie/ssl.shtml

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/06/2015, 22h30
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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