4 Temmuz 2013 Perşembe

MD5 ile Veri Şifreleme

Bu sırada web.config, Panel Nesnesi, Stored Procedure gibi konulara da değineceğiz.

Aşağıda verdiğim örnek, çoğu zaman kullandığımız Kayıt Formu ile Login Formundan oluşuyor. Kayıt olurken, email adresi ve parola bilgileri soruluyor. Bunun sonrasında parola bilgisi MD5 algoritması ile şifrelenip veritabanına veriler yazılıyor.

Login Formumuzda ise, aynı veriler istenerek, yine parolamız MD5 algoritması ile veritabanına gönderiliyor. Yani SQL'deki "Select" cümlesi aracılığı ile kontrolümüzü yapıyoruz.

Örneğimize geçmeden önce örneğimiz içerisinde kullandığımız Panel nesnemizin bazı özelliklerini inceleyelim.

Height = Panelimizin yüksekliği (pixel cinsinden)
Width = Panelimizin genişliği (pixel cinsinden)
BackColor = Panelimizin arkafon rengi
BackImageUrl = Panelimizin arkasında resim göstermek istiyorsak
BorderColor = Panelimizin sınır çizgisinin rengi
BorderWidth = Panelimizin sınır çizgisinin genişliği (pixel cinsinden)
Font = Panelimizin içerisinde gösterilecek metinlerin Font adı
Visible = Panelimizin görüntülenme ayarı (true/false değerleri alır)

Şimdi de veritabanına bağlanmak amaçlı kullandığımız bağlantı satırımızı nasıl kullandığımıza bakalım.

Klasik ASP içerisinde veritabanına bağlanmak istediğimizde bunu çoğu zaman asp dosyamızın içerisine yazıyorduk. Veya başka bir sayfaya yazıp, onu kullanacağımız sayfaya dahil ediyorduk. Hatırlarsanız bu yönteme "Include File" yöntemi deniyordu. Bu durum güvenlik açısından birçok açık ortaya çıkartmak ile beraber, yetersiz de kalıyordu.

.Net'te ise bu sıkıntılar atlatıldı. Şimdi projemiz ile ilgili birçok veriyi saklayabileceğimiz, güvenli bir dosyaya kavuştuk. İşte bu dosyanın adı web.config

Web.config dosyasının ayrıntılarını burada işleyemeyeceğim. Sadece veritabanı bağlantı satırımızı nasıl web.config sayfamıza yazmamız gerektiğini ve aspx dosyamızdan nasıl çağırıldığını göstereceğim.

Örneğin web.config dosyamızın içeriği:
<configuration> <appSettings> <add key="strConn" value="server=localhost;uid=dtuser;pwd=dtpass;database=dotnet" /> </appSettings> </configuration>

Gelelim aspx dosyamızdan nasıl çağırabileceğimize:

string dbConnStr = ConfigurationSettings.AppSettings["strConn"];

Sanırım artık konumuza dönebiliriz. İlgili tüm açıklamaları kod satırları arasında anlatmağa çalıştım. Ayrıca CodeBehind yönetimi kullanarak kodladım. Bu yöntemden de kısaca bahsetmek gerekirse, CodeBehind yöntemi ile kodumuz ile görselliğimizi tamamen ayırıyoruz. Böylelikle tasarım değişikliği gibi durumlarda hiçbir sıkıntı çekmiyoruz. Örneği incelediğinizde durumu da farkedeceksiniz.

Fakat öncelikle, veritabanamızın yapısını, stored procedure ve web.config dosyamızın ilgili kodlarını verelim.

Tablomuz:

registerUser

user_id int (IDENTITY) user_email varchar 255 user_password binary 16

Stored Procedure:

sp_ins_regUser

CREATE PROCEDURE sp_ins_regUser @user_email varchar(255), @user_password binary(16) AS INSERT INTO registerUser (user_email, user_password) VALUES (@user_email, @user_password) GO

sp_sel_loginCheck
CREATE PROCEDURE sp_sel_loginCheck @uemail varchar(255), @upwd binary(16) AS SELECT user_id FROM registerUser WHERE user_email = @uemail AND user_password = @upwd GO

Web.config

<configuration> <appSettings> <add key="strConn" value="server=localhost;uid=dtuser;pwd=dtpass;database=dotnet" /> </appSettings> </configuration>

İlk önce görsel arayüzümün bulunduğu, kişinin kayıt olduğu sayfa olan:

register.aspx

