首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jBCrypt 0.3是线程安全吗?

jBCrypt 0.3是线程安全吗?
EN

Stack Overflow用户
提问于 2010-10-16 23:06:41
回答 3查看 1.3K关注 0票数 1

问题真的说明了一切。代码可以在以下链接-> http://www.mindrot.org/projects/jBCrypt/中找到

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-16 23:46:17

首先,它没有被记录为线程安全的,所以无论出于什么目的和目的,它都不是。而且,在进一步的研究中,它肯定不是这样的:事实证明,虽然有一些实例字段,但没有公开BCrypt的实例;它试图通过静态方法完成所有工作。它可能不是线程安全的。它足够小,假设你关心并且作者会接受,你可以提供一个补丁来简单地转换它,以提供单独的、安全的实例(编辑并添加:我已经仔细地擦洗了它,并准备了一个更干净的版本,我将发送给作者……)

其次,您希望在多线程环境中以什么方式使用它?我不清楚你想在单独的线程中做什么。

注意:截至2013年7/18,有更多的人持不同意见

票数 2
EN

Stack Overflow用户

发布于 2013-07-18 22:06:16

我强烈反对现有的答案,以及目前被接受的答案。

在简要回顾了jBcrypt的源代码之后,我确信它是线程安全的。创建的唯一实例不会脱离键hashpw静态方法的作用域,并且它的字段不会通过我所能看到的任何机制与任何其他实例共享。

此外,关于API包含静态方法的抱怨真的让我感到困惑。散列函数是纯函数,因此没有理由不通过静态方法提供它们。实际上,我很高兴没有可用的用户访问实例方法,以免某些愚蠢的人试图做一些聪明的事情(比如一遍又一遍地使用一个实例,“重置”它以最小化分配/GC或类似的愚蠢行为)。

票数 13
EN

Stack Overflow用户

发布于 2012-01-27 06:19:24

复活这个老问题,因为我认为目前的答案是错误的,这个帖子在谷歌搜索中很高。

查看了代码并运行了几个简单的测试。jbcryt似乎是线程安全的。

在代码中:-although它大部分是静态方法,这些方法在需要的时候创建bcrypt类的实例来做计算。

测试样本:-had bcrypt不是线程安全的,我本以为这两个方法中的任何一个都会抛出某种形式的错误,但它们没有。

代码语言:javascript
复制
@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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3949415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档