Rehber Şifreleme nedir, şifreleme nasıl yapılır, şifreler nasıl yönetilir, tuzlama nedir?

Merhaba.

Bugün sizlere günümüzün şifreleme ve veri saklama konuları hakkında bilgiler vermeye çalışacağım.

Makalemiz 4 ana maddeden oluşuyor;
  • Şifreleme nedir?
  • Şifreleme nasıl yapılır?
  • Şifreler nasıl yönetilir?
  • Tuzlama nedir?

Öncelike Şifreleme nedir?

Şifreleme
, dümdüz okunabilir bir verinin bazı şifreleme algoritmaları ile şifrelenip okunabilir halden çıkarılma işlemine denir.

Şifreleme algoritması nedir?

Şifreleme algoritması
, karmaşık matematiksel işlemler ile verdiğimiz şifre değerini kendi içindeki algoritma ile karıştırıp belli bir uzunluğa getirmesidir.

2 tip şifreleme vardır;
  • Tek Yönlü Şifreleme.
  • Çift Yönlü Şifreleme.
Tek Yönlü Şifreleme: Veri tekrar eski haline getirilmek istenmiyorsa veya sadece şifrelenmiş değerini almak isteniyorsa kullanılan bir yöntemdir.

Örneğin bir dosyanın Hash değerini almak için tek yönlü şifreleme yapılır.

MD5, SHA-1, SHA-256, SHA-384, SHA-512 bazı tek yönlü şifreleme algoritmalarının örnekleridir.

Örneğin veri tabanlarında saklanan şifrelerin login olmak için kendi şifremizi girdiğimiz zaman eşleştirmek için girdiğimiz şifre önce Hash algoritması ile şifrelenir ve veri tabanındaki değer ile sonra karşılaştırılır.

Günümüz şartlarında MD5 ve SHA-1 bypass edilebilir seviyeye geldi. "Bypass edilmekten kastın nedir?" dediğinizi diye duyar gibiyim.

Hash Algoritma Bypass'ı: Dosya içeriğinden bir virgül dahi değişse şifrelenen değer değişir.

Ancak bazı yöntemler ile dosya içeriği değiştirilse bile Hash değeri aynı kalabiliyor. Buna da Hash Algoritma Bypass'ı diyoruz. O yüzden SHA-256 ve sonrası bir Hash algoritma değeri olmadığı sürece %100 güvenmeyin.

Çift Yönlü Şifreleme: Günümüzün en çok kullanılan şireleme yöntemidir. Whatsapp gibi mesajlaşma platformlarının kullandığı bir yöntemdir.

Çift yönlü şifrelemenin 2 yöntemi vardır.

  • Asimetrik Şifreleme.
  • Simetrik Şifreleme.
Simetrik şifreleme: Daha hızlı olması nedeniyle birçok modern bilgisayar sisteminde veri koruması için yaygın olarak kullanılır. Örneğin, gelişmiş şifreleme standardı (AES) Amerika Birleşik Devletleri hükümeti tarafından gizli ve hassas bilgileri şifrelemek için kullanılmaktadır. AES, 1970'lerde simetrik şifreleme standardı olarak geliştirilen veri şifreleme standardı'nın (DES) yerini almıştır.

Asimetrik şifreleme: Birçok kullanıcının bir mesaj ya da veri setini şifrelemesi ya da bunların şifresini çözmesi gerektiği, özellikle hız ve hesaplama gücünün başlıca önem teşkil etmediği sistemlerde uygulanabilir. Böylesi sistemlere örneklerden biri mesajı şifrelemek için açık anahtarın, mesajın şifresini çözmek için de özel anahtarın kullanıldığı şifreli içeriktir.

Whatsapp gibi mesajlaşma sistemleri Asimetrik Şifreleme kullanmaktadır. Mesaj gönderilirken 2 adet anahtar oluşturulur.
  • Public Key (Açık Anahtar).
  • Private Key (Kapalı Anahtar).



Public Key ile şifrelenen veri Private Key ile, Private Key ile şifrelenen veri ise Public Key ile deşifre edilebilir. Adlarından da anlaşılacağı gibi Private Key kişiye özel gizli bir anahtar, Public Key ise herkese açık bir anahtardır. İletişime geçilmek istenen kişinin Public Key’i ile şifrelenen veri sadece ilgili kişinin Private Key’i ile deşifre edilebileceği için güvenli bir şekilde ilgili kişiye iletilebilir.

