PasswortgeneratorTest: Unterschied zwischen den Versionen
Aus znilwiki
BLinz (Diskussion | Beiträge) Die Seite wurde neu angelegt: „<html lang="de"> <head> <meta charset="UTF-8"> <title>Passwortgenerator</title> <style> label, input, select, textarea, button { font-family: "Consolas", monospace; margin: 5px 0; size 26; } .form-field { margin-bottom: 10px; } </style> </head> <body> <p style="font-family: "Consolas", monospace; padding: 20px; margin: 20px"> <div class="Pa…“ |
BLinz (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
<html lang="de"> | <html lang="de"> | ||
<head> | |||
<meta charset="UTF-8"> | |||
<title>Passwortgenerator</title> | |||
<style> | |||
label, input, select, textarea, button { | |||
font-family: "Consolas", monospace; | |||
margin: 5px 0; | |||
font-size: 16px; /* 'size 26' ist ungültiges CSS, durch font-size ersetzt */ | |||
} | |||
.form-field { | |||
margin-bottom: 10px; | |||
} | |||
.button-group button { | |||
margin-right: 10px; | |||
padding: 8px 15px; | |||
cursor: pointer; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<p style="font-family: 'Consolas', monospace; padding: 20px; margin: 20px"> | |||
<div class="Passwortgenerator-links" style="float: left; width: 50%;"> | |||
<div class="form-field"> | |||
<label for="length">Passwortlänge:</label> | |||
<input type="number" id="length" value="17"> | |||
</div> | |||
<div class="form-field"> | |||
<label for="vowels">Vokale:</label> | |||
<input type="text" id="vowels" value="aeiou"> | |||
</div> | |||
<div class="form-field"> | |||
<label for="consonants">Konsonanten:</label> | |||
<input type="text" id="consonants" value="bcdfghjklmnpqrstvwxyz"> | |||
</div> | |||
<div class="form-field"> | |||
<label for="digits">Zahlen:</label> | |||
<input type="text" id="digits" value="0123456789"> | |||
</div> | |||
<div class="form-field"> | |||
<label for="numDigits">Anzahl der Zahlenstellen:</label> | |||
<input type="number" id="numDigits" value="4"> | |||
</div> | |||
<div class="form-field"> | |||
<label for="specials">Sonderzeichen:</label> | |||
<input type="text" id="specials" value="!$%&/=?+*#-."> | |||
</div> | |||
<div class="form-field"> | |||
<label for="count">Anzahl der Passwörter:</label> | |||
<select id="count"> | |||
<option value="1">1</option> | |||
<option value="3">3</option> | |||
<option value="8" selected>8</option> | |||
<option value="10">10</option> | |||
<option value="25">25</option> | |||
<option value="50">50</option> | |||
<option value="100">100</option> | |||
</select> | |||
</div> | |||
<div class="form-field button-group"> | |||
<button id="generate">Passwörter erstellen</button> | |||
<button id="save-settings">Einstellungen speichern</button> | |||
<button id="reset-settings">Standardeinstellungen laden & Cookie löschen</button> | |||
</div> | |||
<div class="form-field"> | |||
<textarea id="output" rows="10" cols="80" placeholder="Erzeugte Passwörter erscheinen hier..."></textarea> | |||
</div> | |||
<script> | |||
// Standardwerte für das Zurücksetzen | |||
const DEFAULTS = { | |||
length: 17, | |||
vowels: 'aeiou', | |||
consonants: 'bcdfghjklmnpqrstvwxyz', | |||
digits: '0123456789', | |||
numDigits: 4, | |||
specials: '!$%&/=?+*#-.' | |||
}; | |||
// Funktion zum Holen aller aktuellen Formularwerte | |||
function getCurrentSettings() { | |||
return { | |||
length: document.getElementById("length").value, | |||
vowels: document.getElementById("vowels").value, | |||
consonants: document.getElementById("consonants").value, | |||
digits: document.getElementById("digits").value, | |||
numDigits: document.getElementById("numDigits").value, | |||
specials: document.getElementById("specials").value, | |||
count: document.getElementById("count").value | |||
}; | |||
} | |||
// Funktion zum Setzen der Formularwerte | |||
function setFormSettings(settings) { | |||
for (const key in settings) { | |||
const element = document.getElementById(key); | |||
if (element) { | |||
element.value = settings[key]; | |||
} | |||
} | |||
} | |||
// #region Cookie-Funktionen | |||
const COOKIE_NAME = 'pwGenSettings'; | |||
function setCookie() { | |||
const settings = getCurrentSettings(); | |||
const json = JSON.stringify(settings); | |||
// Encode den JSON-String und setze das Cookie (gültig für 365 Tage) | |||
document.cookie = COOKIE_NAME + "=" + encodeURIComponent(json) + "; max-age=" + (365 * 24 * 60 * 60) + "; path=/"; | |||
alert("Einstellungen gespeichert!"); | |||
} | |||
function getCookie() { | |||
const name = COOKIE_NAME + "="; | |||
const decodedCookie = decodeURIComponent(document.cookie); | |||
const ca = decodedCookie.split(';'); | |||
for(let i = 0; i <ca.length; i++) { | |||
let c = ca[i]; | |||
while (c.charAt(0) === ' ') { | |||
c = c.substring(1); | |||
} | |||
if (c.indexOf(name) === 0) { | |||
try { | |||
// JSON-String extrahieren und parsen | |||
const json = c.substring(name.length, c.length); | |||
const settings = JSON.parse(json); | |||
setFormSettings(settings); | |||
console.log("Einstellungen aus Cookie geladen."); | |||
} catch (e) { | |||
console.error("Fehler beim Parsen des Cookies:", e); | |||
} | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
function deleteCookie() { | |||
// Setzt das max-age auf 0, um das Cookie sofort zu löschen | |||
document.cookie = COOKIE_NAME + "=; max-age=0; path=/"; | |||
setFormSettings(DEFAULTS); | |||
alert("Einstellungen auf Standard zurückgesetzt und Cookie gelöscht!"); | |||
} | |||
// #endregion Cookie-Funktionen | |||
// #region Original-Passwortgenerator-Logik | |||
// (Ihre Original-Logik, leicht angepasst zur Nutzung von getCurrentSettings) | |||
function generatePasswordLogic() { | |||
// Werte aus dem Formular einlesen (jetzt über Funktion) | |||
const settings = getCurrentSettings(); | |||
var totalLength = parseInt(settings.length, 10); | |||
var vowels = settings.vowels; | |||
var consonants = settings.consonants; | |||
var digitsAllowed = settings.digits; | |||
var numDigits = parseInt(settings.numDigits, 10); | |||
var specials = settings.specials; | |||
var passwordCount = parseInt(settings.count, 10); | |||
var output = ""; | |||
// Hilfsfunktion: Zufälliges Zeichen aus einem String auswählen | |||
function randomChar(str) { | |||
return str.charAt(Math.floor(Math.random() * str.length)); | |||
} | |||
// Hilfsfunktion: Erzeuge eine abwechselnde Zeichenkette (Vokal/Konsonant) der Länge "length" | |||
function generateAlternatingSequence(length, vowels, consonants) { | |||
if(length <= 0 || (vowels.length === 0 && consonants.length === 0)) return ""; | |||
var sequence = ""; | |||
// Zufällig entscheiden, ob mit Vokal oder Konsonant gestartet wird | |||
var useVowel = Math.random() < 0.5; | |||
// Logik zur Fehlervermeidung, falls eine Zeichenart fehlt | |||
if (vowels.length === 0 && consonants.length > 0) useVowel = false; | |||
if (consonants.length === 0 && vowels.length > 0) useVowel = true; | |||
for(var i = 0; i < length; i++){ | |||
if (useVowel && vowels.length > 0) { | |||
sequence += randomChar(vowels); | |||
// Nur wechseln, wenn Konsonanten verfügbar sind | |||
if (consonants.length > 0) useVowel = false; | |||
} else if (!useVowel && consonants.length > 0) { | |||
sequence += randomChar(consonants); | |||
// Nur wechseln, wenn Vokale verfügbar sind | |||
if (vowels.length > 0) useVowel = true; | |||
} else { | |||
// Fallback: Wenn beide fehlen oder nur eine Art, die Schleife verlassen oder ein Ersatzzeichen verwenden | |||
break; | |||
} | |||
} | |||
return sequence; | |||
} | |||
// Passwortgenerierungsschleife | |||
for(var p = 0; p < passwordCount; p++){ | |||
// Berechne die Länge des nicht-numerischen Teils | |||
// ACHTUNG: Die Zeile "letterSectionLength = letterSectionLength -1;" vor der Definition ist fehlerhaft und wurde entfernt. | |||
// Die Logik besagt: Gesamt - Zahlenlänge = Restlänge (Wörter + 2 Specials) | |||
var letterSectionLength = totalLength - numDigits; | |||
// Die Gesamtlänge der Wörter ist Restlänge - 2 Sonderzeichen | |||
var totalWordLength = letterSectionLength - 2; | |||
if (totalWordLength < 0) totalWordLength = 0; // Fehler abfangen, falls das Passwort zu kurz ist | |||
// Bestimme die Basislänge für den ersten Buchstabenteil: GesamtWortLänge geteilt durch 2, gerundet | |||
var baseFirstPart = Math.round(totalWordLength / 2); | |||
// Zufällige Anpassung um -1, 0 oder 1 | |||
var adjustment = [-1, 0, 1][Math.floor(Math.random() * 3)]; | |||
var firstPartLength = baseFirstPart + adjustment; | |||
// Sicherstellen, dass der erste Teil in einen sinnvollen Bereich fällt | |||
if(firstPartLength < 0) firstPartLength = 0; | |||
if(firstPartLength > totalWordLength) firstPartLength = totalWordLength; | |||
// Die Länge des zweiten Buchstabenteils ergibt sich aus dem Rest | |||
var secondPartLength = totalWordLength - firstPartLength; | |||
// Erzeuge den ersten alternierenden Buchstabenteil | |||
var firstPart = generateAlternatingSequence(firstPartLength, vowels, consonants); | |||
// Erzeuge den zweiten alternierenden Buchstabenteil | |||
var secondPart = generateAlternatingSequence(secondPartLength, vowels, consonants); | |||
// Stelle sicher, dass der erste Buchstabe beider Wörter groß geschrieben wird, falls vorhanden | |||
if(firstPart.length > 0) { | |||
firstPart = firstPart.charAt(0).toUpperCase() + firstPart.slice(1); | |||
} | |||
if(secondPart.length > 0) { | |||
secondPart = secondPart.charAt(0).toUpperCase() + secondPart.slice(1); | |||
} | |||
// Zufälliges Sonderzeichen zwischen den Wörtern auswählen | |||
var specialChar1 = specials.length > 0 ? randomChar(specials) : ''; | |||
// Zufälliges Sonderzeichen zwischen Wörtern und Zahl auswählen | |||
var specialChar2 = specials.length > 0 ? randomChar(specials) : ''; | |||
// Erzeuge den numerischen Teil (Ziffern) | |||
var digitSequence = ""; | |||
for(var d = 0; d < numDigits && digitsAllowed.length > 0; d++){ | |||
digitSequence += randomChar(digitsAllowed); | |||
} | |||
// Komplettes Passwort zusammensetzen | |||
var password = firstPart + specialChar1 + secondPart + specialChar2 + digitSequence; | |||
// Kürzen, falls das Passwort zu lang ist, was theoretisch passieren kann, falls totalWordLength sehr klein ist, aber numDigits groß. | |||
if (password.length > totalLength) { | |||
password = password.substring(0, totalLength); | |||
} | |||
output += password + "\n"; | |||
} | |||
// Ausgabe in das Textfeld schreiben | |||
document.getElementById("output").value = output; | |||
} | |||
// #endregion Original-Passwortgenerator-Logik | |||
// Event Listener einrichten | |||
window.addEventListener("load", function() { | |||
// Versuche, Einstellungen aus Cookie zu laden | |||
getCookie(); | |||
document.getElementById("generate").addEventListener("click", generatePasswordLogic); | |||
document.getElementById("save-settings").addEventListener("click", setCookie); | |||
document.getElementById("reset-settings").addEventListener("click", deleteCookie); | |||
}); | |||
</script> | |||
</div> | |||
<div class="Passwortgenerator-rechts" style="float: right; width: 47%;"> | |||
<strong>Der Passwortgenerator funktioniert nach folgenden Regeln:</strong><br> | |||
<ul> | |||
<li>Hinten werden Zahlen angehängt</li> | |||
<li>Die Zahl besteht aus den Ziffern die in dem Feld vorkommen (man kann auch was anderes hinzufügen oder löschen)</li> | |||
<li>Die Anzahl der Stellen ist festgelegt, z.B. auf 4</li> | |||
<li>Die Gesamtlänge - Anzahl der Stellen ergibt die Restlänge (Wörter + 2 Sonderzeichen)</li> | |||
<li>Von dieser Restlänge wird **2 abgezogen** (1 für das Sonderzeichen zwischen den Wörtern und 1 für das Sonderzeichen zwischen dem 2. Wort und der angehängten Zahl). Bei 17 Zeichen - 4 Zahlen - 2 Sonderzeichen bleibt also **11 Buchstaben**.</li> | |||
<li>Diese Restlänge wird durch **2 geteilt**. Ggf. wird dabei aufgerundet. Das ergibt die Basislänge des ersten Wortes, z.B. $\text{Rund}(\frac{11}{2}) = 6$</li> | |||
<li>Diese Länge wird zufällig um 1 erhöht oder verringert oder unverändert gelassen. Die neue Länge ist in diesem Beispiel also 5, 6 oder 7</li> | |||
<li>Für den ersten Teil wird zufällig entschieden ob mit einem Vokal oder einen Konsonanten begonnen wird<li> | |||
<li>Es werden nun abwechseln Konsonanten und Vokale aneinander gereiht bis die Wortlänge erreicht ist</li> | |||
<li>Der erste Buchstabe wird in einen Großbuchstaben geändert</li> | |||
<li>Es wird ein Sonderzeichen angehängt ($\text{specialChar1}$)</li> | |||
<li>Das zweite Wort wird nach den gleichen Regeln wie das erste erzeugt (Restlänge der Buchstaben). Also wieder zufällig ob Konsonant oder Vokal, danach abwechselnd, erster Buchstabe groß</li> | |||
<li>Danach wird das 2. Sonderzeichen ($\text{specialChar2}$) und die Zahl angehängt</li> | |||
</ul> | |||
<br> | |||
Das ganze habe ich erstellt weil ich sehr gerne den <a target="_blank" rel="noopener noreferrer" href="https://www.gaijin.at/de/tools/password-generator">Gaijin Password Generator</a> benutze.<br> | |||
Dort insbesondere die <b>Internet-Passwörter 3 (14 Zeichen)</b><br> | |||
Wenn man aber weis das ich das gerne mache, ließen sich meine Passwörter so leicht erraten. Ich habe dann schon immer variiert bzw. mehrere dieser Kennwörter hintereinander gehängt.<br> | |||
Der Generator hier verwendet mehr Zufälle und variiert auch die Länge der Wörter und Zahlen auf Wunsch. | |||
Ich mag einfach das dabei künstliche Wörter herauskommen die sich leichter Tippen und bei Bedarf sogar merken lassen.<br> | |||
</div> | |||
</p> | |||
</body> | |||
</html> | </html> | ||
---- | ---- | ||
Version vom 16. Dezember 2025, 12:03 Uhr
Der Passwortgenerator funktioniert nach folgenden Regeln:
Das ganze habe ich erstellt weil ich sehr gerne den Gaijin Password Generator benutze.
Dort insbesondere die Internet-Passwörter 3 (14 Zeichen)
Wenn man aber weis das ich das gerne mache, ließen sich meine Passwörter so leicht erraten. Ich habe dann schon immer variiert bzw. mehrere dieser Kennwörter hintereinander gehängt.
Der Generator hier verwendet mehr Zufälle und variiert auch die Länge der Wörter und Zahlen auf Wunsch. Ich mag einfach das dabei künstliche Wörter herauskommen die sich leichter Tippen und bei Bedarf sogar merken lassen.
- Hinten werden Zahlen angehängt
- Die Zahl besteht aus den Ziffern die in dem Feld vorkommen (man kann auch was anderes hinzufügen oder löschen)
- Die Anzahl der Stellen ist festgelegt, z.B. auf 4
- Die Gesamtlänge - Anzahl der Stellen ergibt die Restlänge (Wörter + 2 Sonderzeichen)
- Von dieser Restlänge wird **2 abgezogen** (1 für das Sonderzeichen zwischen den Wörtern und 1 für das Sonderzeichen zwischen dem 2. Wort und der angehängten Zahl). Bei 17 Zeichen - 4 Zahlen - 2 Sonderzeichen bleibt also **11 Buchstaben**.
- Diese Restlänge wird durch **2 geteilt**. Ggf. wird dabei aufgerundet. Das ergibt die Basislänge des ersten Wortes, z.B. $\text{Rund}(\frac{11}{2}) = 6$
- Diese Länge wird zufällig um 1 erhöht oder verringert oder unverändert gelassen. Die neue Länge ist in diesem Beispiel also 5, 6 oder 7
- Für den ersten Teil wird zufällig entschieden ob mit einem Vokal oder einen Konsonanten begonnen wird
- Es werden nun abwechseln Konsonanten und Vokale aneinander gereiht bis die Wortlänge erreicht ist
- Der erste Buchstabe wird in einen Großbuchstaben geändert
- Es wird ein Sonderzeichen angehängt ($\text{specialChar1}$)
- Das zweite Wort wird nach den gleichen Regeln wie das erste erzeugt (Restlänge der Buchstaben). Also wieder zufällig ob Konsonant oder Vokal, danach abwechselnd, erster Buchstabe groß
- Danach wird das 2. Sonderzeichen ($\text{specialChar2}$) und die Zahl angehängt
Das ganze habe ich erstellt weil ich sehr gerne den Gaijin Password Generator benutze.
Dort insbesondere die Internet-Passwörter 3 (14 Zeichen)
Wenn man aber weis das ich das gerne mache, ließen sich meine Passwörter so leicht erraten. Ich habe dann schon immer variiert bzw. mehrere dieser Kennwörter hintereinander gehängt.
Der Generator hier verwendet mehr Zufälle und variiert auch die Länge der Wörter und Zahlen auf Wunsch. Ich mag einfach das dabei künstliche Wörter herauskommen die sich leichter Tippen und bei Bedarf sogar merken lassen.
Changelog:
- 22.02.2025 erste Version
- 09.06.2025 Länge auf 17 Zeichen erhöht, 2. Sonderzeichen vor der Zahl, Beschreibung angepasst
- 09.07.2025 Fehler Sonderzeichen behoben, es wurde 2 mal das gleiche genommen
Loading comments...
