Как я генерирую случайный пароль на языке пользователя?

Мое приложение должно быть I18N совместимый. Одно из требований - то, что начальный пароль, который я генерирую, должен быть на выбранном языке Пользователя. Что API в Java я могу использовать для достижения этого? Я имею язык пользователя и должен буду получить несколько случайных символов от unicode набора того языка.

Править: Спасибо за ответы до сих пор. Некоторые разъяснения: Это для веб-приложения. Из соображений безопасности мы не можем поддержать запас символов/слов на различных языках.

Редактирование 2: В ответ на комментарии и некоторые ответы: Это приложение будет развернуто в различной географии, и я не хочу, чтобы они должны были сделать работу для установки паролей в том, какой бы ни язык они развертываются в. Это и безопасность - причины, я еще не принял самый популярный ответ.

11
задан 4 revs, 2 users 100% 1 August 2010 в 06:56
поделиться

8 ответов

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

Означает, что вам придется немного поработать, чтобы найти списки слов, но после того, как вы их получите, это будет довольно простой процесс.

Изменить: если вы просто создаете случайные строки, это становится намного проще: вы просто сохраняете файл с доступными символами для каждого языка. Откройте правый, когда вы придете, чтобы сгенерировать, а затем выберите случайные буквы. Биш баш бош. Сделанный.

Правка 2: Как правильно заметил Марсело, вы можете столкнуться с проблемой создания непристойного пароля для пользователя. Возможно, стоит также сохранить локализованные строки в черном списке, чтобы проверить свой пароль. Если какая-либо из строк появляется в пароле (только в нем, а не целиком), сгенерируйте другой пароль. Это означает, что вы никогда не сгенерируете достаточно простой пароль, такой как scunthorpe , но это также означает, что вы не получите проскальзывания таких вещей, как assclown .

Как вы, возможно, уже догадались, это выглядит как большая работа:

  • Получить все допустимые символы для каждого языка, который вы планируете поддерживать
  • Получить все непристойные слова для каждого языка, который вы планируете поддерживать
  • Сгенерируйте пароль на основе букв
  • Убедитесь, что ни одна из них не содержит нецензурных слов.
  • Помните, что некоторые нецензурные слова приняты другими языками, но могут не фигурировать в черных списках для конкретных языков, поэтому ведите международный черный список слишком.

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

Если все это выглядит слишком напряженным, возможно, вам лучше сначала пересмотреть причину установки случайного пароля. Если это устройство для проверки электронной почты, есть и другие, более простые методы. Например: отправка уникальной ссылки, по которой нужно щелкнуть


Редактировать: Можно ли с номерами? Они партии безопаснее, не нуждаются в расчесывании, являются международными и могут быть достаточно длинными, чтобы быть уникальными, но они редко запоминаются. Если это разовые работы по копированию и вставке, они должны вам помочь.

Если вам нужно, чтобы они были короткими, но в высшей степени уникальными (и вам нужно много), возможно, смешайте числа с буквами в предсказуемых схемах, например ( a = буква, n = число) annn-annn дает 676 000 000 комбинаций. Даже простые вещи вроде annn дают достаточно, чтобы их нельзя было угадать (26000 комбинаций), если они не должны быть уникальными ... Если эти являются паролями, то нет ничего плохого в том, что два то же.

7
ответ дан 3 December 2019 в 04:51
поделиться

Посмотрите на http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx, где описано нечто подобное. ключевые слова для поиска, кажется, "цепи Маркова".

Edit: только что заметил, что dan04 уже упомянул эту ссылку.

2
ответ дан 3 December 2019 в 04:51
поделиться

Если вы хотите иметь значимые слова на каждом языке, вы можете использовать набор слов, переведенных на английский (например, через переводчик Google).

Затем вы можете заключить их в числа и специальные символы для надежности пароля.

И, конечно же, на вашем месте я бы проинструктировал пользователя немедленно изменить любой исходный пароль, который вы вводите, на что-то по своему выбору.

3
ответ дан 3 December 2019 в 04:51
поделиться

База данных символов Юникода и Репозиторий данных общих локалей Юникода содержат много информации о языках и скриптах. Вы можете получить доступ к информации, используя, например, IBM ICU (библиотека I18N / L10N, более полная, чем языковые стандарты Java).

В частности, вы можете получить набор образцовых символов, используя LocaleData.getExemplarSet . Обратите внимание, однако, что CLDR далек от завершения, вы должны ожидать, что данные будут отсутствовать.

1
ответ дан 3 December 2019 в 04:51
поделиться

JDK включает отображаемые названия стран, язык отображения и отображаемый текст для каждого языкового стандарта, сохраненные во всех доступных языковых стандартах. Вы можете использовать это для создания начального набора символов для каждой локали и использовать Character.toUpperCase Character.toLowerCase , чтобы также получить варианты регистра.

   String getCharsForLocale(Locale locale) {
      Locale[] allLocales = Locale.getAvailableLocales();
      StringBuilder buf = new StringBuilder();
      for (Locale l: allLocales) {
          buf.append(l.getDisplayName(locale).toLowerCase())
             .append(l.getDisplayName(locale).toUpperCase())
             .append(l.getDisplaycountry(locale).toLowerCase())
             .append(l.getDisplayCountry(locale).toUpperCase())
             .append(l.getDisplayLanguage(locale).toLowerCase())
             .append(l.getDisplayLanguage(locale).toUpperCase());
      }
      // add other chars, such as decimals
      DecimalFormatSymbols decimals = DecimalFormatSymbols.getInstance(locale);
      buf.append(decimals.getMinusSign())
         .append(decimals.getPercent())
         .append(decimals.getDecimalSeparator());
      // etc..

      // now remove dupicates
      char[] chars = new char[buf.length()];
      buf.getChars(0, chars.length, chars, 0);
      Arrays.sort(chars);
      buf = new StringBuilder();
      char last = '\0';
      for (char c: chars) {
          if (c!=last) buf.append(c);
          last = c;
      }
      return buf.toString();
   }

Хотя это не исчерпывающий список всех возможных символов, цель состоит в том, чтобы перечислить наиболее часто используемые.

4
ответ дан 3 December 2019 в 04:51
поделиться

Возможно, это звучит немного сложно. Но вы можете хранить много слов в базе данных. И переведите их с помощью какого-нибудь средства перевода на язык пользователя. (Возможно Google , но я не знаю, разрешает ли Google это)
Немного похоже на reCHAPTA . У них есть много текстов (например, Lorem Ipsum ), где они выбирают два слова.

Вы можете объединить два или три слова (максимальной длины) с числом. Может быть, с символом их страны впереди. Итак, вы получите что-то вроде:

  • BE_VogelHuis9751
  • FR_ChienVoiture3104
  • ES_GatoEdificio9554
  • D_BrustTausend9672
  • ...
3
ответ дан 3 December 2019 в 04:51
поделиться
  1. Используйте латинский словарь с выбором случайных слов в CammelCase до тех пор, пока они желаемой длины.
  2. Если вы настаиваете на использовании Unicode, попробуйте UN UDHR . Просто очистите его с помощью простого регулярного выражения. Из-за меньшего размера словаря вам могут понадобиться более длинные пароли, но кого это волнует.
2
ответ дан 3 December 2019 в 04:51
поделиться

может быть, ты сможешь создать английское слово и перевести его с помощью Google Translate

0
ответ дан 3 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: