Arrêtez la folie !
Mon point faible est que chaque outil d'inscription autorise un ensemble différent de caractères spéciaux. Certains peuvent n'autoriser que les caractères suivants @#$%&*
alors que d'autres n'autorisent peut-être pas *
mais autorisent d'autres choses. Tous les générateurs de mots de passe que j'ai rencontrés sont binaires en ce qui concerne les caractères spéciaux. Ils vous permettent de les inclure ou non. Je dois donc passer en revue des tonnes d'options et rechercher les caractères aberrants qui ne répondent pas aux exigences jusqu'à ce que je trouve un mot de passe qui fonctionne. Plus le mot de passe est long, plus cela devient fastidieux. Enfin, j'ai remarqué que, parfois, les outils d'inscription ne permettent pas de répéter le même caractère deux fois de suite, mais les générateurs de mots de passe ne semblent pas en tenir compte. C'est de la folie !
Je l'ai créé pour moi-même afin de pouvoir coller l'ensemble exact des caractères spéciaux autorisés. Je ne prétends pas que c'est un code élégant. Je l'ai juste assemblé pour répondre à mes besoins.
De plus, je n'ai jamais pensé qu'un outil d'inscription n'autorisait pas les chiffres ou n'était pas sensible à la casse. Mes mots de passe comportent donc toujours au moins un chiffre, une lettre majuscule, une lettre minuscule et un caractère spécial. La longueur minimale est donc de 4. Techniquement, je peux contourner l'exigence relative aux caractères spéciaux en saisissant simplement une lettre si nécessaire.
const getPassword = (length, arg) => {
length = document.getElementById("lengthInput").value || 16;
arg = document.getElementById("specialInput").value || "~!@#$%^&*()_+-=[]{}|;:.,?><";
if (length < 4) {
updateView("passwordValue", "passwordValue", "", "P", "Length must be at least 4");
return console.error("Length must be at least 4")
} else if (length > 99) {
updateView("passwordValue", "passwordValue", "", "P", "Length must be less then 100");
return console.error("Length must be less then 100")
}
const lowercase = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
const uppercase = lowercase.join("").toUpperCase().split("");
const specialChars = arg.split("").filter(item => item.trim().length);
const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let hasNumber = false;
let hasUpper = false;
let hasLower = false;
let hasSpecial = false;
if (Number(length)) {
length = Number(length)
} else {
return console.error("Enter a valid length for the first argument.")
}
let password = [];
let lastChar;
for (let i = 0; i < length; i++) {
let char = newChar(lowercase, uppercase, numbers, specialChars);
if (char !== lastChar) {
password.push(char);
lastChar = char
if (Number(char)) {
hasNumber = true
}
if (lowercase.indexOf(char) > -1) {
hasLower = true
}
if (uppercase.indexOf(char) > -1) {
hasUpper = true
}
if (specialChars.indexOf(char) > -1) {
hasSpecial = true
}
} else {
i--
}
if (i === length - 1 && (!hasNumber || !hasUpper || !hasLower || !hasSpecial)) {
hasNumber = false;
hasUpper = false;
hasLower = false;
hasSpecial = false;
password = [];
i = -1;
}
}
function newChar(lower, upper, nums, specials) {
let set = [lower, upper, nums, specials];
let pick = set[Math.floor(Math.random() * set.length)];
return pick[Math.floor(Math.random() * pick.length)]
}
updateView("passwordValue", "passwordValue", "", "P", password.join(""));
updateView("copyPassword", "copyPassword", "", "button", "copy text");
document.getElementById("copyPassword").addEventListener("click", copyPassword);
}
const copyPassword = () => {
let text = document.getElementById("passwordValue").textContent;
navigator.clipboard.writeText(text);
};
const updateView = (targetId, newId, label, element, method = '') => {
let newElement = document.createElement(element);
newElement.id = newId;
let content = document.createTextNode(label + method);
newElement.appendChild(content);
let currentElement = document.getElementById(targetId);
let parentElement = currentElement.parentNode;
parentElement.replaceChild(newElement, currentElement);
}
document.getElementById("getPassword").addEventListener("click", getPassword);
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div>
<button id="getPassword">Generate Password</button>
<input type="number" id="lengthInput" placeholder="Length">
<input type="text" id="specialInput" placeholder="Special Characters">
<p id="passwordValue"></p>
<p id="copyPassword"></p>
</div>
</body>
</html>