Problema scrittura/lettura EEPROM!!

Salve a tutti, ecco il mio problema: quando arduino si avvia, vorrei che andasse a cercare il contenuto di due file, dove sono salvate una password e una chiave. Queste le voglio salvare nella EEPROM, supponendo che sia una soluzione più “sicura” rispetto lasciarle nella SD (se qualcuno ha qualche consiglio utile per l’obiettivo “sicurezza”, è il benveniuto XD ).
Ecco la funzione utilizzata per salvare nella EEPROM:

void writeEEProm(char *pass, int dim, int start){
  for(int i=start;i < (dim+start);i++){
    EEPROM.write(i,pass[i]);
  }
  free(pass);
}

che richiamo appunto 2 volte: prima per salvare la chiave, poi per salvare la password:

writeEEProm(key, sizeof(key)/sizeof(char), 0);
writeEEProm(pwd, i,21);

Ho verificato che le letture da file vanno a buon fine, passo alla funzione i valori giusti. Però stampando il vettore pass passato alla funzione, scopro che per la scrittura della chiave va tutto a buon fine:
STAMPO VETTORE PASS: cT6jArSwkE4WHxm5Zgkz

mentre quando voglio salvare la password:
STAMPO VETTORE PASS: E4WHxm5Z :cold_sweat:

e non riesco a capire il perchè, dato che al vettore *pass passo il valore “provapwd”! :astonished:
Qualcuno sa svelare l’arcano??

pwd com'è definito? i cos'è? dove lo assegni?
Non è che fai la pipì fuori dal vasino? (off by one) :grin:

Non conosco tutto il codice, comunque perchè non usi una struttura e il metodo per salvare/caricare questa in modo semplice?
Nel playground c'è del codice pronto che fa questo per tè, ti basta creare una struct riempirla con in valori e automaticamente gestisce offset della cella, anche se nella struttura ci sono dati float oltre che char ecc.
Faccio una ricerca veloce nel playgrond per te, tu invece falla approfondita non si sa mai ci sia qualcosa di meglio
di quello che ho visto io.

Poi sembra che tu usi l'allocazione della memoria dinamica malloc, ma il codice non lo vedo, comunque a livello di codice il free(pass) non devi inserirlo nella funzione, ma allo stesso livello di codice in cui chiami malloc.

Mentre se non usi malloc allora devi togliere free(pass) dalla funzione e non inserirlo in altro posto.

Inoltre ma questa è una finezza, dovresti passare il puntatore così: (const char *passwd const), in questo modo se tenti di modificare il puntatore o il contenuto puntato il compilatore darà errore. Si chiama dato costante a puntatore costante.

Ciao.

2 minuti più tardi:
Trovato questo, ma te lo devi studiare, sembra ottimo e può scrivere/leggere dati in blocco, strutture, array.
http://thijs.elenbaas.net/2012/07/extended-eeprom-library-for-arduino/
altri 2 minuti più tardi:
http://playground.arduino.cc//Code/EEPROMLoadAndSaveSettings

garrard08:
Salve a tutti, ecco il mio problema: quando arduino si avvia, vorrei che andasse a cercare il contenuto di due file, dove sono salvate una password e una chiave. Queste le voglio salvare nella EEPROM, supponendo che sia una soluzione più "sicura" rispetto lasciarle nella SD (se qualcuno ha qualche consiglio utile per l'obiettivo "sicurezza", è il benveniuto XD ).

Le password si salvano sempre in forma di hash crittografico. In questo modo puoi lasciare il file nella SD senza timore che qualcuno, aprendolo possa recuperare la password. Gli hash sono nati proprio per lasciare "a giro" i dati.
Un hash crittografico sicuro è SHA-256 (non usare MD5, è troppo debole ed è già stato violato).

Un hash, non so se lo sai, è un "riassunto" digitale di lunghezza fissa di una informazione, sia essa una frase come sia essa la Divina commedia. L'hash genera sempre un riassunto di lunghezza prefissata. L'SHA-256 genera un riassunto di 256 bit, crittograficamente sufficienti per avere un buon livello di sicurezza.

Mettiamo che la password sia BLOCCONOTE.
Il suo hash SHA-256 è:
76d3f699462108bc252d8e24fa21d78d6d189c34109c4f12d57c8846ebc60cba
(è reale, generato su terminale con sha256sum).

A questo punto tu salvi questa stringa nel tuo file.
Al momento del login, basta che tu richieda la password, ne faccia il riassunto con SHA-256 e lo confronti con quello salvato nel file. Se differiscono, la password è diversa e blocchi l'accesso.
Se il file non esiste, blocchi l'acceso.

Nessuno ti vieta di salvare l'hash in EEPROM, come vuoi fare tu.

Ce ne sono altri, basta cercare.

Secondo me la variabile pwd è memorizzata vicino a key.
Forse sbagli i calcoli di i e per qualche motivo pwd+start va a puntare alla variabile key
Sembra che quando stampi pwd, in realtà stai "vedendo" un pezzo di key.

Dovresti postare il codice "almeno" di come calcoli i e come dichiari le variabili pwd e key.
Altrimenti il mistero è veramente arcano e l'unica è rivolgersi a un mago con palla di vetro.

@nid69ita: la pwd è salvata vicino a key:
dalla posizione 0-19 c’è key, dalla 21 alla 30 pwd. Stampando pwd vedo un pezzo di chiave, fino li c’ero, è il perchè che non capisco… comunque le variabili sono così dichiarate:
char pwd[12]; char key[20];

@leo72: mi piace molto questa soluzione, e farebbe proprio al caso mio!! solo che quando provo ad importare la libreria ottengo il seguente errore:
In file included from UploadPwdKey.ino:3:
/home/arduino-1.0.3/libraries/Sha/sha256.h:26: error: conflicting return type specified for ‘virtual void Sha256Class::write(uint8_t)’
/home/arduino-1.0.3/hardware/arduino/cores/arduino/Print.h:48: error: overriding ‘virtual size_t Print::write(uint8_t)’

qualcuno sa come risolvere?

Quegli errori escono perché la libreria non è aggiornata alla nuove versioni dell'IDE.
Dovresti cercare una libreria aggiornata oppure contattare l'autore per aggiornarla oppure passare ad una vecchia versione dell'IDE.
Oppure aggiornarla tu. :smiley:

PaoloP:
Quegli errori escono perché la libreria non è aggiornata alla nuove versioni dell'IDE.
Dovresti cercare una libreria aggiornata oppure contattare l'autore per aggiornarla oppure passare ad una vecchia versione dell'IDE.
Oppure aggiornarla tu. :smiley:

Quoto.

garrard08:
@nid69ita: la pwd è salvata vicino a key:
dalla posizione 0-19 c'è key, dalla 21 alla 30 pwd. Stampando pwd vedo un pezzo di chiave, fino li c'ero, è il perchè che non capisco.. comunque le variabili sono così dichiarate:
char pwd[12]; char key[20];

Senza il codice completo non possiamo capire dove sbagli (un errore c'e' sicuramente nel tuo codice ma non nei pezzi che hai postato).

leo72:
(non usare MD5, è troppo debole ed è già stato violato).

la violazione dell' Md5 però fornisce molti conflitti non è che la trovi proprio al primo tentativo
Chi gli converte la stringa password in hash-256? che lo faccia arduino sarà dura :astonished:

pablos:
Chi gli converte la stringa password in hash-256? che lo faccia arduino sarà dura :astonished:

E perché? Mica ci mette 1 giorno, anche se la computazione richiede 100 ms, è sempre un tempo accettabile .

Sappiamo che gli AVR non sono chip molto performanti ma qui non chiediamo di calcolare l'hash di un file da 100K (cosa che anche un computer elabora con un po' di tempo) ma di calcolare l'hash di una password di una decina di caratteri.

Non so quanto tempo ci mette, non conosco questo tipo di cifratura, per il mio login in html mi sono fermato all'MD5 con qualche chiavetta variabile, più per hobby che per proteggere il led da qualche mal intenzionato :slight_smile:
Avevo visto un po' di tempo fa che per convertire le stringhe in MD5 con arduino era un delirio con 32byte così mi sono limitato a far creare la stringa al browser (ormai lo hanno tutti linux-android-windows) e confrontarla con quella nella eeprom usando il digest realm md5 prendendo spunto da qui Digest access authentication - Wikipedia, funziona bene, ma ora mi hai messo la pulce nell'orecchio mi tocca migliorare la protezione del mio led mannaggia a ...... :slight_smile: :grin: :smiley:

ciao

I test li ho fatti io.
Ho modificato la lib SHA256 di Cryptosuite affinché compilasse con l'IDE 1.0.x e con un testo lungo una cinquantina di byte ho ottenuto un tempo di calcolo di 35 ms

leo72:
Ho modificato la lib SHA256 di Cryptosuite affinché compilasse con l'IDE 1.0.x

Hai messo le modifiche nel tuo github? Mi ricordi l'indirizzo? :wink:

PaoloP:

leo72:
Ho modificato la lib SHA256 di Cryptosuite affinché compilasse con l'IDE 1.0.x

Hai messo le modifiche nel tuo github? Mi ricordi l'indirizzo? :wink:

Non ce le ho messe ancora. Le modifiche le ho fatte ieri notte di corsa. Lo farò.
Comunque è

Se vuoi usare la eeprom la prima cosa da fare è una mappa dei dati che ci vuoi salvare, in questo modo se hai dei dubbi sulle posizioni di lettura e scritturate li risolvi in un attimo, vedi Ardupower.
Li la password l'ho salvata in chiaro, tanto è dentro il micro, ma due volte, così se mentre la salvo si corrompe posso comunque entrare nel dispositivo.

Alberto

@PaoloP:
Non c'è bisogno che lo faccia io... qualcun altro ha già fatto il fork e messa online la versione compatibile IDE 1.0.

Perfetto. :wink:

Grazie!! giuentilissimo :wink:

Visto che vi vedo molto preparati e grintosi, mi sento in dovere di farvi un'altra domanda: volendo violare un web server arduino, qual è il livello di difficoltà nell'accedere i file che ha sulla SD? E accedere alla EEPROM è più difficile o allo stesso livello di difficoltà?
Già so che un bravo hacker riuscirebbe a fare qualsiasi cosa, però se già non è semplice accedere ai file della SD, vorrei evitare di appesantire il sistema con troppa sicurezza.. se invece farlo è quasi banale, allora sono costretto a implementare delle politiche di sicurezza..

Ho delle idee a riguardo, ma sinceramente non sono convinto sulla loro bontà.. :roll_eyes:

Su questo non mi esprimo, lato web sono pari a 0 quindi non so usando un server su Arduino a che rischi vai incontro.