我正在使用Eclipse开发GWT / app引擎应用程序。从1.6.3升级到app引擎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 Web应用程序(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分钟才能完成一个加密()呼叫。
从堆栈跟踪中,Runtime或RuntimeHelper在我点击它们时返回Source Not Found,我在Google搜索中找不到任何关于它们的内容。
问题:
为什么BCrypt中的每一行都接受了checkRestricted()调用?这似乎不正常。
更重要的是,关于如何解决这个问题的任何想法?
我不知道接下来要看什么。即使您不知道最终的解决方案,任何想法都会非常受欢迎。
非常感谢。
瑞克
答案 0 :(得分:2)
我刚刚在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
答案 1 :(得分:0)
是。 1.6.4有一个回归
请参阅处理GAE SDK的Google员工发表的Is google app engine 1.6.4 slower in local?评论。