Batuhan TOSUN
       confidentiality, integrity, availability

Kerberos ile small application yapıp Isa server'a dayanak sunmak...

clock Mayıs 28, 2009 03:37 author Batuhan Tosun tarafından yayınlanmıştır

Kerberos algoritması ile .net platformunda küçük bir uygulama ile internete çıkışları kontrol edebilceğimiz bir program yazabileceğimizi biliyormuydunuz?

Kabul ediyorum biraz ilginç bir yazı oldu.Sanki DC 'de reklam arası yazıları gibi....Ancak cevabı, ayrıntısı ve uygulaması ile çok yakında blogumda olacak...Üstelik bu şirketimin dışarıya sunduğu ilk open source orta çaplı bir program olacak...Bence böyle projeler Türkiyede Bilgi Güvenliğinin gelişmesi için çok önemli...

 Gelecek mailler için şimdiden teşekkürler:)Görüşmek üzere...



Cuma günü Marmara Üniversitesindeyim, .Net Güvenliği ve Uygulamalı Sql Injection önlemlerini anlatacağım

clock Mayıs 11, 2009 12:26 author Batuhan Tosun tarafından yayınlanmıştır

Bu cuma Marmara Üniversitesi Teknik Eğitim Fakültesinde .Net Güvenliği ve Kriptografi seminerim var.Anltıma ek olarak Web Güvenliği ve Bir Saldırının Anatomisini işleyeceğiz.Uygulama konusu olarak Sql Injection saldırıları ve bunu .net platformunda nasıl engelleyebiliriz bunları bakacacağız.

Seminer sadece Mühendislik Fakültesi ve Teknik Eğitim fakültesine özel olarak gerçekleşecek.Fakat ben bu seminere kesinlikle gelmek istiyorum diyenler(sayısı çok fazla olmamak şartı ile) bana e-mail göndersinler.E-mail adresim: batuhantosun@zaferhan.net

Seminerde görüşmek üzere.Sağlıcakla...



SQL Injection Nasıl Önlenir? Web Güvenliği Nasıl Sağlanır?

clock Nisan 14, 2009 12:14 author Batuhan Tosun tarafından yayınlanmıştır

Sql injection çoğu kişinin bildiği gibi veritabanına ulaşmak için açıklardan faydalanılarak yapılan bir saldırı methodudur.Bu saldırı biçimi kod yapısında Exploit dediğimiz sistemi sömüren yapının bir türevidir.Asp .Net ile yaptığımız ve veritabanı kullandığımız bir sitede bunu nasıl önleyebiliriz onu göreceğiz.

Direk olarak konuya yane uygulamaya giriyorum.

İlk olarak aklımıza login.aspx sayfasını getirelim.Buraya girip user ve pass girişimizi yaptığımızda sitenin güvenli bölümüne yönlendirir.İşte güvenliği sağlayacağımız alanda burası.Diğer alanlar içinde kısmi güvenliği bu bölümü yazdığımız kodlar aracılığı ile sağlayacağız.

VS.Net te var olan projemizde iki tane component yaratıyorum ve birinin adını hashed.cs birinin adınıda guvenlibaglanti.cs olarak atıyorum.

 

hashed.cs componentinde yaratacağımız ve atayacağımız kod bloğu aşağıdaki gibi olacaktır.

 

using System;

using System.Web.Security;

using System.Security.Cryptography;

namespace Encryption

{

 

public class hashed

{

static public bool ValidatePassword (string password, string saltedHash) {

//tanımlamaların boyutu için karmalama yapıyoruz

string saltString = saltedHash.Substring (saltedHash.Length - 24);
string hash1 = saltedHash.Substring (0, saltedHash.Length - 24);

// Şifrelemeye yardımcı method ekliyoruz

string saltedPassword = password + saltString;

// şifreleme tabanını oluştuyoruz.

string hash2 = FormsAuthentication.HashPasswordForStoringInConfigFile (saltedPassword, "SHA1");

// hash i karıştırıp geri döndürüyoruz.Böylelikle güvenlik varyasyonunuda güçlü kılıyoruz.

return (hash1.CompareTo (hash2) == 0);

}

static public string CreateSaltedPasswordHash (string password) {

// providerlarımızı oluşturuyoruz.

RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider ();
byte[] saltBytes = new byte[16];

csp.GetNonZeroBytes (saltBytes);

string saltString = Convert.ToBase64String (saltBytes);

string saltedPassword = password + saltString; string hash = FormsAuthentication.HashPasswordForStoringInConfigFile
(saltedPassword,
"SHA1");

string saltedHash = hash + saltString;

return saltedHash;

}

}

}

 

Şifreleme ve güvenli girişi sağlayacak olan kodumuzu yukarıdaki gibi yarattık.

Şimdi guvenlibaglanti.cs componentimizi yaratıyoruz.Bu componentimizi connectionstring güvenliği için tanımlıyacağız.

 

using System;

using System.Configuration;

using System.Text;

namespace cryption

{

public class Guvenli_Baglanti

{

static public string GetCnxString(string configKey)

{

string strCnx;

try

{

// Şifreli bağlantı dizisini web.config içinde tutuyoruz.

string strEncryptedCnx = ConfigurationSettings.AppSettings[configKey];

// Bağlantı şifreli dizisine çöz.

DataProtector dp = new DataProtector(DataProtector.Store.USE_MACHINE_STORE);
byte[] dataToDecrypt = Convert.FromBase64String(strEncryptedCnx);

// Opsitonel parametreyi aşağıda boş bırakacağız.

 

strCnx =
Encoding.UTF8.GetString(dp.Decrypt(dataToDecrypt,null));

}

catch// Opsitonel parametreyi aşağıda boş bırakacağız.

{

strCnx=
"";

}

return strCnx;

}

}

}

 

 

ConnectionString güvenliğimiz için yarattığımız componentimizdede sona ulaştık.Şimdi login.aspx e gidiyoruz.Ve yapılandırma,ayar ve kodlamamızı yukarıdaki componenlerimizide kullanarak baştan yaratıyoruz.

 

