Makale Özeti

Hepimizin de bildiği gibi günlük hayatımızda birçok alanda şifreler ile çeşitli işlemler yapıyoruz. Bu yüzden bize özel olan verilerin özelliğini ve gizliliğini korumak için de kullanmak üzere seçtiğimiz şifrelerin güvenilir olması büyük önem taşımaktadır. Şifrelerin güvenilir olması için de hem zor tahmin edilecek özellikte olmaları hem de bazı kötü niyetli kişiler tarafından programatik olarak zor kırılabilir özellikte olmaları gerekir. Bu yüzden şifreleri belirlerken anlamlı ve/veya belirli bir mantığa göre sıralanmış harf/rakam öbeklerinden ziyade bir anlamı olmayan ve harf/rakam/simge kombinasyonlarından oluşan anlamsız kelimeler kullanmak çok önemlidir.

Makale

    Hepimizin de bildiği gibi günlük hayatımızda birçok alanda şifreler ile çeşitli işlemler yapıyoruz. Bu yüzden bize özel olan verilerin özelliğini ve gizliliğini korumak için de kullanmak üzere seçtiğimiz şifrelerin güvenilir olması büyük önem taşımaktadır. Şifrelerin güvenilir olması için de hem zor tahmin edilecek özellikte olmaları hem de bazı kötü niyetli kişiler tarafından programatik olarak zor kırılabilir özellikte olmaları gerekir. Bu yüzden şifreleri belirlerken anlamlı ve/veya belirli bir mantığa göre sıralanmış harf/rakam öbeklerinden ziyade bir anlamı olmayan ve harf/rakam/simge kombinasyonlarından oluşan anlamsız kelimeler kullanmak çok önemlidir. Bu anlamsız harf öbeklerini uygulamalarımızda Guid.NewGuid() fonksiyonunu kullanıp Guid (Globally Unique Identifier) oluşturarak veya SQL'de newid() fonksiyonu ile oluşturabiliriz.

    Bu makalemde ise ben kullanıcının önceden belirlediği kriterlere göre şifre oluşturan bir class yazacağım. Bu kriterler şifrede kullanılacak olan harf, rakam ve sembol sayıları olacak ve kullanıcı şifre oluşturulurken kullanılacak olan harf, rakam ve sembolleri istediği taktirde belirleyebilecek. Şifre oluşturan class'ı yazdıktan sonra da örnek bir uygulamada kullanımını inceleyeceğiz.

    Şifre oluşturacak olan class'ımızı yazmaya başlamadan önce class'ın çalışma mantığını inceleyelim. Yazacağımız class HarfSayisi, SembolSayisi ve RakamSayisi property'leri set edildiğinde SifreyiOlustur fonksiyonu ile bizim için belirlemiş olduğumuz sayıda karakter içeren bir şifre oluşturacak. Aynı zamanda şifrede yeralmasını istenilen harfleri, sembolleri ve rakamları set edip, şifre oluşturulduğunda sadece belirlenenlerin kullanılması da mümkün olacak.

    Aşağıda PasswordGenerator class'ının öğeleri listelenmiştir:

Property'ler

RakamSayisi (int)

Şifrede kaç tane rakam kullanılacağının set edildiği property'dir.

HarfSayisi (int)

Şifrede kaç tane harf kullanılacağının set edildiği property'dir.

SembolSayisi (int)

Şifrede kaç tane sembol kullanılacağının set edildiği property'dir.

Harfler (string[])

Şifre oluşturulurken hangi harflerin kullanılacağının set edildiği property'dir.

Semboller (string[])

Şifre oluşturulurken hangi sembollerin kullanılacağının set edildiği property'dir.

Rakamlar (string[])

Şifre oluşturulurken hangi rakamların kullanılacağının set edildiği property'dir.

Constructor'lar

PasswordGenerator()

 

PasswordGenerator(int RakamSayisi, int HarfSayisi, int SembolSayisi)

 

Fonksiyon

SifreyiOlustur (string)

Şifreyi generate eden fonksiyon

    Aşağıda görüldüğü üzere Harfler, Semboller ve Rakamlar property'leri default olarak değer taşımaktadırlar fakat bu property'ler readonly tanımlanmamışlardır, kullanıcı tarafından değer atanabilir:

private string[] _Harfler = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "v", "y", "z" };
public
string[] Harfler
{
    get { return _Harfler; }
    set
{ _Harfler = value; }
}

private string[] _Semboller = new string[] { "!", "@", "#", "$", "%", ",", "&", "*" };
public string[] Semboller
{
    get
{ return _Semboller; }
    set
{ _Semboller = value; }
}

private string[] _Rakamlar = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
public string[] Rakamlar
{
    get
{ return _Rakamlar; }
    set
{ _Rakamlar = value; }
}

    PasswordGenerator class'ının diğer property'leri de aşağıdaki şekilde tanımlanmışlardır:

private int _RakamSayisi;
public
int RakamSayisi
{
    get
{ return _RakamSayisi; }
    set
{ _RakamSayisi = value; }
}

