2017-06-09 1 views
0

Je objet serializable:crypter et sérialiser par une --- désérialiser et décrypter par un autre

import java.io.Serializable; 

public class ConfigObject implements Serializable{ 

private String url; 
private String user; 
private String pass; 

public String getUrl() { 
    return url; 
} 

public void setUrl(String url) { 
    this.url = url; 
} 

public String getUser() { 
    return user; 
} 

public void setUser(String user) { 
    this.user = user; 
} 

public String getPass() { 
    return pass; 
} 

public void setPass(String pass) { 
    this.pass = pass; 
}   
} 

et 2 Méthode de la classe SerializableEncryptDecrypt:

public static void encrypt(Serializable object, OutputStream ostream, byte[] keyy, String transformationnn) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { 
     try { 
      // Length is 16 byte 
      SecretKeySpec sks = new SecretKeySpec(keyy, transformationnn); 

      // Create cipher 
      Cipher cipher = Cipher.getInstance(transformationnn); 
      cipher.init(Cipher.ENCRYPT_MODE, sks); 
      SealedObject sealedObject = new SealedObject(object, cipher); 

      // Wrap the output stream 
      CipherOutputStream cos = new CipherOutputStream(ostream, cipher); 
      ObjectOutputStream outputStream = new ObjectOutputStream(cos); 
      outputStream.writeObject(sealedObject); 
      outputStream.close(); 
     } catch (IllegalBlockSizeException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static Object decrypt(InputStream istream, byte[] keyy, String transformationnn) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { 
     SecretKeySpec sks = new SecretKeySpec(keyy, transformationnn); 
     Cipher cipher = Cipher.getInstance(transformationnn); 
     cipher.init(Cipher.DECRYPT_MODE, sks); 

     CipherInputStream cipherInputStream = new CipherInputStream(istream, cipher); 
     ObjectInputStream inputStream = new ObjectInputStream(cipherInputStream); 
     SealedObject sealedObject; 
     try { 
      sealedObject = (SealedObject) inputStream.readObject(); 
      return sealedObject.getObject(cipher); 
     } catch (ClassNotFoundException | IllegalBlockSizeException | BadPaddingException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

j'ai fait 2 logiciels (soft1 et soft2) qui utilisent cette classe (SerializableEncryptDecrypt). Ces logiciels chiffrent et sérialisent les données d'entrée (les mêmes données d'entrée). quand je compare les données de sortie avec l'entrée que je donne est des données totalement différentes. Mais j'ai besoin des mêmes données de sortie.

merci d'avance pour votre aide.

+0

Veuillez formater votre code correctement. – Badda

Répondre

0

C'est une bonne pratique de randomiser le cryptage en utilisant du sel (nonce, IV, ...) donc même si vous cryptez avec les mêmes valeurs avec la même clé, vous pouvez (et devriez) obtenir une sortie différente. Avoir le même résultat réduit la sécurité dans certains cas.

Je ne peux pas en être sûr, mais je parie que c'est ce que fait le "SealedObject". Si vous avez vraiment besoin de "la même sortie", vous pouvez sérialiser directement l'objet (sans utiliser SealedObject). Mais alors - vous êtes responsable de stocker le sel, l'étiquette d'authentification, etc.

S'il vous plaît noter - si vous utilisez ce code dans un projet réel, vous ne devriez pas stocker les mots de passe (même cryptés), seulement leur salé hachages cryptographiques si nécessaire.