login.aspx;

--------------------------------------------------------------------------- 

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

using System.Web.Security;

using Encryption;

namespace

SqlInject

{

public partial class baglanti : System.Web.UI.Page

{

protected void Login_Click(object sender, System.EventArgs e)

{

try

{

// Şifreli bağlantı dizesi

string strCnx = SecureConnection.GetCnxString("cnxNWindBest");

// Veritabanı bağlantısını oluşturuyoruz.

using(SqlConnection cnx = new SqlConnection(strCnx))

{

cnx.Open();

SqlCommand cmd = new SqlCommand("procGetHashedPassword", cnx);

cmd.CommandType = CommandType.StoredProcedure;

SqlParameter prm = new SqlParameter("@username", SqlDbType.VarChar,50);
prm.Direction = ParameterDirection.Input;
prm.Value = txtUser.Text;
cmd.Parameters.Add(prm);

// Giriş yapan kullanıcı için alınan hash şifresini yaratıyoruz.

string strHashedDbPwd = (string) cmd.ExecuteScalar();
if (strHashedDbPwd.Length>0)

{

// Girilen şifre ile kayıtlı olan şifre

// arasında doğrulama yapaıyoruz.

if (SaltedHash.ValidatePassword(txtPassword.Text, strHashedDbPwd))

{

FormsAuthentication.RedirectFromLoginPage(txtUser.Text, false);

}

else

{

lblMsg.Text =
"Giriş denemesi başarısız oldu.";

}

}

else

{

lblMsg.Text =
"Giriş denemesi başarısız oldu.";

}

}

}

catch

{

lblMsg.Text =
"Giriş denemesi başarısız oldu.";

}

}

}

}

 

Güvenli bağlantı ve şifreleme component leriyle güvenli ve sağlam bir login.aspx yapılandırması sağlıyoruz.Ben burda bişey daha eklemek istiyorum.Böyle bir site projemiz olduğuna göre siteye kullanıcıda eklememiz gereklidir.Sitenin saldırılarda maruz kaldığı diğer bir alanında add users bölümü olduğunu varsayarsak veritabanına güvenli kullanıcı nasıl ekliyebiliriz ona bakalım.Yukarda yaptığımız ve devam ettiğimiz projemizi bozmadan secure add user methodunu projeye ekleyelim.

Şimdi kodlamamıza bakalım;

 

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

using System.Web.Security;

using Encryption;

namespace SqlInject

{

public partial class AddSecureUser : System.Web.UI.Page

{

 

protected void cmdOk_Click(object sender, System.EventArgs e)

{

// Önce şifreli bağlantı dizesini oluşturuyoruz ardından deşifrelemeyi sağlıyoruz

//ve bağlantıyı kuruyoruz.

using (SqlConnection cnx = new SqlConnection(SecureConnection.GetCnxString("cnxNWindBest")))

{

cnx.Open();

SqlCommand cmd = new SqlCommand("procAddSecureUser", cnx);

cmd.CommandType = CommandType.StoredProcedure;

SqlParameter prm = new SqlParameter("@username", SqlDbType.VarChar, 50);
prm.Direction = ParameterDirection.Input;

prm.Value = txtUser.Text;

cmd.Parameters.Add(prm);

prm =
new SqlParameter("@hashedpassword", SqlDbType.VarChar, 100);prm.Direction = ParameterDirection.Input;

prm.Value = SaltedHash.CreateSaltedPasswordHash(txtPassword.Text);

cmd.Parameters.Add(prm);

prm =
new SqlParameter("@accesslevel", SqlDbType.VarChar, 20);
prm.Direction = ParameterDirection.Input;

prm.Value = txtAccessLevel.Text;

cmd.Parameters.Add(prm);

prm =
new SqlParameter("@email", SqlDbType.VarChar, 100);prm.Direction = ParameterDirection.Input;

prm.Value = txtEmail.Text;

cmd.Parameters.Add(prm);

 

int intRecs = cmd.ExecuteNonQuery();if (intRecs>0)

{

Response.Redirect(
"Default.aspx");

}

else

{

lblMsg.Text = "Yeni kullanıcı yaratılması başarısız oldu."

;

}

}

}

}

}

 

Bir web projesinde sql injection ve türevlerinden oluşan saldırılara karşı üç(3) aşamadan oluşan güvenlik politikamızı yarattık.Kodlamalarımızla yarattığımız bu güvenli sitede bahsetmediğim sadece içerisinde geçen storeprocedure kavramıdır.Onudaörnek kodu indirdiğinizde içinde bulabilirsiniz.Bu zamana kadar yaptığım cryptography örneklerinide kullanmış olduğumuz makalede aspx web site adına akılda kalan soru işaretlerini kaldırdığımıza inanıyorum.

Örnek olarak storedprocedure leri içeren sql dosyası uygulama dosyasındadır.Örnek kodları aşağıdaki linkten indirebilirsiniz.Herkese iyi çalışmalar.

DM-SqlInjectApp.rar (106,40 kb)


Başka bir makalede görüşmek üzere.Saygı ve sevgilerimle...



MacTribleDES

clock Nisan 14, 2009 12:12 author Batuhan Tosun tarafından yayınlanmıştır

Bu makalemizde MacTribleDES ten bahsedeceğim.Ancak ismi sizi yanıltmasın,ne kadar TrebleDES desek te hash algoritmasından türetilmis bir KeyedHash algoritmasıdır.

         MacTrebleDES  mesaj doğrulama kodu oluşturmak üzere türetilmiştir.Mesajı gönderen pc ile alan pc aynı anahtarı kullanırsa ve mac adresleri doğrularsa mesaj iletilmiş olur.Yane mesajı gönderen ve alan kişi için ortak bir anahtar mantığı üzerine oturtulmuş bir algoritmadır.
         İşte .Net Framework üzerindeki bu sınfta bu doğrulama kodlarının oluşturulması,adreslenmesi ve anahtarlanması  için türetilmiş bir sınıftır.

        .Net Framework üzerinde MacTribleDES  rgbkey  olarak tanımlanan  8 byte,16 byte ve 24 byte lık anahtar uzunluklarını oluşturur.Türettiği hash değeri ise 8 byte dır.

