хэш md5 для строки пароля в GWT / GWT-Ext? - PullRequest
4 голосов
/ 06 августа 2009

В настоящее время я пытаюсь изменить существующее приложение GWT-Ext, использующее простые текстовые пароли в своей базе данных MySql.

Я планировал использовать хеши md5, поскольку существующие пароли можно легко изменить с помощью функции MySql, и я ожидал найти простое решение и для стороны GWT-Ext. Но, как я выяснил, java.security не поддерживается GWT, и, похоже, нет никакой другой реализации, которая могла бы быть использована для изменения строки пароля на хеш md5 на стороне клиента.

Единственное «решение», которое я нашел до сих пор, это повторно реализовать метод md5 через JSNI, как описано здесь: http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/ad09475a9944c9f8

Существует существующее расширение для Ext-JS, но я не смог найти ничего для GWT-Ext: http://extjs.com/forum/showthread.php?p=133516

Кто-нибудь знает более элегантный / простой способ решения этой проблемы? Может быть, я должен использовать что-то другое вместо md5, чтобы убедиться, что пароли зашифрованы?

Приветствие Frank

Ответы [ 4 ]

9 голосов
/ 06 августа 2009

Лично я бы сказал, что вы делаете это неправильно. Я бы не стал хэшировать пароль на стороне клиента (это GWT). Если вы хэшируете свой пароль, вы, несомненно, захотите его засолить, иначе вы будете подвержены атакам rainbow Если вы хешируете + солите его на стороне клиента, ваша соль будет доступна вашим пользователям.

На вашем месте я бы хэш + солил ваш пароль на стороне сервера. Это позволит вам использовать ваш стандартный код Java для выполнения хэша MD5.

Мои 2 цента.

-JP

6 голосов
/ 07 августа 2009

Другая идея, которая может соответствовать вашим потребностям, - это так называемая аутентификация с нулевым знанием. (Т.е. серверу никогда не нужно знать пароль пользователя в виде простого текста.)

Обычно при установке начального пароля клиент хэширует пароль пользователя N раз (где N - большое число, например 1000), а затем отправляет этот окончательный хэш на сервер вместе с N. Сервер сохраняет хэш и N .

Позже, когда пользователь хочет пройти аутентификацию, сервер сообщает клиенту N-1, и клиент хэширует пароль, который пользователь вводит N-1 раз, и отправляет его на сервер. Сервер делает еще 1 хэш для полученного хеша и (надеюсь) получает сохраненный хеш. Затем сервер сохраняет хэш N-1 и номер N-1.

Каждый раз, когда пользователь аутентифицируется, сервер уменьшает сохраненное N и сохраняет предыдущий хеш.

Когда N становится равным 0, пользователь должен выбрать и установить новый пароль.

Сервер должен убедиться, что он никогда не запрашивает одну и ту же итерацию, в противном случае он уязвим для воспроизведения. Вы не можете реально выполнить это условие со стороны клиента, потому что клиент (особенно браузер) не может надежно отслеживать последний N.

2 голосов
/ 03 ноября 2011

Вы можете использовать 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();
}
0 голосов
/ 22 февраля 2013

Никогда не используйте md5 или другие хеш-функции для шифрования пароля. Смотри http://codahale.com/how-to-safely-store-a-password/

...