11
votes

Comment générer un mot de passe aléatoire dans la langue d'un utilisateur?

Mon application doit être conforme à I18N. L'une des conditions requises est que le mot de passe initial que je génère doit être dans la langue choisie par l'utilisateur. Quelle API à Java puis-je utiliser pour y parvenir? J'ai la langue de l'utilisateur et aura besoin de quelques caractères aléatoires de l'ensemble Unicode de cette langue.

Edit: Merci pour les réponses jusqu'à présent. Quelques clarifications: Ceci est pour une application Web. Pour des raisons de sécurité, nous ne pouvons pas maintenir un stock de caractères / mots dans différentes langues.

EDIT 2: En réponse aux commentaires et aux réponses: cette application sera déployée dans diverses géographies et je ne souhaite pas qu'ils devraient faire du travail pour configurer des mots de passe dans la langue précédente. Cette et la sécurité sont la raisons pour lesquelles je n'ai pas encore accepté la réponse la plus populaire.


2 commentaires

Les mots de passe aléatoires sont des bêtes dangereuses. En anglais, par exemple, vous voudrez peut-être omettre des voyelles afin d'éviter d'obliger de petites mamies anciennes à taper des obscénités. Cela ne général dans toutes les langues, cependant.


Combien de langues faites-vous affaire?


9 Réponses :


7
votes

Pendant que je ne suis pas sûr, définir un mot de passe par défaut est une action souhaitable (les gens ne savent souvent pas comment le changer, puis l'oublier) Si je faisais cela, je recevais une charge de mots de mots dans différentes langues et choisir peut-être deux mots aléatoires, concaténer et utiliser cela comme mot de passe.

signifie que vous devrez faire du travail de la jambe pour trouver les mots de la liste, mais il devrait s'agir d'un processus assez simple une fois que vous les avez.

Edit: Si vous faites simplement des chaînes aléatoires, il suffit beaucoup plus simple: vous stockez simplement un fichier de caractères disponibles pour chaque langue. Ouvrez le bon lorsque vous venez générer puis choisissez des lettres aléatoires. Bish Bash Bosh. Fait.

Edit 2: Comme Marcelo commença correctement, vous pouvez rencontrer le problème de générer un mot de passe obscène pour l'utilisateur. Il pourrait être utile de garder également des chaînes de liste noire localisées pour vérifier votre mot de passe. Si l'une des chaînes apparaissent dans le mot de passe (juste en elle, pas le tout), génère un mot de passe différent. Cela signifie que vous ne générerez jamais de mot de passe assez innocent comme SCunthorpe mais cela signifie également que vous ne recevrez pas de choses comme locklown glissant non plus.

Comme vous l'avez peut-être rassemblé, cela commence à ressembler à beaucoup de travail:

  • Obtenez tous les caractères valides pour chaque langue que vous envisagez de prendre en charge
  • Obtenez tous les mots obscènes pour chaque langue que vous envisagez de soutenir
  • génère un mot de passe basé sur les lettres
  • Vérifiez aucun d'entre eux contient un mot de jure
  • N'oubliez pas que certains mots obscènes sont adoptés par d'autres langues, mais ne peuvent pas comporter sur des noueuses spécifiques à la langue, gardez également une liste blanche internationale aussi.

    Vous trouverez peut-être que la définition d'une phrase en utilisant des mots propres connus de chaque langue (par ma réponse originale) fonctionne mieux.

    Si tout ce qui semble trop stressant, vous risquez peut-être mieux de réinserter la raison de la définition d'un mot de passe aléatoire en premier lieu. Si c'est un périphérique de vérification de courrier électronique, il existe d'autres méthodes plus faciles à utiliser. Par exemple: envoyer un lien unique à cliquer sur


    edit: Les chiffres seront-ils d'accord? Ils sont un lot plus sûr, n'ont pas besoin de peigner, sont internationaux et peuvent être assez longs pour être uniques, ils sont rarement mémorables. S'ils sont des emplois ponctuels et coly-pâte, ils devraient vous allouer.

    Si vous avez besoin d'eux pour être courte mais très unique (et besoin de lots) peut-être mélanger des nombres avec des lettres dans des modèles prévisibles tels que ( a = lettre, n = numéro) annn-annn donne 676 000 000 combinaisons. Même des choses simples comme annn donner suffisamment pour ne pas être devinés (26 000 combos) si elles n'ont pas besoin d'être uniques ... si ces sont mots de passe, il n'y a rien de mal à deux étant les mêmes.


4 commentaires

Vous avez lu THEDailyWTF.com/articles/Le-automated-Curse-Generator. Aspx , n'est-ce pas?


J'ai maintenant. Avait Brian et Barry ont suivi mon conseil, des mots comme Fukushita et kakashite auraient été criblés ... et il ne faudrait pas longtemps pour générer une liste de synonymes phonétiques à l'écran out fukusuka . Ne me trompe pas. Strings aléatoires aspirez parce que vous devez les décider tellement ... Si vous avez besoin d'une chaîne aléatoire, mais vous ne pouvez pas être arsé de peigner sur le texte, Utilisez simplement des chiffres .


"Fukusuka". Joli. Parfaitement offensant pour les locuteurs anglais / russe bilingue. "Besoin d'une chaîne aléatoire mais que vous ne pouvez pas être arresté sur le texte, utilisez simplement des chiffres" Je suis sûr que vous pouvez écrire des obscénités à l'aide de LEetspeak avec des chiffres uniquement.


Mais vous n'essayez généralement pas de prononcer une longue chaîne de chiffres comme un seul mot. Je pense que vous devez avoir l'air beaucoup plus difficile de trouver le mal.



3
votes

Si vous souhaitez avoir des mots significatifs dans chaque langue, vous pouvez utiliser un ensemble de mots en anglais traduit (via Google Translator par exemple).

Ensuite, vous pouvez les envelopper avec des chiffres et des caractères spéciaux pour la force du mot de passe.

Et bien sûr, à votre place, je demanderais à l'utilisateur de modifier immédiatement tout mot de passe initial que vous fournissez à quelque chose de son choix.


1 commentaires

+1. Tandis qu'un traducteur en ligne ne soit pas parfait, cette solution vous permet de rester à l'écart du générateur de malédiction de Brian / Barry. Si vous êtes inquiet pour quelqu'un de découvrir votre liste de mots anglais (et honnêtement, s'ils peuvent accéder à cette liste, je serais plus inquiet des autres choses qu'ils peuvent accomplir que la découverte de mots de passe par défaut), vous pourriez en outre convertir au hasard des lettres dans le mot aux nombres ou aux symboles. 'A' pourrait être converti en '@' ou à "4", ou ne pas être converti du tout.



1
votes

La base de données de caractères Unicode et le référentiel de données locales communs Unicode contiennent beaucoup d'informations sur les langues et les scripts. Vous pouvez accéder aux informations en utilisant, par exemple, IBM ICU (une bibliothèque I18N / L10N plus complète que les localités de Java).

En particulier, vous pouvez obtenir un ensemble de caractères exemplaires, en utilisant localedata.getexemplarset . Notez cependant que le CLDR est très complet, vous devez vous attendre à des données manquantes.


1 commentaires

Notez que ma réponse ne diminue en aucune manière la pertinence du commentaire de Marcelo ...



2
votes

Jetez un coup d'œil à http://thedailywtf.com/articles/Le -Auomated-Curse-generator.aspx où quelque chose de similaire est décrit. Les mots clés à rechercher semblent être "Chaînes de Markov".

EDIT: vient de remarquer que DAN04 a déjà mentionné ce lien.


0 commentaires

4
votes

Le JDK inclut les noms de pays d'affichage, la langue d'affichage et le texte d'affichage de chaque localisation, stockés dans tous les locaux disponibles. Vous pouvez utiliser ceci pour créer un ensemble de caractères initial pour chaque paramètre locale et utiliser caractère.touppercase code> caractère.tolowercase code> pour obtenir également des variantes de cas.

   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();
   }


