gpt4 book ai didi

java - 这个加密代码线程安全吗?

转载 作者:行者123 更新时间:2023-11-29 06:18:03 25 4
gpt4 key购买 nike

我有一个不可变的加密助手对象池,其中包含 java JCA Cipher 和 MessageDigest 对象的实例:

AlgorithmInstance( Cipher encCipher, Cipher decCipher, MessageDigest digest ) { ... }
private BlockingQueue< AlgorithmInstance > pool = new ArrayBlockingQueue< AlgorithmInstance >(poolSize);

我的应用程序中的各种线程需要加密或解密,通过访问池来争用 AlgorithmInstance 对象。每个线程使用它们来加密或解密,然后在完成后将它们返回到池中。由于没有并发访问,线程不会在任何 JCA 对象上同步。解密的工作方式大致相同。

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)
}
}

这在 99.99% 的时间内都有效;和 100% 的时间在单元测试中。然而,在极少数情况下,我收到一条消息,其计算的摘要未正确显示——通常这表示消息被篡改或网络错误;但是发送方和接收方在同一台机器上(在不同的进程中)。

问:密码或摘要是否有一些内部状态可能会受到内存一致性影响——我在一个 2 核 Windows 机器上,所以我不知道我怎么能遭受内存一致性影响。我重新初始化密码并消化每个调用,所以它应该无关紧要。

问:有什么方法可以让我最终得到一种有时会根据消息长度而失败的填充模式?解密器和加密器使用完全相同的算法(AES/CBC/Pkcs5Padding + SHA-256, key 大小为 128)。

最佳答案

您的应用是否有很多线程?因为你可以将 AlgorithmInstances 放在 ThreadLocal 对象中,而不是有一个池,从而确保每个 AlgorithmInstance 始终只被同一个线程使用,所以问题应该消失,你也不需要在 AlgorithmInstance 上同步(所以你会得到更好的表现)。

关于java - 这个加密代码线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4259149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com