2010-04-01 5 views
1

J'essaie d'utiliser la méthode javax.crypto.Cipher.doFinal (byte []) pour crypter un objet. Mais, pour des raisons de sécurité, l'objet ne peut pas être sérialisé. Alors, comment convertir l'objet en tableau d'octets sans sérialisation?Comment convertir un objet non sérialisable en tableau d'octets?

--update

utilise sérialisation la seule façon d'utiliser cette méthode Cipher? Parce que, comme je le sais, les données importantes ne devraient pas être sérialisables.

+1

Et je suppose tout aussi important ... le convertir à nouveau. –

+1

Vous voulez sérialiser un objet dont "Pour des raisons de sécurité, l'objet ne peut pas être sérialisable" Saviez-vous que sérialisable est utilisé pour convertir l'objet en octet []? –

+0

@Peter Lawrey s'il vous plaît, voir ma mise à jour –

Répondre

0

Résolvez, au lieu d'utiliser un getByteArray() pour appeler Cipher.doFinal(), j'utiliser Cipher.doFinal() dans la classe, avec une méthode getEncryptedByteArray(); donc je sérialise les données dans la classe sans rendre la classe elle-même sérialisable, et le résultat de retour sera crypté. Toute objection à cette approche sera considérée .. :)

0

Vous venez de sérialiser chacun de ses composants. Recurse. Finalement, vous finissez avec des objets natifs que vous pouvez sérialiser. Si vous implémentez cela en implémentant les méthodes de sérialisation de java, java s'assurera que vous ne sérialiserez aucun objet deux fois et prendra soin des références pour vous.

En résumé, rendez l'objet sérialisable.

+0

même que la réponse @Randy Simon, voir les commentaires –

+0

s'il vous plaît, voir ma mise à jour –

0

Voici un exemple simple de sérialisation d'une classe en un tableau d'octets.

public Class Foo { 

    private boolean isHappy; 
    private short happyCount; 
    private Bar bar; 

    public byte[] serializeData() throws IOException 
    { 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     DataOutputStream out = new DataOutputStream(stream); 

     out.writeBoolean(isHappy); 
     out.writeShort(slope); 

     // Serialize bar which will just append to this byte stream 
     bar.doSerializeData(out); 

     // Return the serialized object. 
     byte[] data = stream.toByteArray(); 

     // Clean up. 
     stream.close(); 

     return data; 
    } 
} 

Bien sûr, beaucoup de détails dans votre cas dépendent de la structure de votre classe, mais nous espérons que cela vous obtient pointé dans la bonne direction.

Pour désérialiser vous avez juste besoin d'inverser ce qui précède.

+2

Les mêmes considérations de sécurité qui ont dicté que la classe ne devrait pas être sérialisable devraient dicter que cette méthode ne soit pas écrite. – EJP

+0

s'il vous plaît, voir ma mise à jour –

-1

java.beans.XMLEncoder/Décodeur.

+0

absolument pas sécurisé –

+0

Bien sûr. Rien que tu puisses faire à ce sujet. Il existe que vous le vouliez ou non, donc la classe en question n'est pas sûre si elle est XMLEncodable. Ce dont je pense que vous avez besoin est une méthode * dans la classe * qui fournit un objet SealedObject et qui utilise des données de membre privées pour le construire. – EJP

Questions connexes