0 commentaires

2
votes
  1. Utilisez un dictionnaire latin avec la sélection de mots aléatoires dans Cammelcase jusqu'à ce que ils sont de la longueur souhaitée.
  2. Si vous insistez pour obtenir unicode fantaisie, essayez le ONU UDHR . Seulement Grattez-le avec une simple regex. En raison de la taille de dictionnaire plus petite Vous aurez peut-être besoin de mots de passe plus longs, mais qui se soucie.

0 commentaires

3
votes

Peut-être que cela semble un peu délicat. Mais vous pouvez conserver beaucoup de mots dans une base de données. Et traduisez-les avec un outil de traduction vers la langue de l'utilisateur. (Peut-être Google , mais je ne sais pas si Google le permet.)
Un peu comme Rechapta fait. Ils ont beaucoup de tekst (comme Lorem ipsum ) où ils choisissent deux mots.

Vous pouvez combiner deux ou trois mots (avec une longueur maximale) avec un nombre. Peut-être avec un symbole de leur pays devant. Donc, vous obtenez des choses comme:

  • be_vogelhuis9751
  • fr_chienvoture3104
  • es_gatodificio9554
  • d_brusttausend9672
  • ...

0 commentaires

0
votes

Peut-être que vous pouvez créer un mot anglais et le traduire avec Google traduire-le


0 commentaires

2
votes

C'est une question vraiment intéressante qui m'a fait penser, et j'ai plongé mes mains dans la terre. Voici mon processus de pensée

  1. Obtenez la locale (généralement standard pour le partage linguistique, facultatif si vous avez déjà la langue)
  2. Obtenez une langue de locale
  3. Obtenez un script pour la langue
  4. Obtenez des caractères (caractères Unicode) pour le script
  5. génère un mot de passe aléatoire.
  6. éventuellement, enveloppez le processus

    Voici le gist xxx

    problèmes connus avec code:

    1. Il gère des unicodes simples (4 caractères) uniquement - il peut également être étendu pour gérer les autres caractères Unicode, si nécessaire
    2. Dès maintenant, cela dépend de la plage de caractères dans un script. Si peu de caractères sont ajoutés plus tard ou sont hors de portée, le code ne les couvrirait pas. Si certains caractères de la plage définie appartiennent à d'autres scripts, ils seraient trompeurs. Cela peut être résolu en améliorant les caractères liés à un script.

0 commentaires