gpt4 book ai didi

java - BCrypt 在 App Engine 应用程序中非常慢

转载 作者:搜寻专家 更新时间:2023-11-01 03:27:22 27 4
gpt4 key购买 nike

我正在使用 Eclipse 开发 GWT/app 引擎应用程序。从 1.6.3 升级到 App Engine 1.6.4 后出现以下问题。升级后,我的应用程序根本无法运行。不幸的是,我删除了旧的应用引擎插件,因此无法回滚到 1.6.3。在用头撞墙 2 小时后,我决定重新创建我的 Eclipse 项目。该项目再次运行,除了以下异常:

我正在使用 BCrypt 实现密码的单向哈希编码。在昨天之前,这工作正常,密码编码和检查发生得非常快——可能在几毫秒内。现在这些操作大约需要 2 分钟!使用调试器,我暂停了应用程序,看看我是否能弄清楚发生了什么。每次暂停时,我都会得到如下堆栈跟踪:

    Thread [798744730@qtp-2080190228-3] (Suspended) 
Class<T>.forName0(String, boolean, ClassLoader) line: not available [native method]
Class<T>.forName(String) line: 186
RuntimeHelper.checkRestricted(boolean, String, String, String) line: 63
Runtime.checkRestricted(boolean, String, String, String) line: 63
BCrypt.encipher(int[], int) line: 496
BCrypt.key(byte[]) line: 558
BCrypt.crypt_raw(byte[], byte[], int) line: 622
BCrypt.hashpw(String, String) line: 681
BCrypt.checkpw(String, String) line: 749

BCrypt.encipher() 如下:(第496行在下面一行注释中显示)

private final void encipher(int lr[], int off) {
int i, n, l = lr[off], r = lr[off + 1];

l ^= P[0];
for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) {
// Feistel substitution on left word
n = S[(l >> 24) & 0xff];
n += S[0x100 | ((l >> 16) & 0xff)];
n ^= S[0x200 | ((l >> 8) & 0xff)];
n += S[0x300 | (l & 0xff)];
r ^= n ^ P[++i]; //*** LINE 496 *****

// Feistel substitution on right word
n = S[(r >> 24) & 0xff];
n += S[0x100 | ((r >> 16) & 0xff)];
n ^= S[0x200 | ((r >> 8) & 0xff)];
n += S[0x300 | (r & 0xff)];
l ^= n ^ P[++i];
}
lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1];
lr[off + 1] = l;
}

根据我暂停调试器的时间,BCrypt 中的不同行是 Runtime.checkRestricted() 的调用者,但似乎 Runtime.checkRestricted() 被连续调用。由于这是在嵌入式循环中调用的,所以我认为这就是原因。然后我继续寻找如何避免发生此 checkRestricted() 调用。运气不好。

我的应用程序结构有些复杂,其中包含三个 Google 网络应用程序(Eclipse 项目)。我会给他们打电话:

基地

商店

应用

Store 依赖于 Base,App 依赖于 Store 和 Base。我使用 Ant 任务将 Base 和 Store 项目构建到 JAR 文件中,并将它们复制到 App/war/WEB-INF/lib 文件夹中。

最初,我在自己的 Eclipse 项目中有 BCrypt,我的 ANT 任务也会将其 JAR 并将其复制到 App/war/WEB-INF/lib。直到现在,这在过去几个月中都运行良好。为了尝试解决当前问题,我尝试将 BCrypt 类(它仅包含 1 个类)直接移动到 Base 项目中,结果相同,然后移动到 Store 项目中,结果相同。由于我的应用程序目前仅从 Store 项目调用 BCrypt 方法,因此我认为这两种方法都可行。他们在功能上做到了,但仍然需要 2 分钟才能完成 encipher() 调用。

从堆栈跟踪中,Runtime 或 RuntimeHelper 在我点击它们时返回 Source Not Found,而我在 Google 搜索中找不到任何关于它们的信息。

问题:

为什么 BCrypt 中的每一行都要进行 checkRestricted() 调用?这似乎不正常。

更重要的是,您知道如何解决这个问题吗?

我不知道接下来要看什么。任何想法都将非常受欢迎,即使您不知道最终的解决方案。

非常感谢。

瑞克

最佳答案

我刚刚在 GAE 代码项目中创建了一个工单:http://code.google.com/p/googleappengine/issues/detail?id=7277&thanks=7277&ts=1333530915

也许,我们在那里得到了答案,因为官方教程也提供了使用 BCrypt 的方法:http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ

Google 修复了该错误并于今天发布了新版本 (1.6.4.1): http://code.google.com/p/googleappengine/downloads/detail?name=appengine-java-sdk-1.6.4.1.zip

关于java - BCrypt 在 App Engine 应用程序中非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000740/

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