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

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

Recenti

How To

Utenti
Stats
  • Messaggi totali: 20.582
  • Totale discussioni: 2.471
  • Online today: 25
  • Online ever: 5.949 (Luglio 30, 2026, 09:49:59 PM)
Utenti online
  • Users: 0
  • Guests: 22
  • Total: 22
22 Visitatori, 0 Utenti

"verifica" password

Aperto da bonmario, Dicembre 20, 2025, 10:14:20 AM

Discussione precedente - Discussione successiva

bonmario

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

#1
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 !!):

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.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

bonmario

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

#3
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.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

bonmario

#4
Citazione di: DragoRosso il Dicembre 20, 2025, 05:01:02 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

tito_livio

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.

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.