Stocker mot de passe en eeprom

Bonjour, je cherche la méthode la plus simple pour stoker et lire une chaine stoké en eeprom d'un arduino uno.

Pour une variable sa semble facile mais pour des caracteres je ne trouve pas.

Il me semble que tout est dans la doc de la librairie EEPROM.
Voir put et get qui permettent de manipuler tous les types de variables ou d'objets avec, en prime, l'écriture que si le contenu a changé pour limiter le nombre d'écritures à l'essentiel.

Question bête : pourquoi stocker un mot de passe en EEPROM ?
L'EEPROM sert à stocker des informations:

  • qui sont élaborées ou modifiées au cours du fonctionnement du programme (un comptage par exemple),
  • et qui doivent être retrouvées après une coupure de courant.
    Un mot de passe, en général, ne varie pas au cours de l'exécution du programme, il peut très bien être stocké dans le programme lui-même. Pas besoin de l'EEPROM !

Pour que l'utilisateur final puisse le choisir et le changer ?

ah oui OK - donc info modifiée en cours d'exécution.

c'est quand même assez courant de pouvoir modifier un mot de passe :slight_smile:
c'est même recommandé

un truc comme cela pour le put et get (attention il faut que le '\0' de fin de chaîne rentre dans le tableau)

#include <EEPROM.h>
char mdp[20] = "m0tD3Pa$$";

void setup() {
  Serial.begin(115200);
  EEPROM.put(10, mdp); // on stocke les 20 octets à partir de l'adresse 10 en EEPROM

  char mdpLecture[20];
  EEPROM.get(10, mdpLecture); // on relit les 20 octets à partir de l'adresse 10 en EEPROM

  if (strcmp(mdp, mdpLecture) == 0) {
    Serial.print("J'ai bien lu : "); Serial.println(mdpLecture);
  } else {
    Serial.print("Erreur J'ai lu : "); Serial.println(mdpLecture);
  }
}

void loop() {}

ensuite comme c'est assez facile de lire l'EEPROM d'un UNO...

1 Like

Bonjour

bah suffit d'encoder le mdp et de stocker le code. (genre MD5 c'est suffisant)
Après si qq1 veut cracker le truc il le crackera.

Merci, c'est ce que je voulais, je vais l'ajouter a mon code

Est ce que le fait d'utiliser la fonction F par exemple comme ceci:

client.println(F("<button type="submit">Envoyer"));

Peut provoquer une ecriture a l'endroit ou se trouve mon mot de passe?

Car j'ai des caracteres bizarres qui s'affichent a la place du mot de passe lorsque je fais:

Serial.println(mdpLecture);

F("xxx") met la chaîne xxx en mémoire flash, pas en EEPROM

mais on ne peut pas mettre de guillemets comme cela dans le texte, il faut un anti slash avant

client.println(F("<button type=\"submit\">Envoyer"));

postez votre code complet si vous voulez plus d'infos

Voici le caractere bizarre qui s'affiche dans le terminal:

bug

Mon code qui commence a être long:

#include <SPI.h>
#include <Ethernet.h> 
#include <EEPROM.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
byte ip[] = { 192, 168, 0, 178 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 0, 254 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
EthernetServer server(16678);                             //server port     
String readString = "";
char str;
byte connecte = 0;
int led1 = 1;
int led2 = 2;
int led3 = 3;
int led4 = 4;
String get0 = "";
String get1 = "";
IPAddress ip_client;
IPAddress ip_client_connecte;
char user;
char passe[20];


void setup() {
  pinMode(led1, OUTPUT); //led1 en sortie
  pinMode(led2, OUTPUT); //led2 en sortie
  pinMode(led3, OUTPUT); //led3 en sortie
  pinMode(led4, OUTPUT); //led4 en sortie

 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
 
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.println("*******************************************************");
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());



EEPROM.put(10, "passe");

}





