Caríssimo IvoD,
Aprendi a encriptar um objeto pra poder responder como eu faria. Não sei nem se compila, vcs testem, tentem, mudem, e me ensinem a fazer direito depois, blz??
Primeiro, vamos supor que em algum momento anterior, vc gerou uma chave criptográfica com o código abaixo. Nós estamos fazendo um software que roda na internet (ou seja, em ambiente hostil) e queremos garantir que só o servidor sabe ler dados que são enviados para ele. Então utilizamos criptografia assimétrica (com duas chaves, igual ao PGP):
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
KeyPair pair = generator.generateKeyPair();
// salvo a chave privada num stream:
privateObjectOutputStream.writeObject(pair.getPrivate());
privateObjectOutputStream.close();
// salvo a chave pública num outro stream:
publicObjectOutputStream.writeObject(pair.getPublic());
publicObjectOutputStream.close();
Estou supondo que o stream onde vc escreve a chave é na verdade um arquivo. Sua chave privada deve ficar num cofre, de preferência, ou em algum lugar completamente sem acesso. Ou vc pode usar outros esquemas de segurança pra guardar a chave, por exemplo, salvá-la num banco de dados em uma tabela protegida usando serialização.
Daí vc tem como encriptar os dados. Os clientes vão ter acesso à chave pública, que vai ficar num website, ou mesmo no client.jar, sei lah, desde que eles tenham como acessá-la.
Aí que funciona a criptografia de verdade. Quando um cara vai enviar dados para o servidor, ele os encripta com a chave pública:
// inicialização da chave, que vc só precisa fazer uma vez:
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
// encryptaremos "myObject", que implementa java.io.Serializable, e a seguir o enviaremos pelo OutputStream os:
CypherOutputStream cos = new CypherOutputStream(os, cipher);
ObjectOutputStream oos = new ObjectOutputStream(cos);
oos.writeObject(myObject);
Do outro lado, o cara vai usar a chave privada (a do cofre), e vai fazer o caminho inverso:
// inicialização da chave, que vc só precisa fazer uma vez:
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
// queremos ler o objeto do InputStream is, que eu não sei de onde veio:
CypherInputStream cis = new CypherInputStream(is, cipher);
ObjectInputStream ois = new ObjectInputStream(cis);
myObject = (MyObject) ois.readObject();
Pelo que eu entendi, é assim que funciona. Existem diversos mecanismos de criptografia, e é difícil determinar qual é o mais adequado. Mas eu não vejo como o código acima precisaria de proteção, nem o que o fato de ele ser público (afinal, todo mundo tá lendo) diminui a confiança que eu poderia depositar nele.
[]s!