Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET MVC 4.0 CRYPTO Nesnesi

Şifrele
Üyelik sistemi olan Web projelerinde, kullanıcı bilgilerinin olası güvenliğini sağlamak için alınan şifreleri programatik olarak önceden oluşturulmuş farklı algoritmalar eşliğinde yeniden şifreleriz.Asp.NET MVC’de şifreleme ve şifre çözme işlemlerinde Hash metodları kullanılmaktadır.Hash metodları sayesinde verilen anahtar değer şifrelendirilebilir ve şifre çözümlemesi yapılabilir.

Asp.NET MVC’de Hash metodları Crypto Helper nesnesinin içinde bulunmaktadır.

Crypto Helper nesnesinin kullanılabilecek metodları aşağıdadır.
GenerateSalt = Rastgele byte tipinden bir dizi oluşturmak amacıyla kullanılır.
Hash(Byte(), String) = Verilen bir byte tipinden dizi değişkeni için Hash değeri geriye döndürecektir.
Hash(String, String) = Verilen bir string tipteki değer için Hash değeri getire döndürür.
HashPassword = Verilen bir şifre değeri için RFC 2898 Hash değerini döndürür.
SHA1 = Verilen bir şifre için SHA-1 Hash değerini döndürür.
SHA256 = Verilen bir şifre için SHA-256 Hash değerini döndürür.
VerifyHashedPassword = Verilen RFC 2898 Hash ve Password değerlerini karıştırarak aynı olup olmadığını denetler ve geriye bool tipinde bir değer gönderir.

Şimdi bir TextBox nesnesine girilen değeri şifrelemek için bir örnek yapalım.Boş bir MVC projesi oluşturalım ve “Home(Controller).cs” isimli Controller sınıfımızda “Sifreleme” isminde bir Action metod oluşturalım.

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Sifreleme()
        {
            return Content("");
        }
    }

Şimdi “Index” isimli Action metodumuzun View katmanındaki sayfasını oluşturalım ve kaynak kodunu aşağıdaki gibi tasarlayalım.

@{
    ViewBag.Title = "Index";
}
@HtmlHelper.UnobtrusiveJavaScriptEnabled = true
/*Unobtrusive JavaScript özelliğini aktifleştiriyoruz.UnobtrusiveJavaScriptEnabled
yapısı HTML ve JavaScript kodlarını birbirinden ayırmak için kullanılmaktadır.*/
@using (Ajax.BeginForm("Sifreleme", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "gelenSonuc", InsertionMode = InsertionMode.Replace }))
{
    @Html.Label("Şifre giriniz.")
    <br />
    @Html.TextBox("txtGirilenSifre");
    <br />
    <input type="submit" value="Şifrele" />
}
<div id="gelenSonuc">
</div>

Sizler yukarıdaki tasarımsal kodları incelerken ben aşağıda neyi neden yaptık bahsediyorum.
“@using (Ajax.BeginForm(“Sifreleme”, new AjaxOptions { HttpMethod = “POST”, UpdateTargetId = “gelenSonuc”, InsertionMode = InsertionMode.Replace }))” satırını incelersek eğer, burada bir form oluşturuyoruz.Ancak bu form “HTML” nesnesinden değil, “Ajax” nesnesinden oluşturulmaktadır.Yani bizim yapacağımız işlemler neticesinde Ajax ile geriye sonuç dönecek ve sayfa git gel yapmadan veriler sayfada gözükecektir.

Bu form tetiklendiği zaman, “Sifreleme” Action’ı çalıştıracaktır ve bazı ayarlamalar yapılmıştır.
“new AjaxOptions” nesnesi sayesinde “HttpMethod” özelliğinin “Post” olacağı bildirilmiştir.”UpdateTargetId” değeri sayesinde gelen sonucumuzun hangi alanda gösterileceğini yazıyoruz.Haliyle tasarımımıza dikkat ederseniz id değeri “gelenSonuc” isminde olan div tagımızda sonucumuzu göstereceğiz.

“InsertionMode” özelliği sayesinde ise dönen değerin her defasında ne şekilde sayfaya getireleceğini belirtiyoruz.Örnekte gördüğünüz gibi “Replace” belirtilirse, her görüntüleme işlemi öncesinde var olan değerler silinerek, yerine yeni değerler yazdırılır.

“InsertionMode” özelliğinin “Replace” den farklı iki özelliği daha mevcuttur.Bunlardan biri, “InsertBefore” özelliğidir.Bu özellik sayesinde yeni değer, görüntülenen değerden daha önce yazılır.Bir diğer özellik ise, “InsertAfter” özelliğidir.Bunda ise, yeni değer, görüntülenen değerden daha sonra yazılır.

Evet tasarım kodlarımızla ilgili herşeyi açıklamış olduk.Şimdi programatik kodlarımızı gerçekleştirelim.

“Home(Controller).cs” isimli Controller sınıfımıza gelerek, “Sifreleme” ismindeki Action metodumuzu aşağıdaki gibi güncelleyelim.

        [HttpPost]
        public ActionResult Sifreleme()
        {
            string Sifre = Request["txtGirilenSifre"];
            //txtGirilenSifre ismindeki TextBox nesnemize girilen değeri almış olduk.

            if (Sifre.Length > 0)
            {
                string SaltDegeri = Crypto.GenerateSalt();
                /*
                 GenerateSalt metodunu kullanarak rastgele byte değerlerinden oluşan
                 SaltDegeri isminde bir değişken tanımladık.
                 */
                string HashDegeri = Crypto.HashPassword(Sifre);
                /*
                 Girilecek olan şifre değerini Hash işlemine tabii tutarak HashDegeri
                 isminde bir RFC 2898 Hash değeri elde etmiş olduk.
                 */
                bool EsitMi = Crypto.VerifyHashedPassword(HashDegeri, Sifre);
                /*
                 Burada ise, girilen şifre ile HashDegeri isimli değişkenimiz içindeki
                 değeri karşılaştırarak aynı mı değil mi kontrol ettik.Eğer aynı ise
                 true, değil ise false değerini dönecektir.
                 */

                StringBuilder sb = new StringBuilder();
                sb.Append("Yazdığınız şifre : ");
                sb.Append(Sifre);
                sb.Append("<br>");
                sb.Append("Salt Değeri : ");
                sb.Append(SaltDegeri);
                sb.Append("<br>");
                sb.Append("Hash Değeri : ");
                sb.Append(HashDegeri);
                sb.Append("<br>");
                sb.Append("Hash değeri ve yazdığınız şifre uygunluğu : ");
                sb.Append(EsitMi);
                return Content(sb.ToString());
            }
            return Content("Lütfen şifreyi boş bırakmayınız.");
        }

Eğer projeyi çalıştırıp denerseniz, şifreleme işleminin sorunsuz gerçekleştiğini göreceksiniz.
Bir sonraki yazımda görüşmek üzere..
İyi çalışmalar..

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir