Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

C# ile Sertifika Yükleme

Merhabalar,
İş yerinde bir sertifika geçişimiz oldu ve bunu kod ile cihazlara yüklememiz gerekti. Hemen ufak bir uygulama yazdım ve işe yarayabileceğini düşünerek paylaşıyorum. AddCert() metodundaki parametreleri değiştirerek sertifikayı istediğimiz yere yükleyebiliriz. Aşağıdaki kod örneğimde Personal altına yükleme yapıyoruz.  Run->mmc yazarak PC’nizde yüklü olan sertifikaları inceleyebilirsiniz.

Capture


class Program
{
static void Main(string[] args)
{
Console.WriteLine("Loading has started......");
var cert = new X509Certificate2("CertificateName.pfx", "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
AddCert(StoreName.My, StoreLocation.LocalMachine, cert);
AddAccessToCertificate(cert, "IIS_IUSRS");
Console.WriteLine("Loading has finished......");
}
private static void AddCert(StoreName storeName, StoreLocation storeLocation, X509Certificate2 cert)
{
X509Store store = new X509Store(storeName, storeLocation);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();
}

private static void AddAccessToCertificate(X509Certificate2 cert, string user)
{
RSACryptoServiceProvider rsa = cert.PrivateKey as RSACryptoServiceProvider;

if (rsa != null)
{
string keyfilepath =
FindKeyLocation(rsa.CspKeyContainerInfo.UniqueKeyContainerName);

FileInfo file = new FileInfo(keyfilepath + "\\" +
rsa.CspKeyContainerInfo.UniqueKeyContainerName);

FileSecurity fs = file.GetAccessControl();

NTAccount account = new NTAccount(user);
fs.AddAccessRule(new FileSystemAccessRule(account,
FileSystemRights.FullControl, AccessControlType.Allow));

file.SetAccessControl(fs);
}
}
private static string FindKeyLocation(string keyFileName)
{
string text1 =
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
string text2 = text1 + @"\Microsoft\Crypto\RSA\MachineKeys";
string[] textArray1 = Directory.GetFiles(text2, keyFileName);
if (textArray1.Length > 0)
{
return text2;
}
string text3 =
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string text4 = text3 + @"\Microsoft\Crypto\RSA\";
textArray1 = Directory.GetDirectories(text4);
if (textArray1.Length > 0)
{
foreach (string text5 in textArray1)
{
textArray1 = Directory.GetFiles(text5, keyFileName);
if (textArray1.Length != 0)
{
return text5;
}
}
}
return "Private key exists but is not accessible";
}
}

Aralık 23, 2015 Posted by | C# | , , , , | Yorum bırakın

Encrypting and Decrypting Data (Veri şifreleme)

Veri güvenliğini sağlamak için veriyi şifreli bir şekilde transfer etmek önemlidir. Bunun için şifreleme tekniklerini bu makalede inceliyor olacağız. Bunun için .NET Framework bize bazı kütüphaneler sunmaktadır. (System.Security.Cryptography)

 

Simertrik Algoritmalar : Veriyi bir anahtar sözcük yardımıyla şifreler ve aynı anahtar ile geri açar. Bu algoritmalara örnek olarak ;

RijndaelManaged,RC2,DES,TripleDES verilebilir. Bütün simetrik algoritma sınıfları System.Securiy.Cryptography.SymmetricAlgorithm base sınıfından türerler.

 

BEST PRACTICES:

– Eğer encryptor ve decryptor windows XP ise Rijndael kullanmakta fayda var. Kırılması en zor algoritma Rijndael’dir . Aksi taktirde TripleDES kullanmalıyız.

 

//Simetrik algoritma ile şifreleme ve çözme

string inFileName = @”C:028442.BIE”, outFileName = @”C:028442.BIE.enc”;

// 1: Stream nesneleri yaratılır.

FileStream inFile = newFileStream(inFileName, FileMode.Open, FileAccess.Read);

FileStream outFile =newFileStream(outFileName,FileMode.OpenOrCreate,FileAccess.Write);

// 2: Simetrik algoritma nesnesi yaratılır.

SymmetricAlgorithm myAlg = newRijndaelManaged();

// 3: Random Bir key oluşturulur (opsiyonel)

myAlg.GenerateKey();

// 4: Şifreli olmayan dosya okunur.

byte[] fileData = newbyte[inFile.Length];

inFile.Read(fileData, 0, (int)inFile.Length);

// ICryptoTransform nesnesi yaratılır.

ICryptoTransform encryptor = myAlg.CreateEncryptor();

// 5: Crypto Stream yaratılıp veri yazılır

CryptoStream encryptStream = newCryptoStream(outFile, encryptor, CryptoStreamMode.Write);

encryptStream.Write(fileData, 0, fileData.Length);

// 6: Kapat

encryptStream.Close();

inFile.Close();

outFile.Close();

           

 

Asimetrik Algoritmalar : Genelde açık anahtar şifreleme olarak bilinir. Simetrik algoritmalar göre yavaştırlar.  System.Security.Cryptography.AsymmetricAlgorithm altındaki sınıflar ile asimetrik şifreleme yapabiliriz. .NET altındaki asimetrik algoritmalar şunlardır ; RSA , DSA

//Tekrar kullanmak için Key Pairları oluşturmak

CspParameters persistanCsp = newCspParameters();

persistanCsp.KeyContainerName = “Asimetrik”;

RSACryptoServiceProvider myRSA = newRSACryptoServiceProvider(persistanCsp);

myRSA.PersistKeyInCsp = true;

RSAParameters privateKey = myRSA.ExportParameters(true);

foreach (byte item in privateKey.D)

    Console.Write(item.ToString(“X2”)+” “);

 

Bunlarında dışında Hash algoritmaları vardır. Bunlarda orijinal data bilinemez. Sadece o verinin doğruluğu bilinebilir.
//MD5 ile şifresiz Hash

MD5 myHash = newMD5CryptoServiceProvider();

FileStream file = newFileStream(“buffered.txt”, FileMode.Open, FileAccess.Read);

BinaryReader reader = newBinaryReader(file);

myHash.ComputeHash(reader.ReadBytes((int)file.Length));

Console.Write(Convert.ToBase64String(myHash.Hash));

Temmuz 13, 2010 Posted by | ASP.NET | , , , , | Yorum bırakın