Sadece ilgili kişiye Private Key gönderilir ve sadece ilgili kişi mesajı deşifre edip ilgili içeriği görebilir.

Şifreleme nasıl yapılır?

Öncelikle şifreleme yapmanın tonla algoritma vardır.


Bugün sizlere SHA-1, SHA-256, SHA-512 ve AES algoritmalarını kullanarak şifreleme yapmayı göstereceğim.

Kolay bir şekilde anlamanız için Form ile göstereceğim.



Form tasarımı bu şekilde;
  • 6 adet TextBox.
  • 6 adet Label.



Şimdi gerekli kütüphaneyi yazalım. C# da şifreleme yapmak için System.Security.Cryptography kütüphanesi kullanılır.

C#:
using System.Security.Cryptography;

Gerekli tüm kitaplıklar;

C#:
using System;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;

Şimdi 3 metin girişi için yazı değiştiği anda çalışan Event'ler yaptım ve içerisine gerekli kodları bu şekilde ekledim. Her metin kutusu altındaki metin kutusuna sonuç gösteriyor.




C#:
        private void SHA1_Input_TextChanged(object sender, EventArgs e){
            string get_text = SHA1_Input.Text.Trim();
            using (SHA1 sha1Hash = SHA1.Create()){
                byte[] sourceBytes = Encoding.UTF8.GetBytes(get_text);
                byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                string hash_value = BitConverter.ToString(hashBytes).Replace("-", String.Empty);
                SHA1_Sonuc.Text = hash_value;
            }
            sha1_label.Text = SHA1_Sonuc.TextLength.ToString() + " Uzunlukta";
        }

        private void SHA256_Input_TextChanged(object sender, EventArgs e){
            string get_text = SHA256_Input.Text.Trim();
            using (SHA256 sha1Hash = SHA256.Create()){
                byte[] sourceBytes = Encoding.UTF8.GetBytes(get_text);
                byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                string hash_value = BitConverter.ToString(hashBytes).Replace("-", String.Empty);
                SHA256_Sonuc.Text = hash_value;
            }
            sha256_label.Text = SHA256_Sonuc.TextLength.ToString() + " Uzunlukta";
        }

        private void SHA512_Input_TextChanged(object sender, EventArgs e){
            string get_text = SHA512_Input.Text.Trim();
            using (SHA512 sha1Hash = SHA512.Create()){
                byte[] sourceBytes = Encoding.UTF8.GetBytes(get_text);
                byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                string hash_value = BitConverter.ToString(hashBytes).Replace("-", String.Empty);
                SHA512_Sonuc.Text = hash_value;
            }
            sha512_label.Text = SHA512_Sonuc.TextLength.ToString() + " Uzunlukta";
        }




Gördüğünüz üzere hepsinde girilen metin aynı. Ancak hepsi farklı değerler ve farklı uzunluklar veriyor. işte bu Tek Yönlü Şifrelemedir.

Şimdi ise Simetrik yapalım. Bunun için AES algoritmasını kullanacağım.

Not: Simetrik şifrelemeyi yazmak daha uzun ve zordur.

Gerekli kütüphaneler;


C#:
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;

Farklı bir form açtım;
  • 3 adet TextBox.
  • 3 adet Label.


Yine aynı şekilde Metin değiştiği anda işleyecek şekilde bir algoritma yazdım.





