| 

.NET C# Java Javascript Exception

1
Ich suche vergeblich eine Methode die mir ein Passwort mit folgenden Eigenschaften generiert

  • Nur bestimmte Zeichen (RegEx oder String)
  • Gewisse länge hat
  • Mind. 1 Zahl beinhaltet, mind. 1 Sonderzeichen beinhaltet


Google hat bei mir leider nichts brauchbares ausgespuckt und in der Api hab ich auch nichts gefunden.
Gibt es solch eine Methode?
12.09.2009
RioRio 21 1 2
4 Antworten
5
Eine vorgefertige Funktion in der Standard-API gibt es dazu meines Wissens nicht - schon allein wegen der speziellen Anforderungen. In Wirklichkeit sind die Anforderungen vermutlich NOCH spezieller: Bisher ist nicht ausgeschlossen, dass ein solches Passwort NUR als Ziffern und Sonderzeichen besteht - ich bin nicht sicher, ob Passworte wie "$&2§^,,3:;:$%&§" wirklich gewünscht sind. Außerdem muss man für einige Anwendungszwecke aufpassen, da nicht alle Sonderzeichen erlaubt sind - z.B. könnten Anführungszeichen oder das '§' ungültig sein.

Hier ist mal eine kleine Klasse, die im Prinzip wohl die genannten Anforderungen erfüllt - subjektiv-sinnvoll ergänzt in bezug auf das Verhalten bei "ungültigen" Eingaben, und mit der Möglichkeit, auf Wunsch alle zu verwendenden Alphabete (d.h. auch den Satz zulässiger Sonderzeichen) explizit anzugeben.

import java.util.*;

/**
* A simple password generator
*/
class SimplePassGen
{
/**
* Prints some sample passwords
*
* @param args Not used
*/
public static void main(String args[])
{
String alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
System.out.println(generate(alphabet, 28));

System.out.println(generate("ABC", 2));
System.out.println(generate("ABC", 3));
System.out.println(generate("abcABC", 10));

String someDigits = "0123";
String someSpecial = "!%&*+-@";
System.out.println(generate(10, someDigits, someSpecial, alphabet));


// Invalid input:
//System.out.println(generate("", 3));
//System.out.println(generate(4));
//System.out.println(generate(4, "X", "", "Y"));
//System.out.println(generate(4, "X", null, "Y"));
}


/**
* Random object for choosing and shuffling characters
* from StringBuffers
*/
private static Random random = new Random();

/**
* Generates a string with the given length, that contains
* at least one random digit (if length > 0), at least
* one random special character (if length > 1), and
* possibly (but not necessarily) random characters from
* the given alphabet.
*
* @param alphabet The alphabet to choose characters from
* @param length The length of the string to generate
* @return The generated String
*/
public static String generate(String alphabet, int length)
{
String digits = "0123456789";
String special = "!\"#$%&'()*+,-./:;<=>?@";
return generate(length, digits, special, alphabet);
}


/**
* Creates a String of the given length, containing random
* characters from the given alphabets, but at least one
* character from each alphabet. If there are more than
* 'length' alphabets, one random character is chosen from
* each of the 'length' first alphabets. <br />
* <br />
* At least one alphabet must be given. If an empty String
* or <code>null</code> is encountered as an alphabet, an
* IllegalArgumentException is thrown.
*
* @param length The length of the string to generate
* @param alphabets The alphabets to use
* @return The generated string
* @throws IllegalArgumentException if not alphabets are
* given, or an empty of <code>null</code> alphabet is
* encountered
*/
public static String generate(int length, String ... alphabets)
{
if (alphabets.length == 0)
{
throw new IllegalArgumentException(
"At least one alphabet must be given");
}
StringBuffer result = new StringBuffer();
StringBuffer all = new StringBuffer();
for (int i=0; i<alphabets.length; i++)
{
if (alphabets[i] == null ||
alphabets[i].equals(""))
{
throw new IllegalArgumentException(
"Invalid alphabet: "+alphabets[i]);
}
StringBuffer sb = new StringBuffer(alphabets[i]);
result.append(selectRandom(sb, 1));
if (result.length() == length)
{
return shuffle(result).toString();
}
all.append(sb);
}
result.append(selectRandom(all, length - result.length()));
return shuffle(result).toString();
}

/**
* Returns a StringBuffer containing 'n' characters chosen
* randomly from the given alphabet.
*
* @param alphabet The alphabet to choose from
* @param n The number of characters to choose
* @return A StringBufer with 'n' characters chosen randomly
* from the given alphabet
*/
private static StringBuffer selectRandom(StringBuffer alphabet, int n)
{
StringBuffer sb = new StringBuffer();
for (int i=0; i<n; i++)
{
sb.append(alphabet.charAt(random.nextInt(alphabet.length())));
}
return sb;
}

/**
* Shuffles the given StringBuffer in place and returns it
*
* @param sb The StringBuffer to shuffle and return
* @return The given StringBuffer, shuffled randomly
*/
private static StringBuffer shuffle(StringBuffer sb)
{
for (int i=0; i<sb.length(); i++)
{
int i0 = random.nextInt(sb.length());
int i1 = random.nextInt(sb.length());
char c = sb.charAt(i0);
sb.setCharAt(i0, sb.charAt(i1));
sb.setCharAt(i1, c);
}
return sb;
}


}
12.09.2009
Marco13 286 1 2
Marco13 286 1 2
1
Ich nehme mal an, das du ein DBMS verwendest, um die Passworter zu speichern.
Eine alternative von daher wäre eine SQL-Funktion die Passwörter generiert.

