Eclipseを使用してGWT/アプリエンジンアプリケーションを開発しています。以下の問題は、1.6.3からAppEngine1.6.4にアップグレードした後に発生しました。アップグレード後、アプリケーションがまったく機能しなくなりました。残念ながら、古いApp Engineプラグインを削除していたため、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()呼び出しが発生しないようにする方法を探しました。運がない。
3つのGoogleWebアプリケーション(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メソッドを呼び出しているので、どちらでも機能する可能性があると考えました。機能的には実行しましたが、encipher()呼び出しを完了するのに2分かかりました。
スタックトレースから、RuntimeまたはRuntimeHelperは、クリックするとSource Not Foundを返しますが、Google検索ではそれらについて何も見つかりません。
質問:
BCryptのすべての行がcheckRestricted()呼び出しを受けるのはなぜですか?これは正常ではないようです。
さらに重要なことに、この問題を解決する方法について何かアイデアはありますか?
次に何を見ればいいのかわからない。究極の解決策がわからなくても、どんなアイデアでも大歓迎です。
どうもありがとう。
リック