.Net Platformu üzerinde ;

System. Object 
System.Security.Cryptography.HashAlgorithm
System.Security.Cryptography.KeyedHashAlgorithm 

Namespace lerini   takip eder.

Tanımlanma blokları aşağıdadır. 

 

VB
Public Class MACTripleDES
   Inherits KeyedHashAlgorithm
C#
public class MACTripleDES : KeyedHashAlgorithm

C++
public __gc class MACTripleDES : public KeyedHashAlgorithm
 
 
Yine üç ayrı dil bakımından oluşturma aşamasındaki  birer küçük kod bloklarıyla devam edelim.  
 
VB
Dim data(DATA_SIZE) As Byte
Dim key(24) As Byte
       
Dim mac3des As New MACTripleDES(key)
       
Dim result As Byte() = mac3des.ComputeHash(data)
 
C#
byte[] data = new byte[DATA_SIZE];
byte[] key = new byte[24];
 
MACTripleDES mac3des = new MACTripleDES(key);
 
byte[] result = mac3des.ComputeHash(data);
 
 
C++
Byte data[] = new Byte[DATA_SIZE];
Byte key[] = new Byte[24];
 
MACTripleDES* mac3des = new MACTripleDES(key);
 
Byte result[] = mac3des->ComputeHash(data);
 
 
 