create --alter
function FktPW(@guid as uniqueidentifier) returns varchar(6)
begin
declare @tempRC as varchar(40)
set @tempRC = cast(@guid as varchar(40))
set @tempRC = replace(@tempRC,'-','')
set @tempRC = replace(@tempRC,'O','')
set @tempRC = replace(@tempRC,'0','')
set @tempRC = replace(@tempRC,'S','')
set @tempRC = replace(@tempRC,'5','')
set @tempRC = replace(@tempRC,'I','')
set @tempRC = replace(@tempRC,'1','')
set @tempRC = replace(@tempRC,'B','')
set @tempRC = replace(@tempRC,'8','')
set @tempRC = replace(@tempRC,'J','')

return @tempRC
end

select dbo.FktPW(newid()) as [PW]
-->3262D3
-->DA7964
-->942C3E
-->376223


Die Funktion könnte man so erweitern, das Sie auch Sonderzeichen in die Passwörter einfügt.
Im Moment würde Sie 6 stellige PW's generieren wobei alle Zeichen die man Missdeuten könnte, entfernt werden.
16.09.2009
Floyd 14,6k 3 9
0
Hallo RioRio,

wenn Du es in einer Webapplikation brauchst, kannst Du es
vielleicht gleich im Browser erzeugen, z.B. in Javascript.
Hier eine Idee dazu:

<html><head>
<script type="text/javascript">
function rand(from, to) { return from + Math.floor(Math.random()*(to-from)) }
function getchar_range(from, to) { return '&#'+rand(from,to)+';' }
function shuffle(a){
for(var j,v,i=1; i<a.length; i++) j=rand(0,i),v=a[i],a[i]=a[j],a[j]=v
return a
}
function MkPW(frm) {
var i,l=parseInt(frm.A.value),n=parseInt(frm.N.value),s=parseInt(frm.S.value)
var pw = Array(l + n + s)
for(i=0; i<s; i++) pw[i] = getchar_range(58,64) /* returns Html-Entities! */
for( ; i<n+s; i++) pw[i] = getchar_range(49,57)
for(; i<l+n+s; i++) pw[i] = getchar_range(65,90)
document.getElementById('passwd').innerHTML = shuffle(pw).join('')
return false
}
</script>
</head>
<body>

<h3>Passwortgenerator</h3>
<form name="pwform">
<input type="text" name="A" value="5"/><label>A .. Z<label/><br />
<input type="text" name="N" value="2"/><label>1 .. 9</label><br />
<input type="text" name="S" value="1"/><label>: .. @</label><br />
<input type="submit" value="Neu" onClick="return MkPW(pwform)" />
</form>
<p id="passwd" style="font-family:Arial, Helvetica, sans-serif"></p>
</body></html>


Viele Grüße
16.09.2009
Damengummistiefel 377 1 6

Stelle deine Java-Frage jetzt!