void loop() {
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
      Serial.println("//////////////////////////////////////////////////////");
    Serial.print("Remote IP address: ");
    Serial.println(client.remoteIP());
    ip_client = client.remoteIP();


    while (client.connected()) {   
      if (client.available()) {
        char c = client.read();




     
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
         }

         //if HTTP request has ended
         if (c == '\n') {          
           Serial.println(readString); //print to serial monitor for debuging

          int longueur= readString.length();
          readString = readString.substring(0,longueur -11); //supprimer la fin
          readString = readString.substring(6,longueur); //supprimer le debut
       
          char *myCstring = readString.c_str();
          char *token;
          token = strtok(myCstring, "&");


           

            int i = 0;
           while( token != NULL ) {
              String str = token;
              int index = str.indexOf("=");
              String var = str.substring(index + 1);
              if(i==0){get0=var;}        //enregistre le mot de passe
              if(i==1){get1=var;}         ///enregistre le nom d'utilisateur
              token = strtok(NULL, "&");
              i++;
            }

            

      
            Serial.print("get0:");Serial.println(get0);
            Serial.print("get1:");Serial.println(get1);
            
              

               char mdpLecture[20];
              EEPROM.get(10, mdpLecture);
              Serial.print("mdplecture:");
              Serial.println(mdpLecture);

               ip_client_connecte = client.remoteIP();

            if(get0 == "admin" && get1 == mdpLecture && ip_client_connecte == ip_client) 
            {
                connecte=1;
                Serial.println("connecte");
            }





           if(get0 == "deconnexion"){
                 Serial.println("deconnexion");
                 connecte=0;
            }

            drive_pin(); // commander les sorties
  

            


            if(connecte == 1 && get0 == "change_passe")
            {
                get1 ="test"; //pour tester
                change_passe(client);  //afficher la page "mot de passe"
                if(get1 !=""){
                  EEPROM.put(10, get1); //enregistrer le mot de passe
                  }
            }
            else if (connecte == 1)
            {
               helloWorldPage(client); //affiche la page principale
            }
            else
            {
              formulaire(client);  //affiche la page d'autentification
            }







           delay(1);
           //stopping client
           client.stop();




            get0="";
            get1="";
      
            




            readString="";  
           
         }
       }
    }
}
}







 void drive_pin(){
          // **********************************led1***********************
          if(get0 == "button1on"){
                digitalWrite(led1, HIGH);
                 Serial.println("button 1 ON");
            }

            if(get0 == "button1off"){
                digitalWrite(led1, LOW);
                 Serial.println("button 1 OFF");
            }
            // **********************************led2***********************
          if(get0 == "button2on"){
                digitalWrite(led2, HIGH);
                 Serial.println("button 2 ON");
            }

            if(get0 == "button2off"){
                digitalWrite(led2, LOW);
                 Serial.println("button 2 OFF");
            }
            // **********************************led3***********************


            if(get0 == "button3on"){
                digitalWrite(led3, HIGH);
                 Serial.println("button 3 ON");
            }

            if(get0 == "button3off"){
                digitalWrite(led3, LOW);
                 Serial.println("button 3 OFF");
            }
            // **********************************led4***********************
            if(get0 == "button4on"){
                digitalWrite(led4, HIGH);
                 Serial.println("button 4 ON");
            }

            if(get0 == "button4off"){
                digitalWrite(led4, LOW);
                 Serial.println("button 4 OFF");
            }

}











