Şifreli alan karşılaştırma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Şifreli alan karşılaştırma

Mesaj gönderen pasa_yasar »

Mrb;

2 adet stringi karşılaştırma yapıyorum. Exe içerisinden görünmemesi yani kırılmaması için şifreleme ile yapmaya çalışıyorum. Sorun zaten şifreyi çözünce kayıt ortaya çıkıyor acaba bu yöntem güvenli olurmu.

Örnek:

Kod: Tümünü seç

 
 if decrpyt(metin1)='A' then 
 begin 
       pass1 := 'Tamam'; 
 end;
 
Yukarıdaki işlemde zaten 'A' açık yazıyor. Metini nasıl çift taraflı şifreleyip koruyabiliriz. Fonksiyon olarak encrypt ve decrypt komutu olsun. Fonksiyonları bulup ekledim. AES ile şifrelenecek. Fonksiyonları etkili nasıl kullanabilirim onu öğrenmeye çalışıyorum. Sitelerde TextEditi şifreleyip diğer TextEdit çözülmüş halde yazılıyor ama karşılaştırma işlemi nasıl olacak.

- Donanım karşılaştırma
- Kullanıcı Adı ve Şifresi
- Veritabanı Bağlantı Şifresi işlemleri için kullanacam.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Şifreli alan karşılaştırma

Mesaj gönderen G.Arkas »

'A' nın encrypt halini yazıp onunla decrypt edin.

Örnek:

Kod: Tümünü seç

 if decrpyt(metin1)=Decrypt('vgt4f544f4687h6h') then // A nın encode hali
 begin 
       pass1 := 'Tamam'; 
 end;
Yalnız şunu söyleyeyim, bu yöntem güvenli değil. Çünkü adam o satırı bulup oradaki hashi varsayılan (Mesela 123456) ile değiştirip parolayı kırar. Makale bölümüne bir bak. işine yarar şeyler var orada.
Resim
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Şifreli alan karşılaştırma

Mesaj gönderen pasa_yasar »

Birçok bölümde case of kullandım fakat bazı bölümlerde if kullanmak zorunda kaldım.

Örneğin

Kod: Tümünü seç

if metinkarsilik ='D' then metindegeri:='26'; 
gibi bu eşitlemeyi case of ile yapamacağım için if kullanmak zorunda kaldım. Eşitleme yani değer verme işleminde nasıl bir güvenlik sağlayabilirim. metinkarsilik ve metindegeri alanlarını nasıl şifreleyebilirim.
mkysoft
Kıdemli Üye
Mesajlar: 3089
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Şifreli alan karşılaştırma

Mesaj gönderen mkysoft »

Sorun olan if ya da case değil, asm seviyesine inince ikiside benzer oluyor. case kullanmak güvenlik sağlamaz.
ertank
Üye
Mesajlar: 1520
Kayıt: 12 Eyl 2015 12:45

Re: Şifreli alan karşılaştırma

Mesaj gönderen ertank »

Ne tür bir bilgi şifrelemeye çalışıyorsun?
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Şifreli alan karşılaştırma

Mesaj gönderen pasa_yasar »

Sunucu bağlantı şifresi. Veritabanı ve kullanıcı haklarına ulasilmamali. Veritabanı bağlantısı tamamen sifrelemeye çalışıyorum
ertank
Üye
Mesajlar: 1520
Kayıt: 12 Eyl 2015 12:45

Re: Şifreli alan karşılaştırma

Mesaj gönderen ertank »

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.
Dosya ekleri
aes_security_fig3.jpg
aes_security_fig3.jpg (9.31 KiB) 2614 kere görüntülendi
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Şifreli alan karşılaştırma

Mesaj gönderen pasa_yasar »

Çok güzel bir açıklama olmuş. Teşekkür ediyorum. Üzerine çalışıyorum. Tamamlandığında buradan bir örnek veya kod paylaşamaya çalışacam
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Şifreli alan karşılaştırma

Mesaj gönderen pasa_yasar »

Ş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
İnternette araştırdım fakat bulamadım. Ufak bir örnek yazabilirmisiniz acaba. Benim kullandığım özet yapı aşağıdaki gibi.

Örnek :

Kod: Tümünü seç

    anahtar1 = array[0..3] of Byte = ('A','B','C')     // bende 32 anahtar olacak ona göre yapacam
    anahtar2 = array[0..3] of Byte = ('K','L','M')     // bende 32 anahtar olacak ona göre yapacam
    anahtar3 = array[0..3] of Byte = ('O','P','R')     // bende 32 anahtar olacak ona göre yapacam
Yukarıdaki değeri gelen değere aktarma nasıl olacak. Karşıdan şifre geldi. Hangi anahtar değeri ile gelmiş ise yukarıdan o şifreyi kullanacak. Gelen mesaj 3 numaralı anahtarı kullan dedi. Programda "anahtar3" karşılığı olan 'O','P','R' çözme şifresini kullanacak.

1. Şifre geldi.
2. Hangi anahtar ise onun değerlerini alacak
3. Karşılaştırma yapacak.

Karşılaştırmanın Gizlenmesi
Karşılaştırma değerlerini byte array şeklinde nasıl yapabilirim. Gelen şifreyide karşılaştıracam. Örnek 1. satır
A gelmiş ise

