|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
[C#] Approccio per criptare password
Salve, ho l'esigenza di creare un form di login con due login:
1) Accesso con username e password al database, se questo va a buon fine, verrà visualizzato il secondo login; 2) Accesso al programma tramite una password definita dall'utente stesso dall'interno del programma. Le domande che ho da farvi sono: - Va bene utilizzare un file TXT criptato per la password o in ogni caso è meglio usare un file di tipo BINARY? - Suppongo che per criptare la password devo "semplicemente" criptare il textbox/variabile, salvare su file e quando faccio il login devo criptare il testo inserito per confrontarlo con quello contenuto nel file (o è meglio de-criptare quello del file e confrontarlo con quello inserito dall'utente?). Mi sapete consigliare qualche link o direttamente parti di codice in cui posso vedere come effettuare la crittografia di una determinata variabile? Grazie ![]()
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2682
|
http://msdn.microsoft.com/it-it/libr...onfigfile.aspx
dovrebbe fare al caso tuo. ovviamente parliamo di hashing e non di encryption reversibile, che e' la prassi comune per le password.
__________________
Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Di norma, solo l'utente conosce la password in chiaro, e nessun altro (benchè meno il server, che se te lo hackerano sei morto, ovviamente mi riferisco a realtà aziendali grosse).
Sul server (in un file, o in database solitamente) è memorizzato l'hash della password. Fino a qualche tempo fa era scontato l'uso dell'md5, ora in molti casi si usa anche lo SHA-1 e SHA-2. Quale algoritmo di hashing usi non cambia comunque la logica: - l'utente è il solo a conoscere la password - il form riceve la password in chiaro e ne calcola subito l'hash - l'hash calcolato viene confrontato con l'hash memorizzato - se gli hash coincidono, permetti l'accesso, altrimenti no. Una delle peculiarità di un buon hash, è l'estrema difficoltà di ricavare la password a partire dall'hash, per cui l'hash non è necessario criptarlo a sua volta, perchè di per se è considerabile come un codice già criptato. Quindi riguardo la tua ultima domanda: no, non è pensabile descriptare l'hash, fai solo il confronto tra l'hash calcolato dai dati inseriti dall'utente e l'hash memorizzato. In C# per lo sha-2: Codice:
using(SHA256 shaM = new SHA256Managed()) { result = shaM.ComputeHash(data); }
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 14-12-2012 alle 16:14. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Grazie mille ad entrambi per le risposte.
Dopo aver letto la prima mi ero messo a cercare e guarda caso ho creato del codice che sfrutta l'SHA256 che è quello da te consigliatomi, quindi tanto meglio, grazie ancora ![]()
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Mi sono venute in mente due domandine, di cui una forse è un pochino OT ma non credo valga la pena aprire un nuovo topic perché è semplice
![]() - La password "hashata" la memorizzo in un normale campo varchar? Se si che dimensione massima devo mettere? L'SHA256 ha una lunghezza sempre uguale indipendentemente dalla password che inserisco? - Nel campo varchar di Mysql fa differenza se metto come dimensione 30 o 50? Perchè mi sembra di aver letto che è un'allocazione dinamica in base a quanti caratteri si mandano..
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Quote:
![]()
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2682
|
Quote:
2)no non cambia niente tra 30 e 50, solo che se provi a inserire nel campo da 30 una lunghezza superiore va in errore
__________________
Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Quote:
![]() 1) Io uso questa classe: Codice:
public string ComputeHash(string input, HashAlgorithm algorithm) { Byte[] inputBytes = Encoding.UTF8.GetBytes(input); Byte[] hashedBytes = algorithm.ComputeHash(inputBytes); return BitConverter.ToString(hashedBytes); } 2) Quindi mi confermi che a livello di utilizzo memoria non cambia nulla? Grazie ancora ![]()
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Era solo per portare un esempio di come anche in ambito enterprise le password si tengano cifrate e non solo in hash. |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Ok grazie.
Se io invece avessi in mente di creare una tabella di utenti e password in un database ed in base a delle scelte che effettua l'amministratore vengano nascoste funzioni,pulsanti,form,textbox etc. a dei determinati utenti, l'approccio dell'SHA256 è ancora valido? Nel caso in cui volessi fare una cosa del genere per gestire questi "permessi" interni al programma in modo da oscurare intere parti a determinati utenti avete consigli sul come farlo? PS un'ultima cosa riguardo l'SHA256: ho visto che alcuni aggiungono anche i salt, cosa sono? E' consigliato metterli?
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2682
|
il salt e' un' aggiunta che viene fatta alla password per rendere + difficile a un eventuale cracker decifrarla
per esempio prima di salvarti la password hashata la concateni con un'altra stringa a tuo piacimento. ultimamente ho letto di chi consiglia di salvare il salt (dato che ti servira' ogni volta per ricalcolare l'hash da verificare) nel database, diverso per ogni singolo utente ma a mio avviso e' inutile dato che se qualcuno dovesse riuscire ad entrare in possesso dell'hash avrebbe accesso anche al salt. personalmente quindi uso un salt "hardcoded" nel codice, possibilmente dichiarato in un unico punto, per comodita' e pulizia
__________________
Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
A quanto pare però ti servirebbe un db più che un file di testo. Il salt (valore random aggiunto alla stringa da cifrare) non è applicabile nel caso delle password con hash, ma si usa quando si cifrano in modo che 2 password uguali non siano memorizzate con lo stesso valore. Nel caso degli hash non ha molto senso in quanto non potresti ricostruire la stringa da confrontare, a meno di non usare un salt costante che non serve a niente. |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Ok grazie ad entrambi.
Per verificare se esiste l'utente "giovannino" nel database (non il record nella tabella, ma l'utente vero e proprio), devo semplicemente provare a fare una query su un DB e vedere se mi fa connettere o meno oppure c'è qualche altro modo più "elegante"? Grazie ![]()
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Vabbè ne passa tra l'autenticare il login a un sito/forum e un SSO, non ci ho manco pensato
![]() Penserei comunque che nei SSO la password venga criptata ma mantenuta solo per un limitato periodo di tempo, se non addirittura tenuta solo in sessione o tenuta come cookie a scadenza breve (mi pare che le linee guida oracle suggeriscano una cosa del genere) Quote:
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 15-12-2012 alle 10:10. |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Non mi sono fatto capire
![]() Non intendo verificare se esiste la riga corrispondente... mi riferisco proprio all'utente del Database, per esempio il root... se oltre a root mi creo altri utenti, come verifico se esistono in MySQL? Semplicemente vedendo quante righe mi restituisce?
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Se hai già effettuato l'accesso al db (come root o altro utente che ne abbia privilegi), puoi eseguire la query: SELECT user FROM mysql.user WHERE user='<utente da verificare>'; Se ritorna zero righe, allora l'utente non esiste. Puoi anche non porre condizioni WHERE per visualizzare tutti gli utenti. Se invece non puoi/vuoi accedere al DB e devi testare l'esistenza dell'utente dall'esterno, allora si, penso che dovrai tentare la connessione e vedere se ha successo o meno.
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 15-12-2012 alle 13:54. |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Problemino: su Windows XP mi dice che l'algoritmo criptografico usato (SHA256) non è supportato, che fare?
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Devi usare SHA256Managed. Le classi CryptoServiceProvider utilizzano il sistema di cifratura dell'os e xp non supporta sha256
Ultima modifica di tomminno : 22-12-2012 alle 14:21. |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: May 2005
Città: Messina
Messaggi: 15637
|
Quote:
![]() Quindi ho pensato di passare direttamente all'SHA512 ![]()
__________________
CASE: Antec 900 - ALI: Enermax Pro82+ 525W - MOBO: Asus Z97I-Plus - CPU: i7 4770k @ 4.4 Ghz 1.22v - DISSI: Noctua U-14S - RAM: 2x8GB Corsair Vengeance LP @ 1866 Mhz - VGA: GTX 1070 ARMOR 8G OC - Monitor: Acer XF270HU - SSD: Samsung 850 EVO 500 GB MacBook Pro Retina 15" 2018 - i7 6 core, Radeon Pro 560X, 512 GB SSD
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:46.