Konsept bir örnekle devam edelim…… 

 

 Örn:

 
{
        
        private TripleDES alg;
        private CryptoStream stream;
        private byte[] block;
 
        
        public MACTripleDES()
        {
        HashSizeValue = 64;
        KeyValue = new byte [24];
       CryptoMethods.GenerateRandom(KeyValue, 0, 24);
              SetupAlgorithm(CryptoConfig.TripleDESDefault);
                       }
        public MACTripleDES(byte[] rgbKey)
                       {
                               HashSizeValue = 64;
                               if(rgbKey == null)
                               {
                                      throw new ArgumentNullException("rgbKey");
                               }
                               KeyValue = rgbKey;
                               SetupAlgorithm(CryptoConfig.TripleDESDefault);
                       }
        public MACTripleDES(String strTripleDES, byte[] rgbKey)
                       {
                               HashSizeValue = 64;
                               if(rgbKey == null)
                               {
                                      throw new ArgumentNullException("rgbKey");
                               }
                               KeyValue = rgbKey;
                               SetupAlgorithm(strTripleDES);
                       }
 
        
        ~MACTripleDES()
                       {
                               Dispose(false);
                       }

 

 Tam mantığını oturtmak için çok güzel bir örnekti.Şimdi  herşeyin oturması için  bir uygulamaya daha bakalım. 

Uyg: 

using System.IO;
using System.Text;
using System.Collections;
using System.Security.Cryptography;
 
namespace csMACTripleDES

 ………………….
…………………  
………….
…….
……
  

private static void EncodeNothing()
        {
            MACTripleDES macTriple = new MACTripleDES();
 
            macTriple.Initialize();
 
            byte[] key = new byte[24];
            RandomNumberGenerator.Create().GetBytes(key);
            macTriple.Key = key;
 
            macTriple.ComputeHash(new byte[1024]);
            SummarizeMAC(macTriple, "MACTripleDES after initialization.");
        }
 
        
        private static void EncodeStream()
        {
            byte[] keyData = new byte[24];
            RandomNumberGenerator.Create().GetBytes(keyData);
            MACTripleDES macTriple = new MACTripleDES(keyData);
 
            string filePath = (System.IO.Directory.GetCurrentDirectory() +
                "\\members.txt");
            try
            {
                FileStream fileStream =
                    new FileStream(filePath, FileMode.Open, FileAccess.Read);
 
                macTriple.ComputeHash(fileStream);
 
                SummarizeMAC(macTriple, 
                    "MACTripleDES after encoding a file stream.");
            }
            catch (FileNotFoundException ex)
            {
                Console.WriteLine("Specified path was not found: "
                    + filePath);
            }
        }
 
        
        private static void EncodeMessage()
        {
            byte[] keyData = new byte[24];
            RandomNumberGenerator.Create().GetBytes(keyData);
            MACTripleDES macTriple = new MACTripleDES(keyData);
 
            string message = "Encoding is fun!";
            byte[] encodedMessage = 
                EncodeBytes(Encoding.ASCII.GetBytes(message));
 
            macTriple.ComputeHash(encodedMessage);
 
            SummarizeMAC(macTriple, "MACTripleDES after encoding a message.");
        }
        
        
        private static byte[] EncodeBytes(byte[] sourceBytes)
        {
            int currentPosition = 0;
            byte[] targetBytes = new byte[1024];
            int sourceByteLength = sourceBytes.Length;
 
            
            byte[] key = new byte[24];
            RandomNumberGenerator.Create().GetBytes(key);
            string tripleDesName = "System.Security.Cryptography.TripleDES";
            MACTripleDES macTriple = new MACTripleDES(tripleDesName, key);
 
            
            int inputBlockSize = macTriple.InputBlockSize;
  try
            {
………………………………………………………………………………………
 
Son Söz
 
.Net Security üzerine güzel bir kaynak olduğunu düşünüyorum.Bu zaman kadar ki makalelerimi okuyan arkadaşlarımızın yavaş yavaş bişeyler yapmaya başladığını hissediyorum…Ancak şunu her zaman belirtmek istiyorumki hiçbir durumda tam güvenlik diye bir şey yoktur , kimse kendini zorlamasın.Bazen alt ve üst limitlerini bilmekte her zaman için fayda vardır!!!  
 
 
 Bir sonraki makalemde görüşmek ümidi  ile ……….Mutlu Günler Dilerim……

 



TribleDES Algoritması

clock Nisan 14, 2009 12:12 author Batuhan Tosun tarafından yayınlanmıştır

TribleDES algoritması,DES algoritması üzerine geliştirerek ve açıkları kapatılarak yazılmıştır.Bir önceki makalemde belirttiğim gibi DES algoritması brute force(deneme yanılma)  saldırılar için en mükemmel blok şifreleme algoritması.Ancak SBox tan kaynaklanan açıklardan dolayı DES , brute force saldırılarında bir yerden sonra zorlanmaya  başlıyordu.Bundan dolayı 1978 yılında IBM tarafından TribleDES geliştirildi.

         Peki DES algoritmasına alternatif olarak yazılan algoritmada yeni neler vardır.

         Birincisi DES algoritmasınınüç kere üst üste şifrelenmesiyle oluşuyordu.Yane bir tripledes üç kere şifrlenmiş DES algoritmasıdır.İkincisi ve bence en önemlisi anahtar bit düzeyinin 168 bit e yükseltilmesidir.Son olarak üçüncüsü algoritmanın çift yönlü çalışmasıdır.

          İlk dediğim gibi bunlar yenilik peki dezavantajı hiçmi yok.

          Yukarıda  üç kere DES algoritması yapılmasıyla algoritma dönüyor dedik.Ozaman DES e göre üç kat daha yavaştır.Ve artık 3DES yavaş yavaş bitiyor.Halen daha birçok banka,e-ticaret(en çok kullanılan yerler)kullanıyor , ancak AES gibi aynı güvenlik düzeyinde ve altı kat daha hızlı çalışan bir algoritma varken, ömrünün daha uzun seneler gideceği söylenemez.

 

          Şimdi bu bilgilerimizi DES algoritma bilgilerimizle ve teori bilgilerimizle birleştirip  çok basit bir şifreleme programı yazalım.

 

  using System.IO;
using System.Data;
using System.ComponentModel;
using System.Security.Cryptography; 

namespace tripledes

{      

public abstract class sifrele : SymmetricAlgorithm   

{       

public static string sifre(string don, string ekle, string kil)       

 {           

SymmetricAlgorithm tdes = new TripleDESCryptoServiceProvider();  
         
tdes ekle = Convert.FromBase64String(ekle);
  
         
tdes kil = Convert.FromBase64String(kil);
    
       
Byte[] bit = new byte[128];
           

try           
{
                

ICryptoTransform syc = tdes.CreateEncryptor(tdes.ekle, tdes.kil);               
 //byte[] ?=Encoding.UTF8.GetBytes(stringTo……); 
               
bit = Encoding.UTF8.GetBytes(don);
               

MemoryStream mm = new MemoryStream();               
CryptoStream scs = new CryptoStream(mm, syc, CryptoStreamMode.Write);
               

scs.Write(bit, 0, bit.Length);
               
scs.FlushFinalBlock();
               
scs.Close();
               

return Convert.ToBase64String(mm.ToArray());           

 }           

catch (Exception )           
{
                

throw (new Exception("Şifre paketleme tamamlanamadı.", start));          

  }       

 }  
    
   
     }

} 

 


Güvenli Günler Dilerim..
 

Saygı ve Sevgilerimle…



RC2 Deşifreleme Uygulaması

clock Nisan 14, 2009 12:11 author Batuhan Tosun tarafından yayınlanmıştır

namespace rc2desifreleme

{

public class Class1

{

private static void desifre(string dosya, string sifre)

{

//parametrelerimizi tanımlıyoruz

bool devam = parametre(dosya, ref sifre);
if (!devam) return;

//rc2 algoritmamıza başlıyoruz

RC2 rc2 = RC2.Create();

byte[] dizi = new byte[16] { 83, 97, 76, 54, 123, 28, 95, 12, 09, 70, 231, 117, 156, 71, 45, 90 };

byte[] anahtar = System.Text.Encoding.ASCII.GetBytes(sifre);

string dosyacikis = Path.ChangeExtension(dosya, "rc2_desifre");

//deşifrelemye yardımcı olan CreateEncryptor sınıfımızı kullanıyoruz

ICryptoTransform dönüstür = rc2.CreateEncryptor(sifre, dizi);

//her .net cryptography uygulamamızda yaptığımız gibi filestream ile giriş ve çıkış dosya işlemlerimizi_

//gerçekleştirmek için tanımlamalarımızı yapıyoruz

FileStream giris = null;

FileStream cikis = null;

CryptoStream sifrele = null;

try

{

giris = new FileStream(dosya, FileMode.Open);

cikis = new FileStream(dosyacikis, FileMode.Create);

sifrele = new CryptoStream(cikis, transform,CryptoStreamMode.Write);

dinamikbaglantı(giris, sifrele); //*

 }

finally

{

if (sifrele != null) sifrele.Close();

if (cikis != null) cikis.Close();

if (giris != null) giris.Close();

}

Console.WriteLine("File encrypted.");

 

}

}

}

 

Yukarıdaki yıldızla belirttiğim dinamikbaglanti tanımlamasına dikkat edin.Onuda kodlamamız içerisinde ayrıca yaratıyoruz.Şimdi devam edelim....

 


private
static void dinamikbaglanti(Stream giris, Stream cikis)

//çıkış işlemlerinde CryptoStreamMode.Write,giriş işlemlemlerinde CryptoStreamMode.Read sınıfları görev alır.

//yeri geldiğinde onların tanımlamalarında,aşağıdaki gibi kullanırız.

//örn:crypto = new CryptoStream(cikis, dönüstür, CryptoStreamMode.Write);

{

const int boyut = 64 * 1024; //64k boyutunda yarattık.

byte[] buffer = new byte[boyut]; //yarattığımız dizi anahtara buffer atıyoruz.

 int boyutoku = giris.Read(buffer, 0, boyut);

while (boyutoku > 0)

{

cikis.Write(buffer, 0, boyutoku);

boyutoku = giris.Read(buffer, 0, boyut);

}

}

Bu zaman kadarki makalelerim,örnekler ve uygulamar dışında bu makalemdede rc2 üzerinden deşifreleme uygulamasını uygun gördüm.

Her türlü soru ve görüşleriniz için batuhantosun@developermania.net adresine mail atabilirsiniz. 

Saygı ve Sevgilerimle.Kolay Gelsin!!!

 



DES(Data Encryption Standart) Algoritması

clock Nisan 14, 2009 12:11 author Batuhan Tosun tarafından yayınlanmıştır

Daha önceki  makalelerimde de belirttiğim gibi simetrik yane  private-key algoritma düzenine bağlı bir şifreleme yöntemidir.
        DES(Data Encryption Standart) algoritma  DEA yani data encryption algoritma’nın standart bir düzeye bağlanması sonucu ortaya çıkmıştır.DES şifreleme blok şifreleme olarakta geçer.Çünkü şifrelenecek  olan metni  parçalara böler ve her parçayı ayrı ayrı şifreler.DES algoritma 64 bitlik bir anahtar kullanır.Ancak bunun sadece 56 bit’i kullanılır.Çünkü diğer 8 bit “eşlik bit kontrolü dediğimiz”  , “partiy” için kullanılır.

        DES algoritma günümüz teknolojisinde en çok Brute Force dediğimiz saldırı tiplerine yane “deneme yanılma” yöntemlerine karşı kullanılır.Her nesne parçalara ayrılıp kendi içerisinde şifrelendiği için bu risk i büyük ölçekte azaltır.

 

      DES algoritmaya .net teknolojisi üzerinde bakmamız gerekirse;

 

C#à    “public abstract class DES : SymmetricAlgorithm” şeklinde 

VBà    <ComVisibleAttribute(True)> _
        Public MustInherit Class DES _
        Inherits SymmetricAlgorithm
 
        Dim instance As DES

 System.Security.Cryptography” namespace i altında kullanılır. 

DESCryptoServicesProvider Methodu ile .net platformunda bir örnek ile devam etmek istiyorum.   

 

 

using System.Security.Cryptography;


[ComVisibleAttribute(true)]
public abstract class DES : SymmetricAlgorithm

{    

private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV)   

{    

    
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
     
  
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
 
      
fout.SetLength(0);
  
       
byte[] bin = new byte[100];
   
    
long rdlen = 0;
 

long totlen = fin.Length;
  
     
int len;
        



DES des = new DESCryptoServiceProvider();
       
CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
        
Console.WriteLine("Encrypting...");
 

        
while (rdlen < totlen)
 

      
{
      
     
len = fin.Read(bin, 0, 100);
           
encStream.Write(bin, 0, len);           
rdlen = rdlen + len;
           
Console.WriteLine("{0} bytes processed", rdlen);
  
     
}
        

encStream.Close();       
fout.Close();
       
fin.Close();
   

}
 

}  

 

            DES algoritma metnin üzerinde permütasyonlar halinde ilerler.DES algoritmada SBox dediğimiz yapılar vardır ve bu yapılar permütasyon ilerlerken bitstringleri bit düzeyinde düşürmeye devam eder.Yane 12 bitlik bir bitstring 8 bitlik bir bitstring e düşürülür.Bunlardan kaynaklanan yazılım hataları da olsa yazılımın kendi sorunuda olsa DES üzerindeki en kırılmaya müsait yapıdır ve DES algoritmaları brut force ataklarda ileri seviyeye geçilerek SBox üzerindeki açıklar nedeniyle kırılır.Bu ve bunun gibi bazı açıklar DES algoritmanın bir sonraki makalemin konusu olan TripleDES(3-DES) geliştirilmiş algortimasında kapatılmıştır.

        İşte bütün bu SBox yapıları ve büt düzeylerini yukarıda yapmış olduğumuz örnekte gördüğümüz gibi .net Platformu kendi içerisinde gerçekleştiriyor.

Güvenli ve sağlıklı günler dilerim…



MD5 Algoritması

clock Nisan 14, 2009 12:02 author Batuhan Tosun tarafından yayınlanmıştır

MD 5(Message Digest 5)  algoritması bu zamana kadarki md algoritmaları içinde türetilen en iyi algoritmadır.MD algoritmasından türetilerek MD4 ü yaratan RON RİVEST  MD4 üzerinde zafiyetleri ve açıkları gidererek MD 5 algoritmasını yaratmıştır.

MD5  algoritma veriyi sonsuz uzunlukta kabul ederek 128 bitlik bir boyutta  şifreler.MD5  de veri 512 bitlik boyutlara ayrılarak üzerlerinde işlem sağlar.

MD5 bir hash algoritmasıdır.Hash algoritması için daha öncede dediğim bir tanım vardı ;”hash algoritmaları bir nevi şifreyi şifreleyen algoritmalardır.Bu nedenle koyduğumuz şifreyi örneğin bir web site içinde tekrar şifreler,ve böylelikle örneğin bir sql atağında sistemi kıran ve panele giren hacker şifrenin md5  ile şifrelenmiş haline ulaşılır.”.

Örneğin: 1234 rakamlarına sahip bir şifrenin md5 ile şifrelenmiş hali;

0F037584C99E7FD4F4F8C59550F8F507 ‘ budur. 

MD5 algoritması çoğu algoritmaya nazaran tek yönlü çalışır ve sadece şifreleme yapar.MD5 eski türetilen diğer md algoritmalarına göre daha yavaş ancak daha güçlü çalışır.

MD5 algoritması;güvenli şifre saklama protokollerinde sıklıkla kullanılır.Bunun ilgili bir örnek yapacağız.

Öncelikle md5 i .net üzerinde inceleyelim ve rahat anlaşılabilmesi için önce hash fonksiyonlarını gösterelim.

 

Hash algoritma hiyerarşisi altında aşağıdaki algoritmalar kullanılabilir.

 

System.Security.Cryptography. KeyedHashAlgorithm
System.Security.Cryptography.
MD5
System.Security.Cryptography.
RIPEMD160
System.Security.Cryptography.
SHA1
System.Security.Cryptography.
SHA256
System.Security.Cryptography.
SHA384
System.Security.Cryptography.
SHA512 

 

Söz dizimlerine bakacak olursak 


VB 

 

<ComVisibleAttribute(True)> _

Public MustInherit Class HashAlgorithm _ 
Implements ICryptoTransform, IDisposable 

 

 C# 

 

[ComVisibleAttribute(true)]
public abstract class HashAlgorithm : ICryptoTransform, 
    IDisposable


   C++ 

 

[ComVisibleAttribute(true)]
public ref class HashAlgorithm abstract : ICryptoTransform, 
    IDisposable
 


Hash algoritmalarında ve hashten türetilen algoritmalarda hash fonksiyonları kullanılır.Hash fonksiyonları gizliliği sağlar ve imzalama şeklinde anahtarlama oluşturur.
  

Aşağıdaki koda bakacak olursanız md5 i tetikleyen c# kodlamadını göreceksiniz.

 

 static string getMd5Hash(string input) 
  
{
               

 MD5 md5Hasher = MD5.Create(); 
          
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
     
  
       
StringBuilder sBuilder = new StringBuilder();
    
 
       
for (int i = 0; i < data.Length; i++)
       

 {           

 sBuilder.Append(data[i].ToString("x2"));       
}
       

  return sBuilder.ToString();   

 }  

 

Aşağıdaki kod ise aynı uygulama içerisinde md5 doğrulamasını sağlayan kod bloğudur. 

  static bool verifyMd5Hash(string input, string hash)   

 {              

 string hashOfInput = getMd5Hash(input);        

 StringComparer comparer = StringComparer.OrdinalIgnoreCase;       

  if (0 == comparer.Compare(hashOfInput, hash))       

{           

return true;       

 }       

else       

 {           

return false;      

  }   

}   

 

MD5 in web üzerinde yapılmış bir küçük kod uygulamasını mantığını daha iyi anlamanız için yazıyorum.(Aşağıda)

class Crypto


    {
        private static byte[] ToByteArray(object value)
        {
            byte[] result = new byte[] { };
            string val = value as string;
            if (val != null)
                result = new System.Text.UnicodeEncoding().GetBytes(val);
            return result;
        }        public static string ToMD5(string value)
        {
            byte[] hash = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(ToByteArray(value));
            string result = System.BitConverter.ToString(hash);
            result = result.Replace("-", "");
            return result;


        }
    } 

 

Şimdi biraz daha konsept bir analiz uygulama ile noktayı koyalım.

Hash Algoritmaları ile MD5 üzerinde CryptoStream Testi


public
void CryptoStream_Test ()

{

DebugStream debug = new DebugStream ();

 

byte[] key = {0, 1, 2, 3, 4, 5, 6, 7};

byte[] iv = {0, 1, 2, 3, 4, 5, 6, 7};

DES des = DES.Create ();

CryptoStream cse = new CryptoStream (debug, des.CreateEncryptor (key, iv), CryptoStreamMode.Write);

MD5 hash = MD5.Create ();

CryptoStream csh = new CryptoStream (cse, hash, CryptoStreamMode.Write);

byte[] data = Encoding.UTF8.GetBytes ("http://www.testlink.com");

csh.Write (data, 0, data.Length);

csh.FlushFinalBlock ();

byte[] result = debug.ToArray ();

AssertEquals ("Encrypted", "8C-24-76-74-09-79-2B-D3-47-C3-32-F5-F3-1A-5E-57-04-33-2E-B8-50-77-B2-A1", BitConverter.ToString (result));

byte[] digest = hash.Hash;AssertEquals ("Hash", "71-04-12-D1-95-01-CF-F9-8D-8F-F8-0D-F9-AA-11-7D", BitConverter.ToString (digest));

}

 

Son Söz

MD5 güvenli şifre saklama protokollerinde ve web uygulamalarında sıklıkla kullanabilceğimiz bir algoritmadır.Özellikle web uygulamalarında source kaynaklı olarak çabuk tanımlanması,esnek olması ve hızlı olması en önemli özelliğidir.Bir sonraki makalemde görüşmek üzere….  



AES(Advanced Encryption Standart) Algoritması

clock Nisan 14, 2009 12:01 author Batuhan Tosun tarafından yayınlanmıştır

AES(Advanced Encryption Standard) algoritması gelişmiş şifreleme standardı anlamına gelir.FIPS tarafından başarılı bulunmuş ve onaylanmış bir şifreleme algoritmasıdır.Yapısı ve güvenilirliği çok gelişmiştir.TribalDES algoritmasından altı kat,DES algoritmasından ü. Kat daha hızlı çalışır.

         AES,128,192 ve 256 byte uzunluklarda anahtarlama özelliğine sahiptir ve 128 byte lık kod bloklarını şifreleme ve deşifreleme yapısını taşıyan simetrik bir algoritmaya sahiptir.
        AES algoiritmasında tüm bayt lar birer eleman olarak kabul edilir ve iki bayt ın birbiri ile karşılıklı işlemleri

bayt=x dersek à   x-or işlemine tabi tutulur.

 

Algoritma iki ana temel üzerine oturtulmuştur.Birincisi şifreleyici ve çözücü, ikincisi ise anahtar üretici.Algoritma her şifreleme üreticisinde bir tur döner ve tur sayısı anahtar uzunluğuna göre değişir.

Örn: 128 bit lik AES 4 kelimelik anahtar uzunluğunda 10 tur atar.

AES algoritmasının sözsel işleyişini aşağıda göreceğiz.

 

AESşifreleme(GirişDurumu, Anahtar)                                                        

{

                               TurAnahtarı[Nr : 1] = AnahtarÜreteci(Anahtar);

                               Durum[0] = İlkAnahtarToplaması(GirişDurumu, Anahtar);

                              

for(i = 1; i < Nr ; i++)

               Tur(Durum[i-1], TurAnahtarı[i])

                              

FinalTuru(Durum[Nr-1], Tur Anahtarı[Nr])

}

 

AES algoritmasında tur dönümü için sözsel işleyiş ise aşağıdadır.

 

Tur(GirişDurumu, TurAnahtarı[i])                                                              (3.5)

{

                               Durum1 = BaytDeğişimi(GirişDurumu);

                               Durum2 = SatırKaydırma(Durum1);

                               Durum3 = SütunKarıştırma(Durum2);

                               ÇıkışDurumu = TurAnahtarınıTopla(Durum3, Tur Anahtarı[i])

}

 

SonTur(GirişDurumu, TurAnahtarı[Nr])                                                     (3.6)

{

                               Durum1 = BaytDeğişimi(GirişDurumu);

                               Durum2 = SatırKaydırma(Durum1);

                               ÇıkışDurumu = TurAnahtarınıTopla(Durum2, Tur Anahtarı[Nr])

}

  

AES her tur dönüşünde dört adım izler;

1.)    Bayt-değiştirme,

2.)    Satırları Kaydırma,