void formulaire(EthernetClient& client){
           client.println(F("HTTP/1.1 200 OK"));
           client.println(F("Content-Type: text/html"));
           client.println(F("")); 
           client.println(F("<HTML>"));
           client.println(F("<HEAD>"));
           client.println(F("<meta name='apple-mobile-web-app-capable' content='yes' />"));
           client.println(F("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />"));
           client.println(F("<link rel='stylesheet' type='text/css' href='https://randomnerdtutorials.com/ethernetcss.css' />"));
           client.println(F("<TITLE>Formulaire</TITLE>"));
           client.println(F("</HEAD>"));
           client.println(F("<BODY>"));
           client.println(F("<H1>Autentification</H1>"));
           client.println(F("<hr />"));
           client.println(F("<H2>Votre ip est: "));
           client.println(ip_client); 
           client.println(F("</H2>"));
           client.println(F("<br />"));  
           client.println(F("<H2>Formulaire</H2>"));
           client.println(F("<br />"));  
           client.println(F("<form action=\"/\" method=\"GET\">"));
           client.println(F("USER:")); 
           client.println(F("<input type=\"text\" id=\"user\" name=\"user_name\" />"));   
           client.println(F("<br />")); 
           client.println(F("PASS:"));     
           client.println(F("<input type=\"text\" id=\"pass\" name=\"pass\" />"));
           client.println(F("<br />")); 
           client.println(F("<button type=\"submit\">Envoyer</button>"));
           client.println(F("</form>")); 
           client.println(F("<br />")); 
           client.println(F("</BODY>"));
           client.println(F("</HTML>"));
}




void helloWorldPage(EthernetClient& client) {
           client.println(F("HTTP/1.1 200 OK")); //send new page
           client.println(F("Content-Type: text/html"));
           client.println(F(""));     
           client.println(F("<HTML>"));
           client.println(F("<HEAD>"));
           client.println(F("<meta name='apple-mobile-web-app-capable' content='yes' />"));
           client.println(F("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />"));
           client.println(F("<link rel='stylesheet' type='text/css' href='https://randomnerdtutorials.com/ethernetcss.css' />"));
           client.println(F("<TITLE>Commandes de relais</TITLE>"));
           client.println(F("</HEAD>"));
           client.println(F("<BODY>"));
           client.println(F("<H1>Commandes de relais</H1>"));
           client.println(F("<hr />"));
           client.println(F("<br />"));  
           client.println(F("<H2>Vous etes Connecte</H2>"));
           client.println(F("<br />"));  
           client.println(F("<H2>Votre ip est: "));
           client.println(ip_client); 
           client.println(F("</H2>"));
           client.println(F("<br />"));  
           client.println(F("<a href=\"/?button1on\"\">Turn On LED 1</a>"));
           client.println(F("<a href=\"/?button1off\"\">Turn Off LED 1</a><br />"));   
           client.println(F("<br />"));  
           client.println(F("<a href=\"/?button2on\"\">Turn On LED 2</a>"));
           client.println(F("<a href=\"/?button2off\"\">Turn Off LED 2</a><br />")); 
           client.println(F("<br />"));  
           client.println(F("<a href=\"/?button3on\"\">Turn On LED 3</a>"));
           client.println(F("<a href=\"/?button3off\"\">Turn Off LED 3</a><br />")); 
           client.println(F("<br />"));  
           client.println(F("<a href=\"/?button4on\"\">Turn On LED 4</a>"));
           client.println(F("<a href=\"/?button4off\"\">Turn Off LED 4</a><br />"));
           client.println(F("<br />"));
           client.println(F("<hr />"));
           client.println(F("<br />")); 
           client.println(F("<a href=\"/?deconnexion\"\">Deconnexion</a>"));
           client.println(F("<a href=\"/?page=change_passe\"\">Changer passe</a><br />"));
           client.println(F("</BODY>"));
           client.println(F("</HTML>"));
}




