java - 创建和维护多个密码

标签 java multithreading encryption

我遇到了多个线程争夺 RSA javax.crypto.Cipher 的问题,我正在考虑保留一组密码 - 每个线程一个。但是 Cipher.getInstance() 给了我相同的实例。我应该查看 clone() 还是有更好的方法,比如 new Cipher()? 我们考虑过同步{},只使用 Cipher 的单个实例,但它太慢了。 感谢您提前提供的所有帮助!

最佳答案

在我看来,不同的线程获得不同的 Cipher 实例——至少在 Mac OSX 下的 JDK 1.6.0_33 下是这样。也许这是因为我使用的是 BouncyCaSTLe 提供程序?

您是尝试从同一线程还是从不同线程调用 getInstance() 两次? clone() 似乎不适用于 Ciphers,因此这不是一个选项。

一种解决方案是使用 object pools这样多个密码实例将被多个线程并行使用。如果 JDK 在同一线程而不是新实例上返回相同的密码实例,这可能不起作用。

下面的代码似乎至少为我吐出了不同的身份哈希码对象:

private static final ThreadLocal<Cipher> localDigest = new ThreadLocal<Cipher>(){
    @Override
    protected Cipher initialValue() {
        try {
            return Cipher.getInstance("RSA");
        } catch (Exception e) {
            // ugly but necessary
            throw new RuntimeException(e);
        }
    }
};

public static void main(String[] args) {
    new Thread(new MyRunnable()).start();
    new Thread(new MyRunnable()).start();
}

private static class MyRunnable implements Runnable {
    @Override
    public void run() {
        Cipher cipher = localDigest.get();
        System.out.println("Got digest " + System.identityHashCode(cipher));
        ...
    }
}

正如@marius_neo 在评论中指出的那样,ThreadLocal 在某些情况下会导致内存泄漏。请参阅:To Pool or not to Pool java crypto service providers

关于java - 创建和维护多个密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942466/

相关文章:

java - 如何自定义 Spring Data REST 以对存储库资源使用多段路径?

java - HQL多对多查询

java - 如何在java中为单个线程创建内部线程池

sql - 在 SQL Server 2008 中加密数据库表

PHP - 从 Node.js 解密加密字符串

java - 为 spring hatoas 执行单元测试用例时缺少 jsonRootName

java - 构造函数 ArrayAdapter<String>(SmsActivity, int, SmsActivity.SmsReceived) 未定义?

c++ - Intel Thread Building Blocks 备选方案和许可

c - 并行化一个函数

php - PHP 7.1 及更高版本的数据加密/解密