4

現在、MySql データベースでプレーン テキストのパスワードを使用している既存の GWT-Ext アプリケーションを変更しようとしています。

既存のパスワードは MySql 関数で簡単に変更できるため、私の計画は md5 ハッシュを使用することであり、GWT-Ext 側でも簡単な解決策を見つけることを期待していました。しかし、私が知ったように、java.security は GWT でサポートされておらず、クライアント側でパスワード文字列を md5 ハッシュに変更するために使用できる他の実装はないようです。

私がこれまでに見つけた唯一の「解決策」は、ここで説明されているように、JSNI を介して md5 メソッドを再実装することです

Ext-JS 用の既存のユーザー拡張機能がありますが、GWT-Ext 用のものは見つかりませんでした: http://extjs.com/forum/showthread.php?p=133516

この問題を解決するためのよりエレガントでシンプルな方法を知っている人はいますか? パスワードが暗号化されていることを確認するには、md5 の代わりに別のものを使用する必要がありますか?

乾杯フランク

4

5 に答える 5

6

あなたのニーズに合うかもしれないもう一つのアイデアは、ゼロ知識証明と呼ばれるものです。(つまり、サーバーはユーザーのプレーンテキストのパスワードを知る必要はありません。)

基本的に、初期パスワードを設定する場合、クライアントはユーザーのパスワードをN回ハッシュし(Nは1000のような大きな数字)、その最終ハッシュをNとともにサーバーに送信します。サーバーはハッシュとNを格納します。

その後、ユーザーが認証を希望する場合、サーバーはクライアントにN-1を通知し、クライアントはユーザーが入力したパスワードをN-1回ハッシュして、サーバーに送信します。サーバーは受信したハッシュに対してさらに1つのハッシュを実行し、(うまくいけば)保存されたハッシュを取得します。次に、サーバーはN-1ハッシュとN-1番号を格納します。

ユーザーが認証するたびに、サーバーは保存されているNをデクリメントし、前のハッシュを保存します。

Nが0になると、ユーザーは新しいパスワードを選択して設定する必要があります。

サーバーは、同じ反復を要求しないようにする必要があります。そうしないと、リプレイに対して脆弱になります。クライアント(特にブラウザ)は最後のNを確実に追跡できないため、クライアント側からその条件を実際に適用することはできません。

于 2009-08-07T00:14:29.233 に答える
2

gwt-cryptoを使用して、クライアント側でSHA-1ハッシュを生成できます。

String getSHA1for(String text) {
  SHA1Digest sd = new SHA1Digest();
  byte[] bs = text.getBytes();
  sd.update(bs, 0, bs.length);
  byte[] result = new byte[20];
  sd.doFinal(result, 0);
  return byteArrayToHexString(result);
}

String byteArrayToHexString(final byte[] b) {
  final StringBuffer sb = new StringBuffer(b.length * 2);
  for (int i = 0, len = b.length; i < len; i++) {
    int v = b[i] & 0xff;
    if (v < 16) sb.append('0');
    sb.append(Integer.toHexString(v));
  }
  return sb.toString();
}
于 2011-11-03T00:10:21.273 に答える
0

パスワードの暗号化にmd5またはその他のハッシュ関数を使用しないでください。http://codahale.com/how-to-safely-store-a-password/を参照してください

于 2013-02-22T13:40:51.343 に答える