Kod: Tümünü seç

if gelendeger =  'A' then begin ekrandegeri='Z'; 
şeklindeki kıyaslamayı da güvenlik açısından gizlemek istiyorum. Üstteki alanları gizledim if alanında karşı değeri gizlemedim mi bi anlamı kalmayacak sanırım.

İnternetten araştırdım birşeyler yapılmış ama sanırım bilgim yetersiz diye muvaffak olamadım.
ertank
Üye
Mesajlar: 1520
Kayıt: 12 Eyl 2015 12:45

Re: Şifreli alan karşılaştırma

Mesaj gönderen ertank »

Merhaba,

Ekteki AES256 örneğini inceleyebilirsin. Dosya boyut limiti sebebi ile iki parça halinde sıkıştırmam gerekti. RAR5 şeklinde sıkıştırıldı. Winrar 5 veya üzeri versiyon ile açılabilir.

uCrypt.pas dosyası içine istediğin kadar sabit (Key2561, Key2562, Key2563 vb.) sabit ekleyebilirsin. İstediğin veriyi istediğin anahtar ile şifreleyip yine aynı anahtar ile geri açabilirsin.

Dikkat etmen gereken;
1- sabit değerlerin içeriğini aynı vermemektir. Ben sıralı verdim. Bunu karıştırmalısın.
2- bir veri hangi anahtar ile şifrelendi ise o anahtar ile açılmalıdır. Yoksa Exception oluşabilir.
3- database içinde değerleri saklayacak isen alanın biraz uzun olmasında fayda var. Base64 ile oluşturulan değerler şifre uzunluğuna göre 64, 96 gibi nisbeten uzun gizlenmiş veri oluşturabilirler.

Bilgiler zaten gizlenmiş şekilde olacaklar. Ancak mutlaka Byte ile çalışmak istiyorum diyorsan EncyptItAES ve DecryptItAES fonksiyonlarını değiştirip geriye Byte değer çevirmesini sağlamalısın.

Örnekte daha önce bahsetmiş olduğum ücretsiz Synopse (mORMot) projesinin sadece ilgili dosyalarını ekledim. Tüm framework için aşağıdaki linki inceleyebilirsin.

http://synopse.info/

İyi çalışmalar.
Dosya ekleri
aes example.part02.rar
(186.85 KiB) 67 kere indirildi
aes example.part01.rar
(255.03 KiB) 67 kere indirildi
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Şifreli alan karşılaştırma

Mesaj gönderen pasa_yasar »

Çok teşekkür ederim ilgin için ve emeğine sağlık. Güzel çalışma olmuş. Fakat Aes şifreleme olayını yaptım. Sadece programdaki AES anahtarının görünmesini istemiyorum. Byte çalışması olması gerekmiyor sizin güvenlik yorumlarınızda byte olursa programı kırmaya çalışan tırnak içindeki byte değerleri okuyamaz demiştiniz ordan yola çıkarak şifreleri byte şeklinde gizlemeye çalışıyorum. Şifreleri gizlemek için başka bir yöntem var ise onu yapabilirim fark etmez yeterki program içinde anahtar karakterler görünemesin. Olay sadece aes şifreleme değil bir de normal şifre kontolüde var onun da görünmemesi için karakterleri gizlemeye çalışıyorum. Bunun için bir örnek oluşturabilirseniz çok sevinirim.
ertank
Üye
Mesajlar: 1520
Kayıt: 12 Eyl 2015 12:45

Re: Şifreli alan karşılaştırma

Mesaj gönderen ertank »

uCrypt.pas içindeki Key2561 sabit değişkenini inceleyin.
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Şifreli alan karşılaştırma

Mesaj gönderen pasa_yasar »

inceledim byte yerine char kullanmak gerekli güvenliği sağlıyor ise oradan devam edeyim
ertank
Üye
Mesajlar: 1520
Kayıt: 12 Eyl 2015 12:45

Re: Şifreli alan karşılaştırma

Mesaj gönderen ertank »

O karakterler EncryptItAES fonksiyonu içinde Byte'a dönüştürülüyor.
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Şifreli alan karşılaştırma

Mesaj gönderen pasa_yasar »

Yazdığınız uygulamayı kullanarak işlemleri yapıyorum. Birşeyi merak ettim acaba;

Kod: Tümünü seç

EncryptItAES(Edit1.Text, Key2561);
alanındaki

Kod: Tümünü seç

Key2561
satırını dışarıdan yazdırabilirmiyim. Key2561 şeklinde değilde örneğin

Kod: Tümünü seç

 EncryptItAES(Edit1.Text, EncryptItAES(Label1.Caption, Key3000)); 
şeklinde gelecek farklı anahtar değerini şifresini çözerek olduğu gibi alsın veya şifrelesin.Amacım birden fazla şifre oluşturdum case of kullanmadan şifreli anahtar bilgisini olduğu gibi okutmak.

Denediğimde

Kod: Tümünü seç

[DCC Error] Unit1.pas(105): E2010 Incompatible types: 'Array' and 'TCaption'
hatasını verdi.
Cevapla