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 :

Passer une secretKey via socket (format byte[])


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Par défaut Passer une secretKey via socket (format byte[])
    Bonjours, je créé actuellement un serveur/client communicant par message crypté, j'ai donc un échange au début de la communication en cryptage asymétrique créant une clé secrète envoyé cryptée au serveur.
    pour crypter et décrypter j'utilise des byte[] pouvant donc crypter un peu tout mais pour une secretKey je sèche

    j'ai créé ces deux methodes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public byte[] getSecretKey() throws NoSuchAlgorithmException, InvalidKeySpecException
        {
           SecretKeyFactory desFactory = SecretKeyFactory.getInstance("DES");
           DESKeySpec spec = (DESKeySpec) desFactory.getKeySpec(secret_Key, DESKeySpec.class);
           return spec.getKey();
        }
     
     
        public void setSecret_Key(byte[] secretKey) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException {
            SecretKeyFactory skFactory = SecretKeyFactory.getInstance("DES");
            DESKeySpec sspec = new DESKeySpec(secretKey);
            secret_Key = skFactory.generateSecret(sspec);
        }
    la première cotes client pour récupérer le byte[] correspondant a ma secreteKey et l'autre cotes serveur pour recréer ma secretKey avec ce byte[] mais impossible a rendre fonctionnel
    (envoyer ma secretkey en writeObject() fonctionne parfaitement et mon cryptage asymétrique aussi donc ça ne peut venir que de la pour moi.)

    si quelqu'un a une idée sur la réalisation de: secretKey -> byte[] -> secretKey
    je suis preneur...

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    C'est peut-être un problème d'encodage des caractères. Je ne connais pas les classes que tu utilises. Tu devrais fouiller dans la documentation si tu peux récupérer l'encodage et le forcer.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Par défaut
    j'ai vu quelque part comment forcer l'encodage, je vais aller voir ça...

    en attendant j'ai tester cela:


    cotes client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Crypto c = new Crypto();
    rep.setMessage(crypt.getSecretKey());
    //reseau?
    c.setSecret_Key(rep.getMessage());
    String t = "mon test";
    c.initSym();
    byte[] dtest = crypt.doCrypt(t.getBytes());
    System.out.print("test: "+t+"  -  "+new String (dtest)+"  -  ");
    dtest = c.doDecrypt(dtest);
    System.out.println(new String(dtest));
    donc:
    -nouvelle object crypto (que j'ai créé)
    -setMessage sur un objet reponse (il contient un byte[])
    -on set la secretkey du nouvel objet crypto en utilisant l'objet rep (qui passe par le réseau normalement
    -et on test -> test: mon test - сʼn��g���DzG�9 - mon test

    j'ai aussi testé le cryptage asymétrique qui tourne parfaitement. d'ailleurs le fait de l'envoyer cryptée ou non me retourne la même erreur.
    j'ai modifié ma classe crypto tel que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public byte[] getSecretKey() throws NoSuchAlgorithmException, InvalidKeySpecException
        {
           return secret_Key.getEncoded();
        }
        public void setSecret_Key(byte[] secretKey) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException {
            secret_Key = new SecretKeySpec(secretKey, "DES");
        }
    donc localement ça tourne, entre le client et le serveur je peux communiquer en asymétrique mais lorsque j'envoie la secretkey le serveur n'arrive plus a refaire la sienne... (badpadding lors d'un dofinal() en decrypt)

    je comprends plus d'ou peu venir l'erreur... (le serveur et le client tournent sur le même sdk (même machine)).
    je rearde cotés encoding...

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Bonjour,

    BadPadding, tu utilises RSA pour echanger ta clé secrète ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
    en asymétrique et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    encrypt = Cipher.getInstance("DES/ECB/PKCS5Padding", "BC");
    en symétrique, pourquoi?

    -------------------
    j'avance...
    je fais cotès client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rep.setMessage(crypt.doCrypt(crypt.getSecretKey(),pk));
    oos.writeObject(rep);
    //test
    rep.setMessage(crypt.doCrypt((alias+": handshake reussi").getBytes()));
    oos.writeObject(rep);
    pk étant la clé public du serveur.

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    reponse = (REPONSE_HURESP) ois.readObject();
    //decrypt de la cle
    reponse.setMessage(cript.doDecrypt(reponse.getMessage(),cript.getPrivate_Key()));
    cript.setSecret_Key(reponse.getMessage());
    cript.initSym();
    //test
    reponse = (REPONSE_HURESP) ois.readObject();
    reponse.setMessage(cript.doDecrypt(reponse.getMessage()));
    je reçoit la bonne chaine crypté pour la clé et j'arrive a la recréer cotes serveur (aucune exception en tout cas et le byte[] est bien celui récupérer cotes client)
    par contre le second readObject me retourne une chaine qui ne correspond pas à ce que je lui ai passer cotes client :/
    la chaine n'étant pas bonne j'obtiens un badpadding au décryptage.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Donc tu crytpes ta clé DES avec RSA et tu utilises un padding PKCS1Padding.
    Tu envoies le resultat au serveur.

    Il décrypte comment ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Par défaut
    initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Security.addProvider(new BouncyCastleProvider());
    if(cipher == null)
    cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
    decrypt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public byte[] doDecrypt(byte[] mess, Key cle) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException
        {
            cipher.init(Cipher.DECRYPT_MODE, cle);
            return cipher.doFinal(mess);
        }
    cle étant dans ce cas la clé privé (voir message précèdent pour l'appel: reponse.setMessage(cript.doDecrypt(reponse.getMessage(),cript.getPrivate_Key())); )

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Oui décrypter avec la clé public RSA c'est pas très malin.

    Donc visiblement c'est plus un problème de transmission de donnée par write et read object, essai de tout passer en Byte[].

  9. #9
    Membre confirmé
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Par défaut
    j'ai trouvé...
    dans mon objet reponse j'avais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public final void setMessage(byte[] message) {
            this.message = message;
        }
    au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public final void setMessage(byte[] message) {
            this.message = new byte[message.length];
            this.message = message;
        }
    et je faisais un setMessage("teetezetzet".getBytes())
    donc référence temporaire... tout roule maintenant... merci pour ton aide

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    De rien,

    méfie toi du padding, c'est pas si annodin, les grands gourou de BouncyCastle disent qu'il faut mieux utiliser le padding OAEP.
    C'est pas pour rien.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Salut,

    Je sais que le sujet est résolu mais j'ai une question : y-a-t-il une raison particulière qui fait que tu codes tout ça à la main alors que c'est plus ou moins ce que fait ssl (et c'est pas très dur de faire une connexion ssl en java...) ? Il est en général une meilleure idée de ne pas développer des solutions maison en sécurité, pour plusieurs raisons :
    • c'est très souvent pas si sûr qu'on le croit, il ne suffit pas d'utiliser un algo sûr pour que le système soit sûr...
    • ça brise une compatibilité future éventuelle avec d'autres servers non maison
    • on réinvente la roue, et on la fait plutôt ovale que ronde...


    Sinon pour la solution je ne comprends pas ce que la première ligne change... Tu es sûr que tu n'as rien changé ailleurs ?

    A plus

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

Discussions similaires

  1. Passer une variable via getJSON
    Par Miyukaze dans le forum jQuery
    Réponses: 1
    Dernier message: 18/06/2012, 22h17
  2. Passer une variable via un lien
    Par alexxxx69 dans le forum ASP.NET MVC
    Réponses: 4
    Dernier message: 18/10/2011, 12h11
  3. Transmission d'une ArrayList via Socket
    Par Illuminati dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 26/11/2010, 14h44
  4. Envoi d'une structure via sockets
    Par milanoran dans le forum C++
    Réponses: 8
    Dernier message: 17/11/2010, 14h19
  5. PHP Passer une variable via une liste deroulante
    Par lepierre dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2006, 12h09

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