J'ai un pool d'objets d'aide de cryptage immuables qui contiennent des instances de la java JCA Cipher et objets MessageDigest:Ce thread de code crypto est-il sécurisé?
AlgorithmInstance(Cipher encCipher, Cipher decCipher, MessageDigest digest) { ... }
private BlockingQueue<AlgorithmInstance> pool = new ArrayBlockingQueue<AlgorithmInstance>(poolSize);
Divers fils dans mon application, le cryptage ou le décryptage besoin, composer des objets AlgorithmInstance en accédant à une piscine. Chaque thread les utilise pour chiffrer ou déchiffrer, puis les renvoie dans le pool lorsqu'ils sont terminés. Les threads ne se synchronisent sur aucun objet JCA car il n'y a pas d'accès simultané. Decrypt fonctionne à peu près de la même manière.
public byte[] encryptMessage(byte data[]) { ...
try {
AlgorithmInstance inst = pool.take();
inst.digest.reset();
byte[] digest = inst.digest.digest(message);
inst.encryptCipher.init(Cipher.ENCRYPT_MODE, m_currentKey, ivParams);
inst.encryptCipher.doFinal(messageBuffer);
}
finally {
pool.put(inst)
}
}
Cela fonctionne 99.99% du temps; et 100% du temps dans les tests unitaires. Cependant, une fois dans une lune bleue, je reçois un message dont le résumé calculé ne sort pas correctement - normalement cela indique une falsification de message ou des erreurs de réseau; mais l'expéditeur et le destinataire sont sur la même machine (dans différents processus). Existe-t-il un état interne pour un chiffrement ou un chiffrement qui peut souffrir d'effets de consistance de la mémoire? Je suis dans une boîte Windows 2 Core donc je ne vois pas comment je pourrais même souffrir de la cohérence de la mémoire effets. Je réinitialise le chiffrement et digère chaque appel, cela ne devrait donc pas avoir d'importance.
Q: Y at-il un moyen que j'aurais pu finir avec un mode de remplissage qui échoue parfois en fonction de la longueur du message? Le décrypteur et le chiffreur utilisent exactement les mêmes algorithmes (AES/CBC/Pkcs5Padding + SHA-256, et une taille de clé de 128).
Réponse 1: Pas que je puisse voir. Réponse 2: Non. –
Mon sentiment est que c'est un effet secondaire de la classe GC ou un tampon partagé dans les Chiffreurs/Digests; ou comme @Rook suggère que je l'utilise mal. C'est arrivé encore, et les digestions étaient totalement différentes et pas seulement quelques bits différents. Absolument aucune idée. – Justin
Y a-t-il une raison pour laquelle vous les mettez en commun? Cela donne-t-il vraiment un avantage de performance? J'aurais deviné que créer des objets Cyper ne serait pas si cher. – CodesInChaos