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 :

Champ d'un SealedObject mal décrypté, que faire ?


Sujet :

Sécurité Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut Champ d'un SealedObject mal décrypté, que faire ?
    Bonjour

    J'ai un petit problème dans une application qui charge des données dans un fichier (objet sérialisé) crypté à l'aide d'un SealedObject.

    En effet, si certain champ de mon objet ainsi recréé sont bien décryptés, d'autre ne le sont pas, et je ne comprend pas pourquoi.
    J'ai par exemple une HashMap contenant des identifiants à une BDD : le mot de passe est mal décrypté, voici ce que donne un affichage des données de ma HashMap (qui est un champ de mon objet sérialisé):

    {mdp=[C@1dfc8a0, login=root, url=jdbc:mysql://localhost/test}

    Le test étant effectué en local mdp devrait ne rien afficher comme valeur. Je ne comprend vraiment pas d'où ça vient d'autant que le reste des champs à l'air d'être bien décrypté.

    Voici le bout de code concerné (entre autre) :
    Stockage de l'objet :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Cipher c = Cipher.getInstance("Blowfish");
    c.init(Cipher.ENCRYPT_MODE, sKey);
    so = new SealedObject(g,c);//g est une instance d'un objet Guilde
    //[...]
    FileOutputStream fos = new FileOutputStream(guilde);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(so);
    oos.flush();
    oos.close();

    Lecture de l'objet
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    KeyStore ks = KeyStore.getInstance("JCEKS", "SunJCE");
    FileInputStream fKey = new FileInputStream(".keystore");
    ks.load(fKey, password);
    fKey.close();
    Guilde myGuild = (Guilde) so.getObject(ks.getKey("xxx", password));

    Merci d'avance pour votre aide !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    J'essaye de résoudre le problème en décryptant ensuite le champ qui pose problème à l'aide d'un objet Cypher, mais j'ai une javax.crypto.BadPaddingException: Given final block not properly padded.
    J'ai du mal avec cette classe, voici le code avec des essais pour faire en sorte que mon tableau de byte convienne à mOssieur Cipher xD :
    Code java : 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
    Cipher c = Cipher.getInstance("Blowfish", "SunJCE");
     
    			c.init(Cipher.DECRYPT_MODE, ks.getKey("xxx", password), c.getParameters());
     
    			//Lignes de test
     
     
    			byte[] test = myGuild.getIdentifiants().get("mdp").getBytes() ;
    			byte [] tampon = new byte[test.length*8];//pour que le tableau à décrypté soit bien un multiple de 8, mais je doute que ce soit très propre ><
    			int i;
    			for(i = 0; i < test.length; i++){
    				tampon[i] = test[i];
    			}
    			for(i = i; i < tampon.length; i++){
    				tampon[i] = 0x1;
    			}
    			byte [] testFinal = new byte[c.getOutputSize(tampon.length)];
     
    			System.out.println(c.doFinal(tampon, 0, tampon.length, testFinal, 0));//C'est cette ligne qui propage l'exception donc
    			//Fin lignes de test

  3. #3
    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
    Si t'envoie l'objet guilde sans l'encapsuler dans un sealedobject, çà marche??

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Bah euh, le but c'est que l'objet soit crypté, donc il faut qu'il soit encapsulé dans le SealedObject. J'étais content quand j'avais découvert cette classe d'ailleurs car ça m'épargnait d'utiliser la classe Cipher moi-même...

  5. #5
    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
    JE veux juste savoir si le sealedobject foire ou si c'est ta classe guilde qui foire à la sérialization

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Aaah ok, désolé j'avais pas capté ^^. Non aucun problème avec la classe Guilde, je l'utilisais avant sans cryptage pour tester mon programme et ça fonctionnait bien.

  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
    et si pour décoder tu fais çà?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Cipher c = Cipher.getInstance("Blowfish");
    c.init(Cipher.ENCRYPT_MODE, sKey);
    Guilde myGuild = (Guilde) so.getObject(c);
    Sinon, ton champs mdp, on dirait qu'il correspond en fait à un array de charactère, çà donne quoi quand tu l'affiche? genre System.out.println(new String((char[])map.get("mdp"))); ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    La première méthode ne fonctionne pas (j'ai mis DECRYPT à la place d'ENCRYPT sinon ça faisait une erreur), le champ est toujours mal décrypté.

    Pour la deuxième, ça me dit qu'il est impossible de convertir un String en tableau de char.

    Edit : Le champ mal décrypté (mdp) est de type String, car contenu dans une HashMap<String,String>
    Edit²: Si j'utilise toCharArray() au lieu d'un cast, ça ne change rien, le champ est toujours mal décrypté.

  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
    on pourrais voir le code de guilde? Parce que sealedobject foire, ok, mais sur un seul champ et sans altérer le décodage des autres champs, c'est curieux...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Sans problème ! Ce n'est pas une classe très complexe, quelques champs, deux constructeurs, ensuite rien que des getters et des setters. (je précise pour ce qui est de la date de création que c'est une vieille classe que j'ai entièrement refaite ^^')

    Code java : 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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     /*
     * Créé le 30 août 2007 
     * à 16:45:38
     * IDE utilisé: Eclipse
     */
    package com.bartimeus.sgl;
     
    import java.io.Serializable;
    import java.util.HashMap;
     
     
    /**
     * @author Bartimeus
     * @version Alpha
     * 
     *
     */
    public class Guilde implements Serializable{
     
    	private static final long serialVersionUID = 101199225081992L;
    	private String nom;
    	private String adresseLogo;
    	private HashMap<String, String> identifiants;
    	private int typeConnexion;
    	private String [] args; //Contient les informations spécifiques à la requête si besoin (par exemple un ID de forum)
     
    	public Guilde(){
    		super();
    	}
     
    	public Guilde(String nom,  String adresse, HashMap<String,String> idConn, int req, String [] arg){
    		this.nom = nom; this.adresseLogo = adresse; 
    		this.identifiants = idConn; this.typeConnexion = req; this.args = arg; 
    	}
     
     
     
    	/**
             * @return Renvoie adresseLogo.
             */
    	public String getAdresseLogo() {
    		return adresseLogo;
    	}
     
     
    	/**
             * @return Renvoie nom.
             */
    	public String getNom() {
    		return nom;
    	}
     
    	/**
             * @return Renvoie args.
             */
    	public String[] getArgs() {
    		return args;
    	}
     
    	/**
             * @return Renvoie identifiants.
             */
    	public HashMap<String, String> getIdentifiants() {
    		return identifiants;
    	}
     
    	/**
             * @return Renvoie typeConnexion.
             */
    	public int getTypeConnexion() {
    		return typeConnexion;
    	}
     
     
    	/**
             * @param adresseLogo adresseLogo à définir.
             */
    	public void setAdresseLogo(String adresseLogo) {
    		this.adresseLogo = adresseLogo;
    	}
     
    	/**
             * @param args args à définir.
             */
    	public void setArgs(String[] args) {
    		this.args = args;
    	}
     
     
    	/**
             * @param identifiants identifiants à définir.
             */
    	public void setIdentifiants(HashMap<String, String> identifiants) {
    		this.identifiants = identifiants;
    	}
     
     
    	/**
             * @param nom nom à définir.
             */
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	/**
             * @param requete typeConnexion à définir.
             */
    	public void setTypeConnexion(int requete) {
    		this.typeConnexion = requete;
    	}
     
    }

    Le code de la classe GuildeFactory qui est en fait une classe Singleton qui gère les objets Guilde est peut-être aussi utile, je le met on sait jamais.
    Code java : 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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    /*
     * Créé le 20 juin 2008 
     * à 16:28:12
     * IDE utilisé: Eclipse
     */
    package com.bartimeus.sgl;
     
    import java.util.HashMap;
     
    /*Charge un fichier de configuration (objet Guilde crypté sérialisé) contenant :
     * -identifiants de connexion à la BDD
     * -type de connexion souhaité
     * -informations spécifiques à la requête, dépendant du type de connexion (ex: id du forum contenant les news)
     * -nom de la guilde
     * 
     */
    public class GuildeFactory {
     
     
    	private static GuildeFactory instance = new GuildeFactory();
    	private Guilde myGuild;
     
    	private GuildeFactory(){
     
    		if(GestionFichiers.isGuilde()){
    			loadGuilde();
    		}
     
    		else {
    			setGuilde();
    		}
    	}
     
    	public static GuildeFactory getInstance(){
    		return instance;
    	}
     
    	public Guilde getGuilde(){
    		return myGuild;
    	}
     
    	//Cette méthode est appelée quand le fichier guilde.dat existe déjà
    	private void loadGuilde(){
    		myGuild = GestionFichiers.ouvrirGuilde();
    	}
     
    	//Méthode appelée lorsque le fichier guilde.dat n'existe pas
    	private void setGuilde(){
     
    		//Fichier guilde créé par défaut avec valeurs par défaut
    			HashMap<String,String> id = new HashMap<String,String>();
    			id.put("url", "localhost/test" );
    			id.put("login", "root");
    			id.put("mdp", "");
     
    			String [] argu = new String[1];
    			myGuild = new Guilde("SGL", "file:///f:/Javprogrammes/" +
    					"Eclipse%20Workspace/Spellborn%20Guild%20Launcher/imageTest.jpg",id, 1, argu );
    			GestionFichiers.enregistrerGuilde(myGuild);
    	}	
     
    	public void setGuilde(String nom, int methodeConn, HashMap<String,String> identifiants, String adresseLogo, 
    			String [] arg){
    		myGuild = new Guilde(nom, adresseLogo,identifiants, methodeConn, arg);
    		GestionFichiers.enregistrerGuilde(myGuild);
    	}
     
    }

    Edit: Le champ mot de passe est en effet de base un char[] car il est extrait d'un JPasswordField. Au moment de son stockage dans la HashMap, je le convertit en chaine de caractère avec la méthode toString(), le problème viendrait de là ?
    Edit²: Ça venait de là ! Je suis un boulet, c'est pas toString() qu'il faut utiliser ><, j'ai donc utiliser le constructeur new String(char[]) et ça fonctionne ! Merci de ton aide tchize, tu m'as mis sur la piste en me parlant du tableau de caractère. T'imagines pas mon soulagement, ça faisait des heures que je bloquais là dessus, encore merci !!

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

Discussions similaires

  1. Les PC sont de plus en plus bruyants que faire
    Par plichtal dans le forum Ordinateurs
    Réponses: 260
    Dernier message: 23/12/2011, 12h28
  2. Mal payer - Que faire ?
    Par palyx dans le forum Salaires
    Réponses: 21
    Dernier message: 06/10/2009, 12h52
  3. [DirectDraw] Que faire pour optimiser le rendu ???
    Par mat.M dans le forum DirectX
    Réponses: 8
    Dernier message: 12/12/2003, 18h02
  4. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39

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