Jelszót nem illik másképpen tárolni, csak Hash-elve, tehát a jelszó string-eket hash-elni kéne. dotNet alatt a string-ek GetHashCode() tagfüggvénye adja magát a feladatra. Igen ám, de a meglepetés akkor ér bennünket, ha alkalmazásunkat egyszer másik vason futtatják és az mondjuk nem 32 bit-es, hanem 64.
Ez esetben a fenti módon kezelve eltérő hash-eket kapunk. De egy kicsit utána olvasva az is kiderül, hogy eltérő dotNet verziók alatt sem garantálja a Microsoft az egyezést!
Konklúzió: GetHashCode()-al ne hash-eljük a jelszavakat :)
Ok. De akkor mit használjunk erre a célra?
Nincs mese. Meg kell írni a saját Hash-elő algoritmusunkat, amellyel a szükséges feladatot eltudjuk végezni. Erre jó lehetőséget kínál a dotNet System.Security.Cryptography névtere, ami játsznyi könnyedé teszi ezt a feladatot. pl. így néz ki egy SHA256-ot vissza adó függvény:
public static string GetSHA256Code(string inputString)
{
var ue = new UnicodeEncoding();
var clearString = ue.GetBytes(inputString);
var sha = new SHA256Managed();
var hash = sha.ComputeHash(clearString);
return Convert.ToBase64String(hash);
}
De további Hash-elési algoritmusokat is könnyedén lehet kialakítani, ha más providereket vonunk be (MD5CryptoServiceProvider, SHA1CryptoServiceProvider() , SHA512Managed stb.) Ekkor a harmadik sort kell módosítani (meg persze a függvény nevét :) )
Azért ne felejtsük el, hogy már az MD5 és az SHA1 titkosítás is elavultnak számít.