4

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()呼び出しを受けるのはなぜですか?これは正常ではないようです。

さらに重要なことに、この問題を解決する方法について何かアイデアはありますか?

次に何を見ればいいのかわからない。究極の解決策がわからなくても、どんなアイデアでも大歓迎です。

どうもありがとう。

リック

4

2 に答える 2

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

于 2012-04-04T09:16:42.947 に答える
0

はい。1.6.4にリグレッションがあります

Google App Engine 1.6.4はローカルで遅いですか?を参照してください。GAESDKに取り組んでいるGoogle社員によるコメント。

于 2012-04-05T07:45:55.460 に答える