AES256-SHA şifreleme yöntemini kullanarak yapabilirsin. Kendinden yeni bir yöntem geliştirmek baya bir uğraşı olacaktır. Şifreleme konusunda tecrüben yoksa açıkları da düşündüğünden daha fazla olacaktır. AES dünyaca kabul görmüş bir şifreleme yöntemidir. Yanlış bilmiyorsam Amerikan ulusal güvenlik ajansı (NSA) bu yöntemi kullanan kurumlardan sadece birisi.
Aşağıdaki link ücretsiz bir framework. Ana konusu farklı olmasına rağmen içinde AES256-SHA desteği var ve ücretsiz olarak ticari uygulamalarında kullanabilirsin. Ben fonksiyon ve performans konusunda başarılı bulduğum için tercih ettim.
AES şifreleme yöntemi senden iki bilgi ister. KEY ve IV (Initialization Vector). Bu iki bilgi birlikte kullanılarak şifreli bilgi oluşturulur.
Şifrelemede kullanılan KEY bilgisi EXE derlendiğinde okunmaması için sabit (const) tanımını byte array içine rakam olarak tanımlayabilirsin. Tırnak içinde string tanımlanmadığı için EXE içinde okunamaz olacaktır. Daha güvenli olması için IV üretimini şifreleme fonksiyonuna otomatik yaptırırsın. Bu framework şifrelemeye yönelik RANDOM içerir. Normal işletim sistemi veya programlama dili RANDOM fonksiyonundan farklıdır. Tekrar aynı rakam/bilgi üretme ihtimali çok düşürülmüştür. Otomatik IV kullanman bu anlamda faydalı olacaktır. Aynı kelimeyi peşpeşe defalarca şifrelesen dahi farklı şifrelenmiş bilgiler üretilir. Ancak tüm şifreli bilgiler geri açıldığı zaman orjinal kelimeye her zaman ulaşılır.
Link:
http://synopse.info/files/mORMotNightlyBuild.zip
Özetle;
- SynCommons.pas ve SynCrypto.pas dosyalarını uses kısmına ekleyeceksin.
- Normalde 32byte (256bit) KEY kullanılır. Ancak işleri biraz daha zorlaştırmak için daha uzun bir KEY oluşturup bunu SHA256 ile 256bit boyutuna getirebilirsin. Böylece KEY bilgini daha da gizlemiş olursun.
- TAESCFB.Create() fonksiyonunu kullanmanı tavsiye ederim. Zira bana tavsiye edilen yöntem bu idi. (AES kendi içinde farklı şifreleme metodları içerir. Zaman içinde bazıları daha az güvenli bulunduğu için yenileri geliştirilmiştir)
- TAESCFB.EncryptPKCS7() fonksiyonu şifreleme yapar.
- TAESCFB.DecryptPKCS7() fonksiyonu geri açar.
- Oluşan şifreli bilgi byte cinsinden olacaktır. Bunu Base64 ile Encode ederek string olarak bir yerlerde saklanabilir hale getirebilirsin. Ya da direk byte olarak bir yerlere kaydedebilirsin.
Kod örneği gerekirse yardımcı olabilirim. Ancak şu anda elimin altında örnek kod yok.
Her zaman için uygulama hafızasında bir noktada şifresi çözülmüş okunabilir bilgilerin olacağını aklından çıkarmamalısın tabi. Ne yaparsan yap bu gerçekleşecektir. "Okunamaz olarak karşılaştırma yaparım" diye düşünüldüğü zaman şifreli bilgi ile şifreli bilgiyi karşılaştırma yapmak adına IV bilgisini de sabit vermen gerekecek, bu da o noktada güvenliği azaltacaktır. Aşağı tükürsen sakal. Yukarı tükürsen bıyık misali.
Bu gibi hafızadaki bilgiyi okuma işini biraz daha zor elde edilir hale getirmek için ücretsiz UPX EXE sıkıştırıcı uygulamasını kullanabilirsin. Olur da şifreyi kırmak (Key ve IV bilgisini elde etmek) için uğraşacak kişiyi biraz daha yoracaktır. Bu uygulama EXE'yi sıkıştırır. Uygulama çalıştırıldığında hafızaya açar kendisini. Normal EXE çalışmasına istinaden assembler ile incelemesi sıkıştırılmış EXElerde biraz daha karmaşıktır.
Brute force attack ile AES128 ile şifrelenmiş bilginin kırılması bile bizim ömrümüzün yetmeyeceği kadar uzun yıllar alır. (ekteki dosyaya bakabilirsin) Kaldı ki AES256 bundan çok daha uzun sürecektir. Bu sebeple şifre kırmaya çalışan kişiler daha çok KEY ve IV bilgilerini elde etmeye çalışır.
Son olarak, hepimiz biliyoruz piyasada o kadar çok kırık program dolaşıyor. Kırılmak istendikten sonra kırılmayacak şifre yoktur. Zaman ve kaynak meselesi. Bu sebeple bu konuya gereğinden fazla zaman harcamamanı tavsiye ederim.