C#: parole, salt și verificare într-un proiect didactic
Înțelege verificarea parolelor într-un proiect C# local. Folosește salt aleator și derivare PBKDF2, fără parole în clar sau comparații cu valori hardcodate.
În acest material
Un formular cu TextBox mascat ascunde caracterele de pe ecran, dar nu protejează automat parola stocată. Nu salvăm parola în clar și nu construim autentificare prin compararea cu un șir fix din cod. Exemplul arată separarea dintre parolă, salt și cheia derivată într-un proiect local de învățare.
Cum lucrezi cu exemplul
Programul complet folosește C# 7.3 și API-uri disponibile în .NET Framework 4.8. Deschide Lesson.csproj din arhivă sau creează un proiect Console App (.NET Framework 4.8) și înlocuiește Program.cs. Datele de demonstrație sunt incluse în cod.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
Generăm un salt aleator pentru fiecare înregistrare și derivăm 32 de octeți cu PBKDF2 și SHA-256. Păstrăm saltul, rezultatul și numărul de iterații, nu parola originală. Pentru verificare folosim aceeași configurație și comparăm octeții fără ieșire la prima diferență. Numărul de iterații din exemplu este didactic și trebuie evaluat și actualizat pentru un produs real.
.NET Framework 4.8 oferă constructorul Rfc2898DeriveBytes cu algoritmul hash explicit. Resursele criptografice sunt eliberate cu using. Exemplul nu implementează conturi, recuperare, limitarea încercărilor sau sesiuni și nu este prezentat ca sistem complet de autentificare pentru internet.
Exemplu și rezultat așteptat
Parola demonstrativă este verificată o dată corect și o dată cu un caracter schimbat. Rezultatele sunt True și False. Saltul se schimbă între rulări, dar rezultatul verificării rămâne același. Nu afișăm parola sau cheia derivată în consolă.
Parolă + salt aleator → PBKDF2 SHA-256 → Stochează salt + rezultat → Verificare: derivă și compară.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Xml.Linq;
using System.Data;
class Program {
static byte[] Derive(string password,byte[] salt) {
using(var kdf=new System.Security.Cryptography.Rfc2898DeriveBytes(
password,salt,100000,System.Security.Cryptography.HashAlgorithmName.SHA256)) return kdf.GetBytes(32);
}
static bool Equal(byte[] a,byte[] b) {
if(a.Length!=b.Length)return false;int diff=0;
for(int i=0;i<a.Length;i++)diff|=a[i]^b[i];return diff==0;
}
static void Main() {
byte[] salt=new byte[16];
using(var random=System.Security.Cryptography.RandomNumberGenerator.Create())random.GetBytes(salt);
byte[] saved=Derive("Parola demonstrativa!",salt);
Console.WriteLine(Equal(saved,Derive("Parola demonstrativa!",salt)));
Console.WriteLine(Equal(saved,Derive("Parola modificata!",salt)));
}
}
Rezultatul programului:
True
False
Greșeli și limite
Nu reutiliza același salt pentru toate conturile. Nu transmite parola în URL și nu o scrie în jurnal. Nu confunda hashing-ul cu criptarea reversibilă. În aplicații publice folosește mecanisme de identitate verificate și politici actuale, în loc să extinzi acest exemplu didactic în grabă.
Exersează
Derivă aceeași parolă cu două salturi diferite și confirmă că rezultatele diferă. Verifică o parolă goală și una modificată, după o politică explicită de acceptare. În schema de test separă coloanele pentru salt, hash, algoritm și iterații. Explică de ce mascarea din TextBox nu înlocuiește aceste măsuri.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: tranzacții pentru operații care reușesc împreună
Lecția următoare: C#: export CSV cu citare și protecție pentru foi de calcul.
Referință: documentația Microsoft. Constructorul folosit vizează Framework 4.8; în .NET modern consultă API-ul static Pbkdf2 și documentația versiunii tale.
Întrebări frecvente
Saltul este o parolă secretă?
Nu. Este o valoare aleatoare distinctă, stocată alături de rezultatul derivării.
Pot recupera parola din hash?
Scopul derivării este verificarea fără păstrarea unei forme reversibile a parolei.
Exemplul este autentificare completă?
Nu. Lipsesc gestionarea conturilor, sesiunile, recuperarea și limitarea încercărilor.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.