Kullandığım Şifreleme Sınıfım

Şifreleme, veri güvenliğini sağlamak açısından önemli bir konudur. Bu yazıda güzel bir kullanım örneği göreceksiniz.

Şifreleme, veri güvenliğini sağlamak açısından önemli bir konudur. Özellikle önemli bir veriyi bir sayfadan bir başka sayfaya taşırken şifreleyerek göndermek gerektiği açıktır.

.NET Framework bize şifreleme ile ilgiil oldukça zengin olanaklar sunar.

Şifreleme ile ilgili sınıflar, .NET Framework'ta System.Security.Cryptography namespace'i altında bulunmaktadır.

Şifreleme algoritmalarını ikiye ayırabiliriz:

Simetrik Algoritmalar:

Veriyi bir anahtar sözcük yardımı ile şifreler ve aynı anahtar kelime ile çözer. 

RijndaelManaged, RC2, DES ve TripleDES simetrik algoritmalara örnek olarak verilebilir.

Asimetrik Algoritmalar:

Genelde açık anahtar şifreleme olarak bilinir. Simetrik algoritmalara göre yavaştırlar. System.Security.Cryptography.AsymmetricAlgorithm altındaki sınıflar ile asimetrik şifreleme yapabiliriz.

.NET altındaki asimetrik algoritmalar şunlardır ; RSA , DSA

Bu algoritmalar arasında bence en güçlüsü, en zor kırılacak olanı Rijndael algoritması.

Rijndael algoritması bir kare varyasyon algoritmasıdır. Çok iyi, çok hızlı ve çok performanslı çalışan ileri boyutta düzgün matematiksel iç yapıya sahip bir algoritma düzeni vardır.

Rijndael algoritması, donanımı uygun kullanma açısından da çok iyi bir algoritmadır.

Buna karşın Rijndael algoritmasının göze batan iki dezavantajı vardır. Bunlardan biri uzun anahtar boyutlarını uzunca bir zamanda şifrelemesidir. İkincisi ise 256 bit anahtar kullanımlarında döngüsel artım olduğu için hızının yüksek oranda düşmesidir.

Ancak herşeye rağmen projelerimizde kullanabileceğimiz en güzel şifreleme algoritması Rijndael algoritmasıdır.

Şimdi projelerimizde kullanabileceğimiz Şifreleme classımızı yazalım:

Ben bu sınıfı rahatlıkla kullanabilmek için Genişletme metodu (Extension Methods) olarak yazdım.

Sifrele ve SifreCoz metotlarını kullanırken, eğer verinizi URL'de / QueryString'te kullanacaksanız bool değer alan aşırı yüklenmiş metodu (overload) kullanmalısınız.

public static class Sifreleme
{
    // herhangi birşey olabilir
    private const string passPhrase = "Besiktas";
    
    // herhangi birşey olabilir
    private const string saltValue = "GozGozGoztepe";

    // SHA1 ya da MD5
    private const string hashAlgorithm = "SHA1";
    
    // herhangi bir sayı olabilir
    private const int passwordIterations = 2;
    
    // 16 byte olmalı
    private const string initVector = "@1B2c3Dq@5F6x7H8";

    // kaç bit şifreleme?
    private const int keySize = 256;

    public static string Sifrele(this string plainText)
    {
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        PasswordDeriveBytes password =
            new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

        byte[] keyBytes = password.GetBytes(keySize / 8);

        RijndaelManaged symmetricKey = new RijndaelManaged();

        symmetricKey.Mode = CipherMode.CBC;

        ICryptoTransform encryptor =
            symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);

        MemoryStream memoryStream = new MemoryStream();

        CryptoStream cryptoStream =
            new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);

        cryptoStream.FlushFinalBlock();

        byte[] cipherTextBytes = memoryStream.ToArray();

        memoryStream.Close();
        cryptoStream.Close();

        string cipherText = Convert.ToBase64String(cipherTextBytes);

        return cipherText;
    }

    public static string Sifrele(this string plainText, bool URLEncode)
    {
        if (URLEncode)
            return HttpContext.Current.Server.UrlEncode(plainText.Sifrele());
        else
            return plainText.Sifrele();
    }

    public static string SifreCoz(this string cipherText)
    {
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

        byte[] cipherTextBytes = Convert.FromBase64String(cipherText);

        PasswordDeriveBytes password =
            new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

        byte[] keyBytes = password.GetBytes(keySize / 8);

        RijndaelManaged symmetricKey = new RijndaelManaged();

        symmetricKey.Mode = CipherMode.CBC;

        ICryptoTransform decryptor =
            symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);

        MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

        CryptoStream cryptoStream =
            new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

        byte[] plainTextBytes = new byte[cipherTextBytes.Length];

        int decryptedByteCount =
            cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

        memoryStream.Close();
        cryptoStream.Close();

        string plainText =
            Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);

        return plainText;
    }

    public static string SifreCoz(this string cipherText, bool URLDecode)
    {
        if (URLDecode)
            return HttpContext.Current.Server.UrlDecode(cipherText).SifreCoz();
        else
            return cipherText.SifreCoz();
    }
}

Örnek kullanım:

string sifreliMetin = "Şifrelenecek metin".Sifrele();

Örnek bir aspx sayfası yazalım:

Tasarım kısmı:

<asp:CheckBox ID="cbURL" runat="server" Text="URLEncode / URLDecode kullanılsın mı?" />
<br />
Şifrelenmiş metni URL'de / QueryString'te kullanacaksanız bunu seçmelisiniz!
<br />
<br />
<asp:TextBox ID="txtSifrelenecekMetin" runat="server" TextMode="MultiLine" Rows="5"
    Columns="50" />
<br />
<asp:Button ID="btnSifrele" runat="server" Text="Şifrele" OnClick="btnSifrele_Click" />
<hr />
<asp:TextBox ID="txtSifrelenmisMetin" runat="server" TextMode="MultiLine" Rows="5"
    Columns="50" />
<br />
<asp:Button ID="btnSifreCoz" runat="server" Text="Şifre Çöz" OnClick="btnSifreCoz_Click" />
<hr />
<asp:TextBox ID="txtSifresizMetin" runat="server" ReadOnly="true" TextMode="MultiLine"
    Rows="5" Columns="50" />

Code Behind:

protected void btnSifrele_Click(object sender, EventArgs e)
{
    // txtSifrelenmisMetin.Text = txtSifrelenecekMetin.Text.Sifrele();
    txtSifrelenmisMetin.Text = txtSifrelenecekMetin.Text.Sifrele(cbURL.Checked);
}
protected void btnSifreCoz_Click(object sender, EventArgs e)
{
    // txtSifresizMetin.Text = txtSifrelenmisMetin.Text.SifreCoz();
    txtSifresizMetin.Text = txtSifrelenmisMetin.Text.SifreCoz(cbURL.Checked);
}

Örnek çıktı:

 

Örnek kodları buradan indirebilirsiniz.

Herkese kolaylıklar diliyorum.