* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Febbraio 08, 2026, 02:32:07 pm

Inserisci il nome utente, la password e la durata della sessione.

164 Visitatori, 0 Utenti

Autore Topic: "verifica" password  (Letto 844 volte)

bonmario

  • Hero Member
  • *****
  • Post: 1440
  • Karma: +11/-1
"verifica" password
« il: Dicembre 20, 2025, 10:14:20 am »
Ciao a tutti,
scusate se non userò i termini corretti, ma sono abbastanza ignorante in materia ...
In un mio programma fatto con Lazarus, mi hanno chiesto di verificare una password immessa dall'utente.
Vorrei evitare di scrivere la password nel programma o di salvarla comunque in altre maniere, mi è però capitato di leggere che spesso, invece di salvarsi la password, ci si salva un "codice hash" relativo alla codifica della password.
Per caso avete qualche link e/o funzione da consigliarmi per gestire questa cosa?
In passato mi è capitato di fare qualcosa di simile, ma visto che la password che dovevo salvare non era importante, avevo fatto una semplice trascodifica.

Grazie, Mario

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1694
  • Karma: +52/-0
  • Prima ascoltare, poi decidere
Re:"verifica" password
« Risposta #1 il: Dicembre 20, 2025, 10:49:46 am »
Non ho compreso a pieno: vuoi salvare una password e poi in futuro verificare se l'immisione corrisponde a quanto salvato ?

Normalmente come hai detto correttamente si usano le funzioni di hashing, in modo che la password non venga salvata.

La funzione può essere riassunta in questo modo (copiata pari pari da Google ... da verificare verificata !!):

Codice: [Seleziona]
uses md5;

var
  StringaOriginale, HashRisultante: string;
begin
  StringaOriginale := 'La mia stringa da hashare';
  // Calcola l'hash MD5 e lo formatta come stringa esadecimale stampabile
  HashRisultante := MD5Print(MD5String(StringaOriginale));

  // Visualizza o utilizza l'hash (es. in una console o un controllo UI)
  Writeln(HashRisultante);
end;

P.S.: ci sono funzioni più complesse che si possono usare, come la criptatura tramite chiper (simmetrica) o la criptatura assimetrica, ma direi che sono oltre lo scopo.

P.S.2: l'hashing non ti consente di "ritornare indietro" (cioè dall'hash ricreare la password) ovviamente e non è univoco, cioè a diverse password potrebbe corrispondere lo stesso hash.

P.S.3: Occhio agli algoritmi fantasiosi da usare ... devono essere stabili nelle ERE (si, ere geologiche) ossia tra runtime diversi di Lazarus (ossia diverse versioni), diverse versioni di OS (ad esempio criptatura tramite SSL2 ora non più usabile) e diverse versioni di hardware.
« Ultima modifica: Dicembre 20, 2025, 11:03:25 am da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

bonmario

  • Hero Member
  • *****
  • Post: 1440
  • Karma: +11/-1
Re:"verifica" password
« Risposta #2 il: Dicembre 20, 2025, 04:02:57 pm »
Ti ringrazio per la risposta, do un occhio a quello che mi hai consigliato

Provo a spiegare meglio aggiungendo qualche dettaglio: da un mio programma, devo lanciare l'unzip di un file zip che è criptato tramite password. Lo zip può arrivare da 4 o 5 uffici diversi, al momento non ricordo di preciso, ed ognuno di loro lo crea con una password fissa.
Faccio un esempio con password semplici: l'ufficio di Milano usa come password "pippo", quello di Roma "pluto",e  così via
Chi usa il programma mi ha chiesto, come prima cosa di chiedere da dove arriva lo zip, poi di far digitare all'utente la password e, se non è quella corretta, di emettere un messaggio che mi ha dato lui, se invece è corretta, di far partire l'unzip.
Gli ho proposto di darlo partire comunque, e di dare errore se l'unzip ha problemi nell'estrazione, ma non vuole ...
Volevo quindi evitare di scrivere nel mio sorgente le password "pippo" e "pluto".
Con quello che mi hai detto tu, nel mio sorgente metterei gli hash delle password e, dopo che l'utente l'ha digitata, farei la verifica.