3.)    Sütunları Karıştırma,

4.)    Tur Anahtarının Toplanması.

  

Bu denli teorik bilgiden sonra .net platformu açısından bakalım.

  

AES algoritmasını namespace i yine aşağıdaki hiyerarşiyi takip eder.

 ---System.Object
  --System.Security.Cryptography
.
SymmetricAlgorithm
       System.Security.Cryptography.Aes

          * System.Security.Cryptography
.AesCryptoServiceProvider
           *System.Security.Cryptography
.AesManaged
 Algoritmanın syntax ini inceleyecek olursak; 

 

VB <HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort := True)>
_
Public MustInherit Class Aes _ 
  
Inherits SymmetricAlgorithm



Dim instance As Aes  

 

C#

[HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort = true)]

public abstract class Aes : SymmetricAlgorithm



Visual C++


[HostProtectionAttribute(SecurityAction::LinkDemand, MayLeakOnAbort = true)]

public ref class Aes abstract : public SymmetricAlgorithm



JScript



public abstract class Aes extends SymmetricAlgorithm  

 

AES in bulunduğu ikinci bir hiyerarşi ise webservices üzerindedir.

System.Object
   Microsoft.Web.Services2.Security.Cryptography.KeyAlgorithm
     Microsoft.Web.Services2.Security.Cryptography.SymmetricKeyAlgorithm
      Microsoft.Web.Services2.Security.Cryptography.AES
         Microsoft.Web.Services2.Security.Cryptography.AES128
         Microsoft.Web.Services2.Security.Cryptography.AES192
         Microsoft.Web.Services2.Security.Cryptography.AES256

 

 Bu hiyerarşi içinde syntax örneği vermek gerekirse….128 bit lik için;

 

