ich einen Pool von unveränderlichen Verschlüsselungshilfsobjekte haben, die Instanzen der Java JCA Cipher und Message Objekte enthalten:Ist dieser Crypto Code Thread sicher?
AlgorithmInstance(Cipher encCipher, Cipher decCipher, MessageDigest digest) { ... }
private BlockingQueue<AlgorithmInstance> pool = new ArrayBlockingQueue<AlgorithmInstance>(poolSize);
Verschiedene Themen in meiner Anwendung, um die Verschlüsselung oder Entschlüsselung, kämpfen für AlgorithmInstance Objekte durch einen Pool zugreifen. Jeder Thread verwendet sie zum Verschlüsseln oder Entschlüsseln und gibt sie anschließend an den Pool zurück, wenn sie fertig sind. Threads werden auf keinem der JCA-Objekte synchronisiert, da kein gleichzeitiger Zugriff möglich ist. Decrypt funktioniert ungefähr auf die gleiche Weise.
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)
}
}
Dies funktioniert 99,99% der Zeit; und 100% der Zeit in Einzeltests. Aber sobald ich in einem blauen Mond bin, bekomme ich eine Nachricht, deren berechneter Digest nicht richtig herauskommt - normalerweise deutet dies auf eine Manipulation der Nachricht oder Netzwerkfehler hin; Sender und Empfänger befinden sich jedoch auf derselben Maschine (in verschiedenen Prozessen).
F: Gibt es einen internen Status für eine Chiffre oder einen Digest, der unter Speicherkonsistenzeffekte leiden kann - ich bin auf einer 2-Kern-Windows-Box, so sehe ich nicht, wie ich unter Speicherkonsistenz leiden könnte Auswirkungen. Ich initialisiere die Chiffre und verdaue jeden Anruf, so dass es keine Rolle spielt.
F: Gibt es eine Möglichkeit, dass ich mit einem Auffüllmodus gelandet wäre, der manchmal aufgrund der Nachrichtenlänge fehlschlägt? Der Entschlüsseler und der Verschlüsseler verwenden genau dieselben Algorithmen (AES/CBC/Pkcs5Padding + SHA-256 und eine Schlüsselgröße von 128).
Antwort 1: Nicht, dass ich sehen kann. Antwort 2: Nr. –
Mein Gefühl ist, dass es einige Nebeneffekte der Klasse GC oder einige gemeinsame Puffer in den Ciphers/Digests; oder als @Rook schlägt vor, dass ich es falsch benutze. Es passierte wieder und die Digests waren total verschieden, nicht nur ein paar Bits anders. Absolut keine Ahnung. – Justin
Gibt es Gründe, warum Sie sie überhaupt zusammenlegen? Gibt es wirklich einen Leistungsvorteil? Ich hätte gedacht, dass das Erstellen der Cyper-Objekte nicht so teuer wäre. – CodesInChaos