Batuhan TOSUN
       confidentiality, integrity, availability

2010 Yaz İş Seyahati ve Seminer Planlarım

clock Mayıs 22, 2010 17:26 author Batuhan Tosun tarafından yayınlanmıştır

Bu yaz benim için epey yoğun geçeceğe benziyor. Bu yaz ki kesinleşen seyahat planlarımı tarihleri ile birlikte belirtmek istedim.

3-20 Temmuz, Miami
20-31 Temmuz, Toronto
1-12 Ağustos, Las Vegas
13- 30 Ağustos, Seattle
1-13 Eylül, New York
14-17 Eylül, Atlanta- Georgia(ISSA Int. Conf.)

2,5 Aylık Amerika ve Kanada seyahatimde; iş görüşmelerim, yeni yıl için uzatılması gereken sözleşmeler, danışmanlık, seminerler, ISSA International Conference, Black Hat konferansı ve Hacker Halted konferansı var.



Marmara Üniversitesi Seminerim Sonrası

clock Mayıs 16, 2009 17:44 author Batuhan Tosun tarafından yayınlanmıştır

   Bugün Marmara Üniversitesindeydim..Net Güvenliği ve Kriptografi ana başlıklı verdiğim seminerimde uygulamalı olarak web güvenliği ve sql injection ataklarına karşı önlemleri işledik.
   Kriptografi üzerine yaptığım geniş çaplı uygulama beğeni toplarken,tek kullanımlık şifre üretme uygulamam insanları "bende yapabilirim" düşüncesine teşvik etti:)Gerçekten çok keyifli ve verimli geçen seminere güvenlik ile uğraşan hocalarında gelmesi ile tam bir bilgi platformuna döndü.

 

 

Organizasyonu yapan Kemal Serkan Yıldırım arkadaşıma teşekkür ediyorum.Başka etkinliklerde görüşmek üzere.



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...



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…



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……

 



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…



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!!!

 



Monitor Sınıfı ile .Net Yazılım Güvenliği

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

.Net Framework ün bize sunduğu güvenlik prensipleri sadece system.security sınıfına bağlı değildir.Daha önceki makalelerimdede söylediğim gibi .net güvenliği clr içerisinde sağlanır ve iç yapısında yansıma,metaveri,serileştirme yapıları mevcuttur.Bugün Threading uygulama ile system.monitor sınıfını kullanarak kod bütünlüğümüzü nasıl koruruz onu göreceğiz.

                 System.Monitor sınıfı sinyaller,alarmlar ve kilitler yardımı ile kod bütünlüğünde serileştirmeyi sağlar.Örnek vericek olursak örneğin veritabanı işlemlerimizde veritabanımızı güncellerken kod yavaşlığı ve bütünlükte tehlike vardır.Yada birden fazla threading programlama yapısı kullanırken yine yavaşlık olur.İşte bu gibi durumlarda System.Monitör sınıfı devreye girdiği zamanlarda programda yavaşlık,aksalık,kod çakışması gibi olaylar ortadan kalkıyor.Böylelikle ortaya çıkan ürünün yazılım güvenliğinide sağlamış oluyorsunuz.

                 Şimdi bunula ilgili ilk verdiğimiz veritabanı örneğine uygun bir uygulama yapalım.Yapacağımız uygulama console üstünden çalışsın ve veritabanına kayıt yapan bir çok parçacıklı programlama gövdesi olsun.Bu programda Monitor kullanarak verimi ve güvenliği yüksek seviyeye çıkartalım.

 

using System;

using System.Threading;

class Database

{

public void SaveData(string text)

{

Monitor.Enter(this);

Console.WriteLine("Database.SaveData - Started");

Console.WriteLine("Database.SaveData - Working");for (int i = 0; i < 100; i++)

{

Console.Write(text);

}

Console.WriteLine("\nDatabase.SaveData - Ended");

Monitor.Exit(this);

}

}

class ThreadMonitor2App

{

public static Database db = new Database();public static void WorkerThreadMethod1()

{

Console.WriteLine("Worker thread #1 - Started");

 

Console.WriteLine("Worker thread #1 - Calling Database.SaveData");db.SaveData(

"x");Console.WriteLine("Worker thread #1 - Returned from Output");

}

public static void WorkerThreadMethod2()

{

Console.WriteLine("Worker thread #2 - Started");

 

Console.WriteLine("Worker thread #2 - Calling Database.SaveData");db.SaveData(

"o");Console.WriteLine("Worker thread #2 - Returned from Output");

}

public static void Main()

{

ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);

ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);