C#

 

public sealed class AES128 : AES


VB

NotInheritable Public Class AES128
    Inherits AES

Dim aES1281 As New AES128()
 
C++.NET
public sealed ref class AES128 : public AES
 
 
J#.NET
public final class AES128 extends AES
 
şeklinde olacaktır.
 
 
SON SÖZ
Gerçekten güzel ve özel bir algoritma olduğu için teorisinin çok üstünde durarak anlattım.

AES algoritması içerisinde birçok varyasyonu getiren bir algoritmadır.Algoritma bir nevi en uygun sürüm bulunması için AES algoritması üzerinden farklı algoritmalar çıkarıldı.En iyi seçilen 5 algoritma tekrar elendi ve en iyi AES algoritması Rijndael algoritması oldu.Uygulaması ile beraber Rijndael makalemi önümüzdeki zamanlar içerisinde yazacağım…. 

Mutlu kalın,Güvenle kalın .…..  



.net Güvenliği ve Kriptografi

clock Nisan 14, 2009 11:59 author Batuhan Tosun tarafından yayınlanmıştır

Günümüz teknololojisi ilerledikçe bazı güvenlik politikalarınıda izlememiz kaçınılmaz olacaktır.Bunlardan en önemlilerinden biride şifreleme ve ortam güvenliği sağlamaktır .Net güvenliği üzerinde bize bu güvenlik prosedürünü uygulayabileceğimiz ortam ve kodlama masası yaratılmaktadır.Daha önceki makalemde CLR ın sağladığı güvenlik prosedürleri ile uzun bir yazı dizisine başlamıştık.Bugünde .Net güvenliğine devam edeceğiz ve Kriptografi konusuna giriş yapacağız.