void change_passe(EthernetClient& client){
           client.println(F("HTTP/1.1 200 OK"));
           client.println(F("Content-Type: text/html"));
           client.println(F("")); 
           client.println(F("<HTML>"));
           client.println(F("<HEAD>"));
           client.println(F("<meta name='apple-mobile-web-app-capable' content='yes' />"));
           client.println(F("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />"));
           client.println(F("<link rel='stylesheet' type='text/css' href='https://randomnerdtutorials.com/ethernetcss.css' />"));
           client.println(F("<TITLE>CHanger de mot de passe</TITLE>"));
           client.println(F("</HEAD>"));
           client.println(F("<BODY>"));
           client.println(F("<H1>Changer de mot de passe</H1>"));
           client.println(F("<hr />"));
           client.println(F("<H2>Votre ip est: "));
           client.println(ip_client); 
           client.println(F("</H2>"));
           client.println(F("<br />"));  
           client.println(F("<H2>Formulaire</H2>"));
           client.println(F("<br />"));  
           client.println(F("<form action=\"/\" method=\"GET\">"));
           client.println(F("<input type=\"hidden\" id=\"page\" name=\"page\" value=\"change_passe\" />")); 
           client.println(F("Nouveau mot de passe:")); 
           client.println(F("<input type=\"text\" id=\"passe\" name=\"passe\" />"));   
           client.println(F("<br />")); 
           client.println(F("<br />"));
           client.println(F("<button type=\"submit\">Envoyer</button>"));
           client.println(F("</form>")); 
           client.println(F("<br />")); 
           client.println(F("<br />")); 
           client.println(F("<a href=\"/\"\">Retour</a>"));
           client.println(F("</BODY>"));
           client.println(F("</HTML>"));
}




Je crois avoir trouvé le problème:

J'essai d'ecrire un string dans l'eeprom

A non, je viens de convertir avec c_str() j'ai toujours le problème

C’est une mauvaise idée - sans longueur n’est pas fixe et c’est une instance d’une classe dont la mémoire associée n’est pas dans la structure

Prenez un buffer comme je l’ai fait de la longueur max que vous voulez pouvoir conserver

➜ utilisez une cString

Je viens de tester ce code:

#include <EEPROM.h>
char mdp[20] = "m0tD3Pa$$";
String get0 = "";


void setup() {
  Serial.begin(115200);
  EEPROM.put(10, get0); // on stocke les 20 octets à partir de l'adresse 10 en EEPROM

  char mdpLecture[20];
  EEPROM.get(10, mdpLecture); // on relit les 20 octets à partir de l'adresse 10 en EEPROM


    Serial.print("J'ai bien lu : "); Serial.println(mdpLecture);
  
    Serial.print("Erreur J'ai lu : "); Serial.println(mdpLecture);
  
}

void loop() {}

J'ai cette erreur:

bug

Tu écris une String vide et tu essaies de lire un tableau de char.
Tu t'attendais à un miracle?

@fdufnews vous a donné la raison.

si vous voulez utiliser la classe String, il faut mettre son contenu textuel dans un buffer avant d'envoyer cela en EEPROM avec put

String get0 = "";
•••
  char buffer[20];
  strncpy(buffer, get0.c_str(), 20); // on copie au plus 20 octets 
  buffer[19] = '\0'; // on s'assure que l'on a bien une cString
  EEPROM.put(10, buffer); // on stocke les 20 octets à partir de l'adresse 10 en EEPROM

sinon vous pouvez lire le contenu de la String caractère par caractère et écrire ces caractères à des adresses successives en EEPROM

Comme expliqué dans la doc, put() et get() sont capables de manipuler toutes sortes de variables et d'objets, chacun avec ses caractéristiques.

get()
### Description
Read any data type or object from the EEPROM.

put()
#### Description
Write any data type or object to the EEPROM.

Pour pouvoir relire le contenu d'une structure ou d'un objet, il faut que get() connaissance son type pour en déduire sa structure interne (le nombre d'octets à lire et leur affectation, par exemple). Il faut donc que le type de la variable qui va recevoir les données du get() soit exactement du même type que la variable qui a été écrite par put().
il faut comprendre aussi que String et string sont deux entités complètement différentes.

  • String c'est un objet, qui contient une chaîne de caractères mais pas que ça.
  • string c'est juste un tableau de caractères terminé par \0

Merci, La, ligne:

 buffer[19] = '\0';

Est t'elle obligatoire? J'ai testé, sa marche sans elle.

Pourquoi ne puis je pas faire simplement:

 EEPROM.put(10, get0.c_str);

En tous cas, merci beaucoup a vous tous, j'ai modifié mon code et sa marche parfaitement, le mot de passe est bien modifié!