2011-10-02 3 views
8

jBCrypt Libraryは、自分のアプリケーションを使用して登録するときにユーザーパスワードをハッシュするために使用しています。私はそうのように、塩と、基本的なハッシュ関数を使用していますAndroidアプリケーションでjBCryptを使用してパスワードを暗号化すると、長いハングアップが発生する

String pass = BCrypt.hashpw(rawPass, BCrypt.gensalt()); 

私は、登録時にを掛ける1〜2分に気づいた、とbcryptのは、担当した確認、デバッガをチェックします。

パスワードを実際に塩化するのはです。の処理能力はどうですか?もしそうなら、ハッシュするために平文のパスワードをサーバに送るのがよいでしょうか?問題についての私の元の考えはどこにでも送られてくる前にそれをハッシュすることでした。何か案は?

+1

ところで、bcryptはちょうどそれを行うように設計されています。もちろん、それがクライアントでこのような長いハングアップを引き起こした場合、それは受け入れられません。 – NullUserException

+0

UI以外のスレッドでハッシュ処理を実行しようとしましたか? (例:android.os.AsyncTask) – Skarllot

答えて

10

an articleは、MacラップトップでCore 2 Duoプロセッサを搭載した時間を示しています。そう、はい、Bcryptはモバイルデバイス上で非常に遅くなる可能性があります。

もう1つのよくある問題は、非常に遅く、十分なランダムデータがないためにハングする可能性があるSecureRandomの初期化です。これは、さまざまなマシンとオペレーティングシステムによって異なります。他の場所での議論がたくさんありますが、new SecureRandom()を使用して自分で初期化するか、gensaltを別々に呼び出してランダムデータ生成を分離してからhashpwへの呼び出しを試してみてください。

もう1つの質問は、クライアントで実際にハッシュする理由です。クライアントに保存してローカルにログインする場合、それは意味をなさないかもしれませんが、サーバーに送信されていて、通常のログインでプレーンテキストのパスワードをサーバーに送信する場合、何も得られません。また、一般的な誤解は、パスワードをサーバーに送信する前にパスワードをハッシュすると(ログイン時)、実際には平文パスワードを送信するのと同等の保護を提供するという誤解です。攻撃者はアクセスできるようにハッシュを取得しているだけです。

ハッシングパスワードは、パスワードストア自体が侵害された場合に、攻撃者がアクセスを取得できないようにする(または少なくとも軽減する)手段です。

パスワードがサーバーに格納されている場合は、(安全なチャネルを介して)平文で送信する必要があり、サーバーはそのハッシュ方法を決定する必要があります。

+4

クライアントからサーバーへのパスワードのハッシュを送信し、パスワードをプレーンテキストで送信することとの違いは、傍受された場合、そのドメインに対してのみ有効であるということです。クロスドメイン妥協(複数のサイトで同じパスワードを再利用している人たち)はかなり一般的です。 –

+2

@StevePomeroy BCryptはランダムな塩を使用するので、サーバー上の平文に格納されていないか、ハッシュを計算する前に塩をクライアントに送っていない限り、パスワードを確認できませんでした。 HTTPSのようなセキュアなチャネルを使用している場合(常にそうしなければならない)、通過中の傍受から保護するという点ではあまり効果がありません。共有パスワードの妥協は、通常、パスワードデータベースが盗まれ、平易なテキストまたはハッシュアルゴリズムを使用してハッシュされた結果です。 –

関連する問題