Kriptografi belli başlı şifreleme algoritmaları üzerine oturtulmuştur.Baktığımız zaman üç ayrı şifreleme algoritması olduğunu görüyoruz.

1)Simetrik Algoritma
2)Asimetrik Algoritma
3)Hash Algoritması dır.

Şimdi bunlara açıklamaları,namespaceleri ve bu algoritmalar üzerinde .net security ortamındaki şifreleme methodlarıyla giriş yapalım.

 

1)Simetrik Algoritma(Private-Key):

Basit şifreleme methodlarının mantığına oturtulmuş bir algoritmadır.Bilinen eski methotdur diyebiliriz.Julius Sezar  döneminden beri kullanılır.Şöyleki verinin şifrelenmesinde de şifrelendikten sonra açılmasındada aynı anahtarı gerektiren bir kodlama yapısı vardır.Yane Simetrik olarak şifrelenmiş bir dosyayı açabilmeniz için aynı anahtara sahip olabilmeniz gerekmektedir.Klasik bir method olduğu gibi güvenliği son derece max. Tutan bir methodtur..Net ortamında baktığımız zaman System.Security.Cryptography namespace ile kullanılır.

Sözdizimi

 

C#
ComVisibleAttribute(true)]
public abstract class SymmetricAlgorithm : IDisposable  şeklindedir.
VB
MustInherit Class SymmetricAlgorithm _
    Implements IDisposable
 
 
System.Object hiyerarşisi altında;
AES,DES,RC2,Rijndael,TripleDES 
şifreleme methodları simetrik algoritma düzeni ile oluşturulmuş ve .net in bize sunduğu yordamlardır.