Ciao e grazie ancora

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1694
  • Karma: +52/-0
  • Prima ascoltare, poi decidere
Re:"verifica" password
« Risposta #3 il: Dicembre 20, 2025, 05:01:02 pm »
Quello che ho fatto in passato per casi simili ai tuoi è di archiviare l'Hash in un server aziendale (o altro server sicuro) e con un banale programmino server HTTPS (o REST se preferisci) trasmettere ai vari client l'hash su richiesta.

Quindi il tuo programmino invece di avere l'hash a codice se lo andrà a pescare direttamente dal server ogni volta che sia necessario. Poi magari può mantenere una copia cache in memoria per tot tempo.

Puoi semplicemente sfruttare anche un TCPs (quindi un trasferimento da server a client da una porta TCP X) per avere i dati (in raw, xml, json, bson, kson ?son o quanto altro la tua immaginazione possa contemplare).

EDIT: il concetto è che l'eseguibile non deve avere al suo interno dati che possono in un futuro cambiare nel tempo, tanto meno hash, password, credenziali o altro. E' un cattivo modo di programmare. Questi dati dovrebbero stare in un qualcosa di esterno (file o server ad esempio) in modo da poter essere aggiornati senza dover modificare l'eseguibile.
« Ultima modifica: Dicembre 20, 2025, 05:12:03 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

bonmario

  • Hero Member
  • *****
  • Post: 1440
  • Karma: +11/-1
Re:"verifica" password
« Risposta #4 il: Dicembre 20, 2025, 07:37:04 pm »
il concetto è che l'eseguibile non deve avere al suo interno dati che possono in un futuro cambiare nel tempo, tanto meno hash, password, credenziali o altro. E' un cattivo modo di programmare. Questi dati dovrebbero stare in un qualcosa di esterno (file o server ad esempio) in modo da poter essere aggiornati senza dover modificare l'eseguibile.

Sono d'accordo con te al 100%, ma quando "il cliente" vuole qualcosa, e nonostante le tue osservazioni non cambia idea, io rispondo: "obbedisco !"
L'importante è che sia consapevole dei rischi, se poi a lui va bene così, amen

P.S. NAturalmente, per poterglielo fare così come vuole lui, mi ha detto tutte le password  :o :-X
« Ultima modifica: Dicembre 20, 2025, 07:50:52 pm da bonmario »

tito_livio

  • Full Member
  • ***
  • Post: 224
  • Karma: +4/-0
Re:"verifica" password
« Risposta #5 il: Dicembre 21, 2025, 03:09:09 pm »
Scusami ma mi sembra che il cliente non voglia che il controllo sulla password venga fatto dal programma di unzip ma vuole che sia fatto dal tuo programma che deve prima chiedere la città, poi fare il controllo password e poi se la password è corretta avviare l'unzip del file.
Secondo me dovresti memorizzare città e relativi hash delle password in un file, anche un file di testo.
Infatti, come dice DragoRosso, se poi vogliono cambiare una password non c'è così bisogno di ricompilare il programma. Addirittura potresti produrre il programma in modo che il cliente potrebbe modificare le password in autonomia.

Poi, se vogliamo essere un po' pignoli, memorizzare l'hash in chiaro (dentro o fuori del programma) non è sicuro.
I vari hash andrebbero salvati cifrati con gli strumenti che mette a disposizione Lazarus come il componente DCPcrypt.
Ciao.

 

Recenti

How To

Utenti
Stats
  • Post in totale: 20140
  • Topic in totale: 2427
  • Online Today: 196
  • Online Ever: 1080
  • (Novembre 10, 2025, 06:15:39 am)
Utenti Online
Users: 0
Guests: 164
Total: 164

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.