private int _HarfSayisi;
public
int HarfSayisi
{
    get
{ return _HarfSayisi; }
    set
{ _HarfSayisi = value; }
}

private int _SembolSayisi;
public
int SembolSayisi
{
    get
{ return _SembolSayisi; }
    set
{ _SembolSayisi = value; }
}

    PasswordGenerator constructor'ları aşağıdaki gibi tanımlanmıştır:

public PasswordGenerator()
{

}

public PasswordGenerator(int RakamSayisi, int HarfSayisi, int SembolSayisi)
{
    _RakamSayisi = RakamSayisi;
    _HarfSayisi = HarfSayisi;
    _SembolSayisi = SembolSayisi;
}

    Aşağıda kodu bulunan SifreyiOlustur fonksiyonunu ile şifre oluşturulabilir:

public string SifreyiOlustur()
{
    Random
rnd = new Random();
    List
<string> sifre = new List<string>(_RakamSayisi + _HarfSayisi + _SembolSayisi);
    for
(int ir = 0; ir < _RakamSayisi; ir++)
    {
        sifre.Add(_Rakamlar[rnd.Next(0, _Rakamlar.Length)]);
    }
    for
(int ih = 0; ih < _HarfSayisi; ih++)
    {
        sifre.Add(_Harfler[rnd.Next(0, _Harfler.Length)]);
    }
    for
(int i = 0; i < _SembolSayisi; i++)
    {
        sifre.Add(_Semboller[rnd.Next(0, _Semboller.Length)]);
    }

string olusturulanSifre = "";

while
(sifre.Count > 0)
{
    int
rand = rnd.Next(0, sifre.Count);
    olusturulanSifre += sifre[rand];
    sifre.RemoveAt(rand);
}

return olusturulanSifre;
}


    Şifreyi oluştur fonksiyonunda ilk olarak Random bir değişken tanımlıyoruz. Bu random değişken Harfler, Rakamlar ve Semboller array'lerindeki elemanların random index'lerindeki elemanları oluşturacağımız şifreye atayacak.

    Ardından ise string tipinde veri taşıyacak olan bir List tanımlıyoruz ve uzunluğunu şifredeki rakam, harf ve sembollerin sayılarının toplamı olarak belirliyoruz.

    Sonra üç ayrı for döngüsünde belirlenmiş olan rakam sayısı, harf sayısı ve sembol sayısı kadar karakteri class'ın Harfler, Rakamlar ve Semboller array'lerinden random olarak seçip sifre List'ine ekliyoruz.

    Sonrasında ise string tipinde olusturulanSifre değişkenini tanımlıyoruz ve bir while döngüsünde sifre List'indeki elemanlar bitene kadar List'in random indexlerindeki karakterleri olusturulanSifre değişkenine atıyoruz ve atadığımız elemanı List'ten çıkarıyoruz. Bunu yapmamızdaki amaç oluşturduğumuz şifredeki rakam, harf ve sembollerin harf harf, rakam rakam veya sembol sembol gruplanmış şekilde değil, birbirlerine karışmış şekilde string değişkene yerleşmelerini sağlamak.

    Son olarak da fonksiyonumuzu olusturulanSifre değişkenini döndürecek şekilde tamamlıyoruz.

    Şimdi oluşturduğumuz PasswordGenerator class'ını bir windows uygulaması içinde kullanalım. Bir Windows formunu aşağıdaki şekilde tasarlayalım:



    Formdaki textbox'lara şifrede kullanılacak olan öğelerin sayılarını yazdıktan sonra Oluştur butonuna basıldığında formdaki label'da oluşturulan şifre görüntülenecek. Şimdi Oluştur butonunun Click event'ine aşağıdaki kodu yazalım:

private void btnOlustur_Click(object sender, EventArgs e)
{
    if
(txtHarfSayisi.Text != "" || txtRakamSayisi.Text != "" || txtSembolSayisi.Text != "")
    {
        PasswordGenerator
pg = new PasswordGenerator();
        pg.HarfSayisi = Convert.ToInt32(txtHarfSayisi.Text);
        pg.RakamSayisi = Convert.ToInt32(txtRakamSayisi.Text);
        pg.SembolSayisi = Convert.ToInt32(txtSembolSayisi.Text);
        pg.Semboller = new string[] {"#", "@", "!", "*" };
        lblSifre.Text = pg.SifreyiOlustur();
    }
}


    PasswordGenerator class'ının bir instance'ını aldıktan sonra HarfSayisi, RakamSayisi ve SembolSayisi property'lerine textbox'lardaki değerleri atıyoruz. Semboller property'sinde ise kullanılacak olan #, @, ! ve * sembollerini tanımlıyoruz. lblSifre'nin text property'sine de SifreyiOlustur fonksiyonunun geri döndürdüğü değeri atıyoruz.

    Uygulamamızda butona bastığımızda şifremiz aşağıdaki gibi oluşturulacaktır:



    Bu makalemde programatik olarak şifre oluşturmaktan bahsettim. Umarım faydalı olmuştur.

    Işıl ORHANEL