System.Security.Cryptography.SymmetricAlgorithmSystem.Security.Cryptography.Aes    System.Security.Cryptography.DES    System.Security.Cryptography.RC2    System.Security.Cryptography.Rijndael    System.Security.Cryptography.TripleDES
Şeklindedir.

Simetrik algoritmaya örnek olarak Rijndael yordamıyla bir örnek kod a bakalım.
 

private static void EncryptData(String inName, String outName, byte[] rijnKey, byte[] rijnIV)       

 {           

//Giriş ve çıkış dosyalarımızı filestream altında tanımladık ve okuttuk. 
          
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
  
         
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
  
         
fout.SetLength(0);
                        
byte[] bin = new byte[100];
           
long rdlen = 0;
           
long totlen = fin.Length;   
int len;           
    
                
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create(); //methodu yaratmaya başlıyoruz   
           
CryptoStream encStream = new CryptoStream(fout, rijn.CreateEncryptor(rijnKey, rijnIV), CryptoStreamMode.Write);
    
        
Console.WriteLine("Encrypting...");
                        

while (rdlen < totlen)           

 {             
  
len = fin.Read(bin, 0, 100);
               
encStream.Write(bin, 0, len);
               
rdlen = rdlen + len;
     
          
Console.WriteLine("{0} bytes processed", rdlen);
     
      
}
       
     
encStream.Close();
            
fout.Close();
           
fin.Close();

        }
 
Kodlamayı örnek amacıyla verdim.
Şu an anlatmak istediğim şey algoritma türleri ve kullanım biçimleridir.Kodlama karmaşık gelebilir.Ancak kodlama bölümüne daha sonraki makalelerde algoritmaları tek tek ele alacağım zaman gireceğim.

 

 

 

2)Asimetrik Algoritma(Public-Key):

Asimetrik algoritmada simetrik algoritmadan farklıdır.Şifreleyen ve çözen anahtar farklıdır.
A ile şifrelenen sadece B ile çözülebilir.
Son 40 yıl içerisinde gelişmiştir ve en önemli örneği RSA dır.
Asimetrik algoritmaya diğer bir değişle açık anahtarlı algoritmada diyebiliriz.

.Net ortamında baktığımız zaman System.Security.Cryptography namespace ile kullanılır.



Sözdizimi

 

C#
[ComVisibleAttribute(true)]
public abstract class AsymmetricAlgorithm : IDisposable
VB
<ComVisibleAttribute(True)> _
Public MustInherit Class AsymmetricAlgorithm _
    Implements IDisposable
 

 

System.Object hiyerarşisi altında;
DSA,RSA,ECDsa,ECDiffieHellman 
şifreleme methodları asimetrik algoritma düzeni ile oluşturulmuş ve .net in bize sunduğu yordamlardır.
System.Security.Cryptography.AsymmetricAlgorithm    
System.Security.Cryptography.DSA    System.Security.Cryptography.RSA    System.Security.Cryptography.ECDsa    System.Security.Cryptography.ECDiffieHellman
 
 Kullanım yordamlarındandır.
 
Kod bloklarında bakacak olursak;
C#
using System.Security.Cryptography;
using System.Reflection;
 
[assembly: AssemblyKeyFile("CustomCrypto.snk")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: CLSCompliant(true)]
namespace Contoso
    public class CustomCrypto : 
        System.Security.Cryptography.AsymmetricAlgorithm
    {
        
        private CspParameters cspParameters;
        private readonly KeySizes[] keySizes = {new KeySizes(8, 64, 8)};
 
     
        public CustomCrypto()
        {
            this.KeySize = 8;
        }
………………..
…………
……..

 
VB
 
Imports System.Security.Cryptography
Imports System.Reflection
 
<Assembly: AssemblyKeyFile("CustomCrypto.snk")> 
<Assembly: AssemblyVersion("1.0.0.0")> 
<Assembly: CLSCompliant(True)> 
Namespace Contoso
    
    Class vbCustomCrypto
        Inherits System.Security.Cryptography.AsymmetricAlgorithm
 
        Private cspParameters As CspParameters
        Private ReadOnly keySizes() As keySizes = {New keySizes(8, 64, 8)}
 
        Public Sub New()
            Me.KeySize = 8
        End Sub
……………………..……………..………..…..   .
 
 
 Şeklinde tanımlanıp kullanılır ve uygulama içerisine yerleştirilir.
 

3)Hash Algoritması :

 

Ben hash algoritması için şifrelenmiş şifre demek istiyorum.
Çünkü güvenliğimiz açısından sisteme gönderilen
şifreyi otomatik olarak kendi sistemi içinde şifreler.
Hash algoritmasının içerisinde hash fonksiyonları verileri
tek yönlü ve çift düze şifreler.
Yane istediğimiz uzunlukta belirleyebiliriz.

Diğer algoritmalar gibi security.cryptography namespace i ile kullanılır.

Syntax ına bakacak olursak.

 

 

 
VB
<ComVisibleAttribute(True)> _
Public MustInherit Class HashAlgorithm _
    Implements ICryptoTransform, IDisposable
 
C#
 
[ComVisibleAttribute(true)]
public abstract class HashAlgorithm : ICryptoTransform, 
    IDisposable
 
Bize sunduğu 7 algoritma vardır.MD5,SHA1,SHA254,SHA384,SHA512,RIPEMD160,KeyedHashAlgorithm…
 
Şimdi bunların 2 farklı dilde kod bloklarına bakalım.
 
 
VB
Dim sha As New SHA1CryptoServiceProvider()
Dim result As Byte() = sha.ComputeHash(dataArray)
 
C#
HashAlgorithm sha = new SHA1CryptoServiceProvider();
byte[] result = sha.ComputeHash(dataArray);
………………………
 
Bahsedeceklerim bukadar..Net ortamının bize sağladığı güvenlik platformunu bir kez daha görmüş olduk.