Bonjour,
Merci de ta réponse ! Non, je ne suis pas un spécialiste de la sécurité, loin de là. Mais je ne suis ni une banque, ni la NSA, ni un organisme de vente par correspondance. Juste un peu de discrétion me suffit amplement.
Pour simplifier les échanges, je te passe les quelques pages de test :
La première, la fonction "Verifie"
var total_erreur = 0;
function Check() {
var tabc = Check.arguments;
var ok = 0;
var tab = " azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789_$&#@";
for (var no = 0; no < tabc.length; no++) {
checksum = tabc[no];
var login = "alsacreation";
var nblog = login.length;
var password = document.forms["flog"].elements["password"].value;
var nbpass = password.length;
var sum = 1;
// Calcul de la checksum. La fonction est modifiable !
var n = Math.max(nblog, nbpass)
for (var i = 0; i < n; i++) {
var index1 = tab.indexOf(login.substring(i, i + 1)) + 10;
var index2 = tab.indexOf(password.substring(i, i + 1)) + 10;
sum = sum + (index1 * n * (i + 1)) * (index2 * (i + 1) * (i + 1));
}
// Test de la checksum
// Checksum OK
if (sum == checksum) {
location = "P2.html";
ok = 1;
no = 100;
}
//Checksum not OK
}
if (ok == 0) {
total_erreur++;
alert("Mauvais login ou mot de passe");
// Après 3 essais, redirection...
if (total_erreur > 2) {
alert("Vous avez atteint les 3 essais !\n");
location = "./erreur.html";
}
}
}
function Verifie() {
Check(32336389)
}
Deuxième page, la page d'appel :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Page 1 test</title>
<script src="psw.js"></script>
</head>
<body>
<div>
<p><center>
<form onSubmit="Verifie();return false;" action="#" method="get" name="flog">
<font size=2 face="arial">Votre identifiant : </font>
<input type="password" name="password" size=30>
<input type='submit' name="bouton" value='Validez'>
</form>
</center>
</p>
</div>
</body>
</html>
Troisième page, la page appelée :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Page 2 test</title>
</head>
<body>
<div>
<p><center>
Vous êtes dans la page 2
</center></p>
</div>
</body>
</html>
Et enfin le générateur de clé, qui lui ne tourne que sur ma machine personnelle :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Calculer son checks - Logins et mots de passe multiples</title>
<SCRIPT LANGUAGE="JavaScript">
function Calculer() {
var tab = " azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789_$&#@";
var login = document.forms[0].elements["login"].value;
var password = document.forms[0].elements["password"].value;
var nblog = login.length;
var nbpass = password.length;
var sum = 1;
var n = Math.max(nblog, nbpass)
for (var i = 0; i < n; i++) {
var index1 = tab.indexOf(login.substring(i, i + 1)) + 10;
var index2 = tab.indexOf(password.substring(i, i + 1)) + 10;
sum = sum + (index1 * n * (i + 1)) * (index2 * (i + 1) * (i + 1));
}
document.forms[0].elements["checksum"].value = sum;
}
</SCRIPT>
</head>
<body>
<h1>Protection par logins et mots de passe multiples</h1>
<h2>Comment ça marche ?</h2>
<p>Le principe est simple : le LOGIN est le nom de la page HTML qu'il protége.
Le navigateur charge donc la page <B>login+".html"</B> quand le couple LOGIN / MOT DE PASSE est valide.<BR>
Pour éviter de charger une page qui n'existe pas (cas d'un login erroné),
on calcule une checksum à partir des caractéres du login et du mot de passe saisi.<BR>
On compare ensuite cette checkcum avec celle du script. Si elles sont égales,
on a (presque) toutes les chances pour que le login saisi soit le bon. Ainsi, la page à charger
existe et on ne risque pas l'erreur 404 - Page non trouvée.<BR>
Cette checksum rend un chiffre assez grand (pour éviter de tomber par hasard sur la même
avec un mot de passe différent). Mais elle ne permet pas de trouver le mot de passe.<BR>
La seule solution pour trouver le login et le mot de passe est d'essayer toutes les combinaisons !<BR><BR>
Pour trouver la checksum d'un nouveau couple LOGIN / MOT DE PASSE, voyez la suite.<BR><BR>
Une fois que vous avez toutes les checksum de vos mots de passe, vous les ajoutez dans l'entête de la page
qui contient le formulaire de saisie de cette façon :<BR>
function Verifie() {<BR>
Check(1111111,2222222,3333333)<BR>
}<BR>
en remplaçant par les vraies valeurs de checksum.
</p>
<hr>
<div id="cal">
<h2 id="h2cal">le login et le mot de passe associé</h2>
<center><FORM>
<TABLE border=0>
<TR>
<TD>
<FONT size=2 face="arial">LOGIN : ></FONT>
</TD>
<TD><INPUT name="login" type='text' size=20></TD>
</TR>
<TR>
<TD>
<FONT size=2 face="arial">PASSWORD : ></FONT>
</TD>
<TD><INPUT type="text" name="password" size=20></TD>
</TR>
<TR>
<TD colspan=2 align=center><INPUT type='button' value='Calculer la checksum' onClick="Calculer()">
</TD>
</TR>
<TR>
<TD colspan=2 align=center><INPUT type='text' name="checksum" size=20></TD>
</TR>
</TABLE>
</FORM>
</center>
</div>
</body>
Donc, à aucun moment les mots de passe ne transitent par le réseau. Comme dit dans mon précédent message, si, dan la page 1 je laisse type = "password", peut-être que les pare-feux en route bloquent tout. Par contre, si je passe en type = "text", ça passe.
Si vous lancez le page 1, le mot de passe est "zorro", mais en suivant les infos du générateur, et en utilisant le login"alsacreation", vous pouvez faire ce que vous
Ma configuration :
Le serveur sur Raspberry Pi 3 B+, avec Nginx, derrière une Freebox.
J'espère avoir été assez clair dans mes explications
Avec mes remerciements et mes meilleures salutations
H.