Java 创建和维护多个密码

Java 创建和维护多个密码,java,multithreading,encryption,Java,Multithreading,Encryption,我遇到了一个问题,多个线程正在争夺一个RSAjavax.crypto.Cipher,我正在考虑保留一个密码集合——每个线程一个。但是Cipher.getInstance()给了我相同的实例。我应该研究一下克隆(),还是有更好的方法,比如新密码()? 我们考虑了synchronized{},只使用Cipher的单个实例,但速度太慢了。 提前谢谢你的帮助 在我看来,不同的线程得到不同的密码实例——至少在MacOSX下的JDK1.6.0!。也许这是因为我使用的是BouncyCastle提供程序 您是试

我遇到了一个问题,多个线程正在争夺一个RSA
javax.crypto.Cipher
,我正在考虑保留一个密码集合——每个线程一个。但是
Cipher.getInstance()
给了我相同的实例。我应该研究一下
克隆()
,还是有更好的方法,比如
新密码()
? 我们考虑了
synchronized{}
,只使用
Cipher
的单个实例,但速度太慢了。
提前谢谢你的帮助

在我看来,不同的线程得到不同的
密码
实例——至少在MacOSX下的JDK1.6.0!。也许这是因为我使用的是BouncyCastle提供程序

您是试图从同一个线程调用两次
getInstance()
,还是从不同的线程调用
clone()
似乎不适用于密码,因此这不是一个选项

以下代码似乎至少为我提供了不同的identity hashcode对象:

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));
        ...
    }
}
private static final ThreadLocal localDigest=new ThreadLocal(){
@凌驾
受保护的密码初始值(){
试一试{
返回Cipher.getInstance(“RSA”);
}捕获(例外e){
//丑陋但必要
抛出新的运行时异常(e);
}
}
};
公共静态void main(字符串[]args){
新线程(new MyRunnable()).start();
新线程(new MyRunnable()).start();
}
私有静态类MyRunnable实现Runnable{
@凌驾
公开募捐{
Cipher Cipher=localDigest.get();
System.out.println(“Got digest”+System.identityHashCode(密码));
...
}
}

这不应该发生<每次调用
getInstance()
时,code>cipherpi应创建一个实例。您使用的是特定的加密提供程序吗?当然,提供程序总是会弄乱底层实现。如果它们映射到同一个
CipherSpi
实例,您将遇到麻烦。我自己从未经历过这种情况,但它肯定会发生(我已经实现了线程安全提供程序)。。。在这种情况下,也许ThreadLocal就足够了,现在就实现它。谢谢请注意,在webapplications中使用ThreadLocal变量共享密码实例将导致内存泄漏:请改为使用对象池来避免内存泄漏:能否详细介绍加密提供程序。对于
System.out.println(“Equals:”+Cipher.getInstance(“DES/CBC/PKCS5Padding”).Equals(Cipher.getInstance(“DES/CBC/PKCS5Padding”)))我可以为密码使用对象池吗?