Console.WriteLine("Main - Creating worker threads");

Thread t1 = new Thread(worker1);Thread t2 = new Thread(worker2);

t1.Start();

t2.Start();

}

}

Görüldüğü gibi yapılacak şey çok basit.Parçacıklı programlamada veritabanının gövdesini oluşturan yapıda sadece kök bölümü monitör içine alıyoruz.Başlatıyoruz ve kapatıyoruz.Bu uygulamayı sadece kaydetme aşamasında yane kök aşamasında yaptım çünkü güvensizliğin,verimsizliği ve yavaşlığın olacağı blok o kod bloğudur.

 

Son Söz:

Monitor sınıfı ile parçacıklı programlamada kod bütünlüğünün serileştirilmesini sağlayarak yazılımın verimini,hızlı çalışmasını ve güvenliğini sağladık.Enter nesnesiyle başlattığımız monitor sınıfı bir başka enter nesnesi görene kadar veya exit nesnesini görene kadar kodu kilitler ve sinyal aşamasına getirir.Monitor sınıfının profesyonel kodlamada çok önemli bir etken olduğunu ve güvenlikte sadece security sınıfına bağlı kalmamız gerektiğini görmüş olduk.Bir sonraki makaleye kadar sağlıklı ve mutlu günler dilerim.

 

Saygı ve Sevgilerimle



Tek Adımda XML Sertifika Güvenliği

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

Anlatmama veya bahsetmeme gerek dahi yok.Nasıl uygulacağınızı biliyorsunuzdur diye düşünüyorum.Bilmiyorsanızda öğrenin ve aşağıdaki gibi uygulayın.İşte tek adımda asimetrik şifreleme  düzeni ile  X509 sertifika güvenliği methodunu kullanarak web servisinizi kısmende olsa güvenlik altına almak.  


<configuration> 
<microsoft.web.services>   
<security>     
<x509 storeLocation="CurrentUser" />  
</security> 
</microsoft.web.services>
</configuration>  

 

 Bu makale değil , bir ipucudur.Fazlasını Beklemeyin , gerisi makalelerde ;) Sağlıcakla...



Rijndael Algoritması

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

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.Daha önceki makalemde söylediğim gibi en iyi beş AES algoritması arasında birinci olmuştur.

    Rijndael algoritması yazılım boyutun güzel bir entegrasyon yakaladığı gibi donanım boyutundada çok iyi uyum sağlar.
    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ı yüksek boyutta düşer.

 

     Rijndael algoritmasına .net platformuna geçmeden önce c/c++ üzerinden bir örnekle bakalım.

  nrounds = rijndaelSetupEncrypt(rk, key, keybits);  for encryption    
nrounds = rijndaelSetupDecrypt(rk, key, keybits);  for decryption
     
unsigned long *rk;   pointer to encryption/decryption buffer,
                         
required space:
                           
keybits  32-bit words required
                           
128      44
                           
192      52
                           
256      60
     
const unsigned char *key;  key, where length in bytes is:
                                 
 
keybits  number of bytes
                                 
128      16
                                 
192      24
                                 
256      32
     
int keybits;         number of bits in key,must be 128, 192 or
                         
256
     

int nrounds;        

number of rounds:                           
keybits  nrounds
                           
128      10
                           
192      12
                           
256      14

 

 
rijndaelEncrypt(rk, nrounds, plaintext, ciphertext);
     rijndaelDecrypt(rk, nrounds, ciphertext, plaintext);
 
     const unsigned long *rk;
                          pointer to encryption/decryption buffer which
                          was filled by rijndaelSetupEncrypt() or
                          rijndaelSetupDecrypt()
 
     int nrounds;         number of rounds, as computed by
                          rijndaelSetupEncrypt(),
                          rijndaelSetupDecrypt() or NROUNDS
 
     [const] unsigned char plaintext[16];
     [const] unsigned char ciphertext[16];
                          pointers to 16-byte buffers to be encrypted
                          or decrypted; the source buffer has a const
                          qualifier
 

  