<%@ Page Language="c#" Inherits="registerForm.regForm" Src="register.aspx.cs"%> <html> <body> <asp:Panel id="register" runat="server"> <form id="regForm" method="post" runat="server"> <table cellspacing="0" cellpadding="3" border="0"> <tr> <td colspan="2">Kayıt Formu</td> </tr> <tr> <td><b>E-posta Adresiniz</b></td> <td><asp:TextBox id="emailAdr" runat="server" MaxLength="255"></asp:TextBox></td> </tr> <tr> <td><b>Parolanız</b></td> <td><asp:TextBox runat="server" MaxLength="10" id="parola" TextMode="Password"></asp:TextBox></td> </tr> <tr> <td align="right" colspan="2"><asp:Button id="btnOk" OnClick="doRegister" runat="server" text="Formu Gönder"/></td> </tr> </table> </form> </asp:Panel> <asp:Panel id="registerStatus" runat="server"> <asp:Label id="lblInfo" runat="server"></asp:Label> </asp:Panel> </body> </html>

Bu sayfanın kodlarını işleyen:

register.aspx.cs

using System; using System.IO; using System.Web.UI; //web textbox larına ulaşabilmemiz için gereken class using System.Security.Cryptography; //md5 için gerekli class using System.Text; //UTF fonksiyonu için gerekli class using System.Data; //veritabanı işlemleri için gerekli class using System.Data.SqlClient; //veritabanı işlemleri için gerekli class using System.Configuration; //web.config dosyamızdan veri okuyabilmek amaçlı class namespace registerForm { public class regForm : System.Web.UI.Page { //kodlamada kullanacağımız nesnelerimizi tanımlıyoruz. protected System.Web.UI.WebControls.TextBox emailAdr; protected System.Web.UI.WebControls.TextBox parola; protected System.Web.UI.WebControls.Panel register; protected System.Web.UI.WebControls.Panel registerStatus; protected System.Web.UI.WebControls.Label lblInfo; public void Page_Load(Object Src, EventArgs E) { //sayfa yüklendiğinde panellerimizin görüntülenme ayarlarını yapıyoruz. //form ekranı ilk olarak görüntülenecek. register.Visible = true; registerStatus.Visible = false; lblInfo.Text = ""; } //Formu Gönder butonuna tıklandığında çalışan fonksiyonumuz protected void doRegister(object sender, System.EventArgs e) { //girilen verileri alıyoruz. string txtEmailAdr = emailAdr.Text; string txtParola = parola.Text; //işlem sonucu göstermek amaçlı ikinci panelimizi görünür kılıyoruz. register.Visible = false; registerStatus.Visible = true; try { //parolanız şifrelenmesi için fonksiyona gönderiyoruz. //şifrelenmiş verimiz byte haline geleceği için değişkenimizi //byte olarak tanımlıyoruz. byte[] encyrptedPassword = md5Password(txtParola); //veritabanına Email adresini ve şifrelenmiş Parolayı kayıt ediyoruz. SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["strConn"]); conn.Open(); SqlCommand sc = new SqlCommand (); sc.Connection = conn; sc.CommandType = CommandType.StoredProcedure; sc.CommandText = "sp_ins_regUser"; sc.Parameters.Add("@user_email", SqlDbType.VarChar, 255, "user_email"); sc.Parameters["@user_email"].Value = txtEmailAdr; sc.Parameters.Add("@user_password", SqlDbType.Binary, 16, "user_password"); sc.Parameters["@user_password"].Value = encyrptedPassword; sc.ExecuteNonQuery(); conn.Close(); //try-catch bloğuna soktuğumuz işlemimizde bir sorun çıkmadı ise //ziyaretçimizi bilgilendiriyoruz. lblInfo.Text = "Kayıt işleminiz başarı ile gerçekleştirilmiştir"; } catch { //veritabanında bir hata oluştuysa ziyaretçimizi bilgilendiriyoruz. lblInfo.Text = "Kayıt işleminiz sırasında bir hata oluştu. Lütfen tekrar deneyiniz."; } } byte[] md5Password(string pass) { //md5 şifrelenmesi için verimizin byte haline gelmesi gerekli. //veri 8-bit şeklinde dönüştürülmesi için ilk önce UTF fonksiyonuna gönderiliyor. UTF8Encoding encoder = new UTF8Encoding(); //md5 şifrelemesi için nesnemizi oluşturuyoruz. MD5 md5 = new MD5CryptoServiceProvider(); //verimizi md5 ile çalıştırıyoruz. //dikkat ederseniz UTF fonksiyonundan dönen değeri GetBytes ile alabildik. byte[] donenDeger = md5.ComputeHash(encoder.GetBytes(pass)); //şifrelenmiş değerimizi geri gönderiyoruz. return donenDeger; } } }

Kullanıcı adı, parola verilerinin girildiği görsel sayfa olan:


login.aspx

