Bazen Text olarak girilen verileri şifreli olarak kaydetmemiz gerekebilir. Genel olarak kullanıcı şifreleri veritabanında şifrelenmiş olarak tutulur, bu sayede veritabanına erişebilen birisi dahi kullanıcılara ait şifreleri göremez. Peki girilen verileri nasıl şifreleriz. Bu makalemizde bu işlemi nasıl yapacağımız öğreneceğiz.
İlk olarak Visual Studio ile yeni bir web sitesi oluşturuyoruz daha sonra Sifreleme adında bir sınıf ekliyoruz. Oluşturacağımız bu sınıfı birebir kopyalayarak kendi projelerinize adapte edebilirsiniz. Oluşturduğumuz sınıfa ait kodlar şu şekilde.
using System; using System.IO; using System.Security.Cryptography;
public class Sifreleme { private string password = "yzSabri123";
private byte[] Sifrele(byte[] SifresizVeri, byte[] Key, byte[] IV) { MemoryStream ms = new MemoryStream(); Rijndael alg = Rijndael.Create(); alg.Key = Key; alg.IV = IV; CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(SifresizVeri, 0, SifresizVeri.Length); cs.Close(); byte[] sifrelenmisVeri = ms.ToArray(); return sifrelenmisVeri; }
private byte[] SifreCoz(byte[] SifreliVeri, byte[] Key, byte[] IV) { MemoryStream ms = new MemoryStream(); Rijndael alg = Rijndael.Create(); alg.Key = Key; alg.IV = IV; CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(SifreliVeri, 0, SifreliVeri.Length); cs.Close(); byte[] SifresiCozulmusVeri = ms.ToArray(); return SifresiCozulmusVeri; }
public string TextSifrele(string sifrelenecekMetin) { byte[] sifrelenecekByteDizisi = System.Text.Encoding.Unicode.GetBytes(sifrelenecekMetin); PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
byte[] SifrelenmisVeri = Sifrele(sifrelenecekByteDizisi, pdb.GetBytes(32), pdb.GetBytes(16)); return Convert.ToBase64String(SifrelenmisVeri); }
public string TextSifreCoz(string text) { byte[] SifrelenmisByteDizisi = Convert.FromBase64String(text); PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
byte[] SifresiCozulmusVeri = SifreCoz(SifrelenmisByteDizisi, pdb.GetBytes(32), pdb.GetBytes(16));
return System.Text.Encoding.Unicode.GetString(SifresiCozulmusVeri); } } |
Şimdi ise şifrelenecek metni gireceğimiz aspx sayfamızı oluşturalım. Aspx sayfamıza iki adet textbox ekleyip şifreleme işlemini yapalım.
<table> <tr> <td> Şifrelenecek Metin </td> <td> <asp:TextBox Width="200px" ID="TextBoxSifrelenecekMetin" runat="server"></asp:TextBox> <asp:Button ID="ButtonSifrele" runat="server" Text="Şifrele" onclick="ButtonSifrele_Click" /> </td> </tr> <tr> <td> Şifrelenmiş Metin </td> <td> <asp:TextBox Width="100%" ID="TextBoxSifrelenmisMetin" runat="server"></asp:TextBox> </td> </tr> </table> |
Butona basınca aşağıdaki kodları çalıştıracağız.
protected void ButtonSifrele_Click(object sender, EventArgs e) { Sifreleme sifreleme = new Sifreleme(); string sifrelenmisMetin = sifreleme.TextSifrele(TextBoxSifrelenecekMetin.Text); TextBoxSifrelenmisMetin.Text = sifrelenmisMetin; } |
Gördüğünüz gibi “sabri” yazdığım zaman karşılığında “Pu2bqt500v7QGHCDfp8Yfg==” değeri dönüyor. Bu şekilde istediğimiz bilgileri veritabanına atmadan önce rahatça sıkıştırabiliriz.
Şimdi sırada şifre çözme işlemi var. Bunun için sayfamıza iki adet textbox ve bir buton daha ekleyelim
<tr> <th> Şifre Çözme İşlemi </th> </tr> <tr> <td> Şifreli Metin </td> <td> <asp:TextBox Width="200px" ID="TextBoxSifreliMetin" runat="server"></asp:TextBox> <asp:Button ID="ButtonSifreCoz" runat="server" Text="ŞifreÇöz" OnClick="ButtonSifreCoz_Click" /> </td> </tr> <tr> <td> Şifresi Çözülmüş Metin </td> <td> <asp:TextBox Width="100%" ID="TextBoxCozulmusMetin" runat="server"></asp:TextBox> </td> </tr> |
İlk işlemin tersine bu sefer
Şifre Çöz metodunu kullanacağız.
protected void ButtonSifreCoz_Click(object sender, EventArgs e) { Sifreleme sifreleme = new Sifreleme(); string sifresiCozulmusMetin = sifreleme.TextSifreCoz(TextBoxSifreliMetin.Text); TextBoxCozulmusMetin.Text = sifresiCozulmusMetin; } |
Kullanıcılara ait şifreleri veritabanında saklamak için kullanılan yöntemlerden birini anlatmış olduk, diğer bir yöntem ise kullanıcı şifresinin hash bilgisini almak ve bunu veritabanına kaydetmektir. İki yöntem arasında bariz bir fark vardır. Bizim anlattığımız yöntemde kullanıcının şifresi veritabanında şifreli olarak da olsa vardır fakat hash metodunda kullanıcının şifresine artık ulaşamayız sadece hash bilgisine ulaşabiliriz. Kullanıcı giriş yapacağı zaman girdiği şifrenin hashini alıp veritabanı ile karşılaştırarak doğru girilip girilmediğine karar veririz. Tabiki hash kullanılan yöntemlerde kullanıcı şifre hatırlatma fonksiyonu olmaz sadece şifre sıfırlama yapılabilir. Bu konuyuda bir başka makalemizde bahsederiz