C#:
         private void MetinTextBox_TextChanged(object sender, EventArgs e){
            try{
                // Yeni bir anahtar ve başlatma vektörü (IV) oluşturan AES oluşturulur.
                // Şifreleme ve şifre çözmede aynı anahtar kullanılmalıdır.
                using (AesManaged aes = new AesManaged()){
                    // Dizeyi şifrele
                    byte[] encrypted = Encrypt(MetinTextBox.Text, aes.Key, aes.IV);
                    // Şifrelenmiş diziyi yazdır
                    Encryp_TextBox.Text = Encoding.UTF8.GetString(encrypted);
                    // Baytların şifresini bir dizeye çevir
                    string decrypted = Decrypt(encrypted, aes.Key, aes.IV);
                    // Şifresi çözülmüş diziyi yazdır. Ham verilerle aynı olmalıdır.
                    Decrypt_TextBox.Text = decrypted;
                }
            }catch (Exception){ }
        }

        static byte[] Encrypt(string plainText, byte[] Key, byte[] IV){
            byte[] encrypted;
            // Yeni bir AesManaged oluşturun.
            using (AesManaged aes = new AesManaged()){
                // Şifreleyici oluştur
                ICryptoTransform encryptor = aes.CreateEncryptor(Key, IV);
                // MemoryStream'i oluştur
                using (MemoryStream ms = new MemoryStream()){
                    // CryptoStream sınıfını kullanarak kripto akışı oluşturun. Bu sınıf şifrelemenin anahtarıdır
                    // ve herhangi bir veri akışındaki verileri şifreler ve şifrelerini çözer. Bu durumda, bir bellek akışı geçireceğiz
                    // şifrelemek için
                    using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)){
                        // StreamWriter oluşturun ve bir akışa veri yazın
                        using (StreamWriter sw = new StreamWriter(cs))
                        sw.Write(plainText);
                        encrypted = ms.ToArray();
                    }
                }
            }
            // Şifrelenmiş verileri döndür
            return encrypted;
        }
        static string Decrypt(byte[] cipherText, byte[] Key, byte[] IV){
            string plaintext = null;
            // AesManaged'i oluştur
            using (AesManaged aes = new AesManaged()){
                // bir şifre çözücü oluştur
                ICryptoTransform decryptor = aes.CreateDecryptor(Key, IV);
                // Şifre çözme için kullanılan akışları oluşturun.
                using (MemoryStream ms = new MemoryStream(cipherText)){
                    // Kripto akışı oluştur
                    using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)){
                        // Kripto akışını oku
                        using (StreamReader reader = new StreamReader(cs))
                        plaintext = reader.ReadToEnd();
                    }
                }
            }
            // Çözülmüş verileri döndür
            return plaintext;
        }




Gördüğünüz üzere veri AES ile şifrelendi ve sonra geri çözüldü.

Şifreler nasıl yönetilir?

Şifreler sizin girdiğiniz şekilde veri tabanlarında tutulmazlar. Yukarıda da bahsettiğim gibi şifreleme algoritmaları ile şifrelenerek tutulur.

Peki şöyle bir soru sorabilirsiniz:
"Biz şifremizi normal şifre gibi giriyoruz, nasıl karşılaştırma yapılıyor?" diye sorabilirsiniz.

Evet, güzel soru. Siz şifrenizi girip giriş yap butonuna bastığın anda kendi içerisinde algoritma sizin girdiğiniz şifreyi şifreliyor. Sonra şifrelenen şifreniz veri tabanında yer alan şifreniz ile karşılaştırılıyor. Bu sayede oturum açıyorsunuz. Hem hizmet sağlayıcısı şifrenizi bilmiyor, hem de saldıracak kişiler bilemiyor.

Veri güncelleme yaparken de aynı işlem geçerli.

Yine aynı şekilde yeni şifreniz algoritmalar ile şifrelenip veri tabanına kayıt ediliyor
.

Sadece güncelleme işlemlerinde eski şifrenizi isteyebiliyor. Bu aşamada ise aynı login olurken yaptığı işlemi bu sefer eski şifreniz için ekstra olarak yapıyor. Bu sayede eski şifreniz aynı olursa yeni şifrenizi şifreleyip veri tabanına kayıt ediyor.

Tuzlama nedir?

Tuzlama biraz değişik bir yerelleştirme terimi olabilir
. Salting olarak geçer. Bu şifrelenen veriyi daha güvenli hale getirmek için veri içeriğini değiştirmek olarak diyebiliriz.

Sizin girdiğiniz değer + salt metin. Yani sizin veriniz ile hizmet sağlayıcının belirlediği tuzlanmış, yani özel olarak hazırlanmış değer sizin verinize ekleniyor. Bu sayede sizin şifrenizi bilen kişi salt metni bilmediği sürece verinize ulaşamıyor.

Şimdi az önceki örnekler üzerinden devam edelim.

Form arayüzünü bu şekilde değiştirdim.




Gerekli kütüphaneler;

C#:
using System;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;

Hem metin kutuları hem de salt metin kutuları değeri değiştiğindi anda çalışan bir yapı yaptım.