<%@ Page Language="c#" Inherits="loginForm.Login" Src="login.aspx.cs"%> <html> <body> <asp:Panel id="loginStatus" runat="server"> <asp:Label id="lblInfo" runat="server"></asp:Label> </asp:Panel> <asp:Panel id="pnlLogin" runat="server"> <form id="loginForm" method="post" runat="server"> <table cellspacing="0" cellpadding="3" border="0"> <tr> <td colspan="2">Siteye Giriş</td> </tr> <tr> <td><b>E-posta Adresiniz</b></td> <td><asp:TextBox id="emailAdr" runat="server" MaxLength="255"></asp:TextBox></td> </tr> <tr> <td><b>Parolanız</b></td> <td><asp:TextBox id="parola" runat="server" MaxLength="10" TextMode="Password"></asp:TextBox></td> </tr> <tr> <td align="right" colspan="2"><asp:Button id="btnLogin" OnClick="doLogin" runat="server" text="Formu Gönder"/></td> </tr> </table> </form> </asp:Panel> </body> </html>

login.aspx dosyamızı işleyen sayfamız:

login.aspx.cs

using System; using System.IO; using System.Web.UI; //web textbox larına ulaşabilmemiz için gereken class using System.Security.Cryptography; //md5 için gerekli class using System.Text; //UTF fonksiyonu için gerekli class using System.Data; //veritabanı işlemleri için gerekli class using System.Data.SqlClient; //veritabanı işlemleri için gerekli class using System.Configuration; //web.config dosyamızdan veri okuyabilmek amaçlı class namespace loginForm { public class Login : System.Web.UI.Page { //kodlamada kullanacağımız nesnelerimizi tanımlıyoruz. protected System.Web.UI.WebControls.TextBox emailAdr; protected System.Web.UI.WebControls.TextBox parola; protected System.Web.UI.WebControls.Panel pnlLogin; protected System.Web.UI.WebControls.Panel loginStatus; protected System.Web.UI.WebControls.Label lblInfo; public void Page_Load(object sender, System.EventArgs e) { //sayfa yüklendiğinde panellerimizin görüntülenme ayarlarını yapıyoruz. //form ekranı ilk olarak görüntülenecek. pnlLogin.Visible = true; loginStatus.Visible = false; lblInfo.Text = ""; } //Formu Gönder butonuna tıklandığında çalışan fonksiyonumuz protected void doLogin(object sender, System.EventArgs e) { //girilen verileri alıyoruz. string uid = emailAdr.Text; string pwd = parola.Text; //işlem sonucu göstermek amaçlı ikinci panelimizi görünür kılıyoruz. pnlLogin.Visible = false; loginStatus.Visible = true; //parolanız şifrelenmesi için fonksiyona gönderiyoruz. //şifrelenmiş verimiz byte haline geleceği için değişkenimizi //byte olarak tanımlıyoruz. byte[] encyrptedPwd = md5Password(pwd); //veritabanına ilgili verileri göndererek kontrolümüzü yaparız. SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["strConn"]); conn.Open(); SqlCommand sc = new SqlCommand (); sc.Connection = conn; sc.CommandType = CommandType.StoredProcedure; sc.CommandText = "sp_sel_loginCheck"; sc.Parameters.Add("@uemail", SqlDbType.VarChar, 255, "uemail"); sc.Parameters["@uemail"].Value = uid; sc.Parameters.Add("@upwd", SqlDbType.Binary, 16, "upwd"); sc.Parameters["@upwd"].Value = encyrptedPwd; try { //Elimizdeki verilerle çalıştırdığımız SP'mizden geri bir kolon, bir satır döndüğü //için SqlCommand nesnesinin ExecuteScalar() metodunu kullanıyoruz. //user_id şuanda bizim işimize yaramıyor, fakat nasıl çekildiğini göstermek amacı ile //bu satırı da kodumuza ekledim. string user_id = sc.ExecuteScalar().ToString(); //Email ve parola doğru ise bilgilendiriyoruz. lblInfo.Text = "Hoşgeldiniz "; } catch { //Email ve parola yanlışsa tekrar girmesini istiyoruz. lblInfo.Text = "Yanlış E-posta Adresi/Parola. Lütfen bilgilerinizi kontrol edip tekrar deneyiniz."; } conn.Close(); } byte[] md5Password(string pass) { //md5 şifrelenmesi için verimizin byte haline gelmesi gerekli. //veri 8-bit şeklinde dönüştürülmesi için ilk önce UTF fonksiyonuna gönderiliyor. UTF8Encoding encoder = new UTF8Encoding(); //md5 şifrelemesi için nesnemizi oluşturuyoruz. MD5 md5 = new MD5CryptoServiceProvider(); //verimizi md5 ile çalıştırıyoruz. //dikkat ederseniz UTF fonksiyonundan dönen değeri GetBytes ile alabildik. byte[] donenDeger = md5.ComputeHash(encoder.GetBytes(pass)); //şifrelenmiş değerimizi geri gönderiyoruz. return donenDeger; } } }




Hiç yorum yok:

Yorum Gönder