问题真的说明了一切。代码可以在以下链接-> http://www.mindrot.org/projects/jBCrypt/中找到
发布于 2010-10-16 23:46:17
首先,它没有被记录为线程安全的,所以无论出于什么目的和目的,它都不是。而且,在进一步的研究中,它肯定不是这样的:事实证明,虽然有一些实例字段,但没有公开BCrypt的实例;它试图通过静态方法完成所有工作。它可能不是线程安全的。它足够小,假设你关心并且作者会接受,你可以提供一个补丁来简单地转换它,以提供单独的、安全的实例(编辑并添加:我已经仔细地擦洗了它,并准备了一个更干净的版本,我将发送给作者……)
其次,您希望在多线程环境中以什么方式使用它?我不清楚你想在单独的线程中做什么。
注意:截至2013年7/18,有更多的人持不同意见
发布于 2013-07-18 22:06:16
我强烈反对现有的答案,以及目前被接受的答案。
在简要回顾了jBcrypt的源代码之后,我确信它是线程安全的。创建的唯一实例不会脱离键hashpw静态方法的作用域,并且它的字段不会通过我所能看到的任何机制与任何其他实例共享。
此外,关于API包含静态方法的抱怨真的让我感到困惑。散列函数是纯函数,因此没有理由不通过静态方法提供它们。实际上,我很高兴没有可用的用户访问实例方法,以免某些愚蠢的人试图做一些聪明的事情(比如一遍又一遍地使用一个实例,“重置”它以最小化分配/GC或类似的愚蠢行为)。
发布于 2012-01-27 06:19:24
复活这个老问题,因为我认为目前的答案是错误的,这个帖子在谷歌搜索中很高。
查看了代码并运行了几个简单的测试。jbcryt似乎是线程安全的。
在代码中:-although它大部分是静态方法,这些方法在需要的时候创建bcrypt类的实例来做计算。
测试样本:-had bcrypt不是线程安全的,我本以为这两个方法中的任何一个都会抛出某种形式的错误,但它们没有。
@Test
public void multiThreadHash() throws InterruptedException{
List<Thread> threads = new ArrayList<Thread>();
for(int i = 0; i<40; i++){
threads.add(new Thread(){
@Override
public void run() {
long start = System.currentTimeMillis();
while(System.currentTimeMillis()<start+12000){
String password = "sample";
String hash = BCrypt.gensalt(4);
String hashed = BCrypt.hashpw(password, hash);
}
}
});
}
for(Thread t: threads){
t.start();
}
Thread.sleep(12200L);
}
@Test
public void multiThreadReproductibleHash() throws InterruptedException{
List<Thread> threads = new ArrayList<Thread>();
for(int i = 0; i<40; i++){
threads.add(new Thread(){
@Override
public void run() {
long start = System.currentTimeMillis();
while(System.currentTimeMillis()<start+12000){
String password = "sample";
String hash = "$2a$04$/YkrS2ifyAloNVUk5qAO7O";
String expected = "$2a$04$/YkrS2ifyAloNVUk5qAO7OlqIsp2ECTMDinOij9wvn7nXPRJCo8Gy";
String hashed = BCrypt.hashpw(password, hash);
Assert.assertEquals(expected, hashed);
}
}
});
}
for(Thread t: threads){
t.start();
}
Thread.sleep(12200L);
}https://stackoverflow.com/questions/3949415
复制相似问题