C#:
        private void SHA1_Input_TextChanged(object sender, EventArgs e){
            sha_1();
        }
        private void SHA1_Salt_Input_TextChanged(object sender, EventArgs e){
            sha_1();
        }

        private void SHA256_Input_TextChanged(object sender, EventArgs e){
            sha_256();
        }
        private void SHA256_Salt_Input_TextChanged(object sender, EventArgs e){
            sha_256();
        }

        private void SHA512_Input_TextChanged(object sender, EventArgs e){
            sha_512();
        }
        private void SHA512_Salt_Input_TextChanged(object sender, EventArgs e){
            sha_512();
        }


        private void sha_1(){
            string get_text = SHA1_Input.Text.Trim() + SHA1_Salt_Input.Text.Trim();
            using (SHA1 sha1Hash = SHA1.Create()){
                byte[] sourceBytes = Encoding.UTF8.GetBytes(get_text);
                byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                string hash_value = BitConverter.ToString(hashBytes).Replace("-", String.Empty);
                SHA1_Sonuc.Text = hash_value;
            }
            sha1_label.Text = SHA1_Sonuc.TextLength.ToString() + " Uzunlukta";
        }

        private void sha_256(){
            string get_text = SHA256_Input.Text.Trim() + SHA256_Salt_Input.Text.Trim();
            using (SHA256 sha1Hash = SHA256.Create()){
                byte[] sourceBytes = Encoding.UTF8.GetBytes(get_text);
                byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                string hash_value = BitConverter.ToString(hashBytes).Replace("-", String.Empty);
                SHA256_Sonuc.Text = hash_value;
            }
            sha256_label.Text = SHA256_Sonuc.TextLength.ToString() + " Uzunlukta";
        }

        private void sha_512(){
            string get_text = SHA512_Input.Text.Trim() + SHA512_Salt_Input.Text.Trim();
            using (SHA512 sha1Hash = SHA512.Create()){
                byte[] sourceBytes = Encoding.UTF8.GetBytes(get_text);
                byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                string hash_value = BitConverter.ToString(hashBytes).Replace("-", String.Empty);
                SHA512_Sonuc.Text = hash_value;
            }
            sha512_label.Text = SHA512_Sonuc.TextLength.ToString() + " Uzunlukta";
        }


Salt olmadan önceki şekli;



Salt ile birlikte olan şekli;



Kod:
Formül: Metin + Salt Metin = Şifrelenmiş güvenli şifre

Gördüğünüz üzere şifreleme işlemleri bu şekilde.

Umarım kolay anlaşılır bir şekilde anlatmışımdır.

Yazılım rehberlerimin devamı gelecek.

İyi çalışmalar, kolay gelsin


Makale güncellemesi;
----------------------------------------------------------------------------------


MD5, SHA-1, SHA-256, SHA-384 ve SHA-512 şifreleme değildir. Hash'leme algoritmalarıdır.

Ek olarak uçtan uca şifreleme AES algoritması ile çalışmaz. AES simetrik bir algoritmadır ve tek anahtar gerekir.

Uçtan uca şifreleme Asimetrik, yani Public/Private mantığını kullanır. RSA algoritmasını kullanır.
 
Son düzenleme:

Hocam Back-End de asp.net kullanılıkrne bunlar kullanlmıyor değil mi?
 
Ellerinize sağlık hocam, çok ayrıntılı ve çok güzel bir rehber olmuş
 
Bununla beraber yazılımımızı obfuscate etmemiz lazım. Yoksa kullandığımız şifreleme yöntemini kolayca bulabilirler.
 
Bununla beraber yazılımımızı obfuscate etmemiz lazım. Yoksa kullandığımız şifreleme yöntemini kolayca bulabilirler.

Çift yönlü şifreleme için evet. Ancak "karıştırma" çok farklı bir alan. Bu rehber, şifreleme ile ilgili bir rehber oldu. Belki başka zaman "karıştırma" için bir rehber hazırlarım

Çok eğlenceli geliyor. PHP'de de mantık aynı mı?

Evet
 
Rehberi şıkır şıkır yapmışsın Eline sağlık güzel olmuş.
 
Hocam rehberler gerçekten süper. Elinize emeğinize sağlık. Bir tane kod bloğu koyup önümüze sürmektense mantık ve terimleri de açıklamışsınız. Teşekkür ederim.

Fırsat bulabilirsem bende web frontend/backend için rehber hazırlamayı düşünüyorum. Fikir verebilir misiniz?
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…