Rijndael algoritması; ard arda permütasyon kullanarak şifreleme özelliğine sahip bir algoritmadır.Zaten DES algoritmasıda ard arda permütasyon yapan bir algoritmaydı ve AES(Rijndael)  DES algoritmasının alternatifi olarak çıkarılmış bir algoritmaydı.

 

Şimdi .Net platformumuza dönüyoruz…..

 

.net üstünde öncelikle kullanacağımız syntax lara bakalım.

 VB


<ComVisibleAttribute(True)> _Public NotInheritable Class RijndaelManaged _Inherits Rijndael Dim instance As RijndaelManaged

C#


[ComVisibleAttribute(true)]public sealed class RijndaelManaged : Rijndael

 C++ .NET

[ComVisibleAttribute(true)]public ref class RijndaelManaged sealed : public Rijndael   Bu algoritma tabikide yine AES algoritmasında olduğu  gibi 128, 192 ve 256 bitlik anahtar boyutları kullanır. Küçük Kod Parçaları ile başlayalım

Örn:
 

public abstract class Rijndael: SymmetricAlgorithm
{
 
        
        public Rijndael ()
                       : base()
                       {
                               KeySizeValue = 128;
                               BlockSizeValue = 128;
                               FeedbackSizeValue = 128;
                               LegalBlockSizesValue = new KeySizes [1];
                               LegalBlockSizesValue[0] = new KeySizes(128, 128, 128);
                               LegalKeySizesValue = new KeySizes [1];
                               LegalKeySizesValue[0] = new KeySizes(128, 256, 64);
                       }Rijndael
 
        
        public new static Rijndael Create()
                       {
               return (Rijndael)(CryptoConfig.CreateFromName
                               (CryptoConfig. Rijndael Default, null));
                       }
        public new static Rijndael Create(String algName)
                       {
                               return (Rijndael)(CryptoConfig.CreateFromName(algName, null));
 
 
                       }
 
 
Geniş bir konsept uygulamayla devam ediyoruz…..
 

  Uyg:  

using System;
using System.IO;
using System.Security.Cryptography;
 
namespace RijndaelManaged_Examples
{
    class RijndaelMemoryExample
    {
        public static void Main()
        {
            try
            {
 
                string original = "Here is some data to encrypt!";
 
                
                RijndaelManaged myRijndael = new RijndaelManaged();
 
                byte[] encrypted = encryptStringToBytes_AES(original, myRijndael.Key, myRijndael.IV);
 
                
                string roundtrip = decryptStringFromBytes_AES(encrypted, myRijndael.Key, myRijndael.IV);
 
                
                Console.WriteLine("Original:   {0}", original);
                Console.WriteLine("Round Trip: {0}", roundtrip);
 
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }
 
        static byte[] encryptStringToBytes_AES(string plainText, byte[] Key, byte[] IV)
        {
            
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
            
            MemoryStream msEncrypt = null;
 
            
            RijndaelManaged aesAlg = null;
 
            try
            {
                
                aesAlg = new RijndaelManaged();
                aesAlg.Key = Key;
                aesAlg.IV = IV;
 
                
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
 
                
                msEncrypt = new MemoryStream();
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
 
                        
                        swEncrypt.Write(plainText);
                    }
                }
 
            }
            finally
            {
 
                
                if (aesAlg != null)
                    aesAlg.Clear();
            }
            return msEncrypt.ToArray();
 
        }
 
        static string decryptStringFromBytes_AES(byte[] cipherText, byte[] Key, byte[] IV)
        {
            
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
 
            
            RijndaelManaged aesAlg = null;
 
            string plaintext = null;
 
            try
            {
                
                aesAlg = new RijndaelManaged();
                aesAlg.Key = Key;
                aesAlg.IV = IV;
 
                
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
                
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
 
                            
                            plaintext = srDecrypt.ReadToEnd();
                    }
                }
 
            }
            finally
            {
 
.
                if (aesAlg != null)
                    aesAlg.Clear();
            }
 
            return plaintext;
 
        }
    }
}

  

SON SÖZ

Rijndael algoritması gerçekten önemli bir algoritma.Gerek teorik gerek pratik açıdan gerekse c/c++ kodlarla tam mantığı oturtmanız açısından yeterli bir kaynak olucağını düşünüyorum.