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;
Ö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;
Ö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: 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 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;
Şimdi gerekli kütüphaneyi yazalım. C# da şifreleme yapmak için
Gerekli tüm kitaplıklar;
Ş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.
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;
Farklı bir form açtım;
Yine aynı şekilde Metin değiştiği anda işleyecek şekilde bir algoritma yazdım.
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;
Hem metin kutuları hem de salt metin kutuları değeri değiştiğindi anda çalışan bir yapı yaptım.
Salt olmadan önceki şekli;
Salt ile birlikte olan şekli;
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.
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.
Ö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.
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: