Şifrelemede kullanılan anahtarı gizlemek

@coderistan Hangi veritabanı ya adam sadece benim veritabanımı alıp götürürse ozaman ne olucak buyüzden keyi de dosyada saklamayı düşündüm ama bazı arkadaşlarım bunun amatörce oldugunu düşündü bende merak ediyorum başka nasıl yaparım

1 Beğeni

şu bana bahsettiğn iş mi bu? oyunun için saklanacak verileri kendi dosya türümü yapıp saklayacağım falan demiştin doğru mu hatırlıyorum?

2 Beğeni

Mapleri saklamak için kullanicam

2 Beğeni

pyro sensin dimi yanlış hatırlamıyroum ?

2 Beğeni

Evet ne çabuk unuttun :smile:

1 Beğeni

konuşuruz, korona olmuştum onunla boğuşuyordum :slight_smile:

3 Beğeni

@Emerald_Gamer şifreyi hiçbir yere saklamıyoruz, @coderistan şifrenin hash’ını saklamaktan bahsetmiş. Benim aklıma da bu gelmişti, eğer herhangi bir sebepten dolayı yanlış anahtar ile deşifre edilmiş ve anlamı olmayan veriyi kullanmak istemiyorsan önce hash’ları karşılaştırıp daha sonra veriyi deşifre edebilirsin.

Hash algoritmaları hakkında biraz araştırma yapın istersenseniz.

Niye ki?

Geçmiş olsun.

2 Beğeni

Hash ne demek anlamadım galiba, tam olarak ne yapicagimida anlamadım :smiley:
şimdi kullanıcı tamamen farklı bir bilgisayara veritabanini atarsa ve orda açmak istese bu yüzden manuel giricek degilmi şifreyi

Evet.

Kısaca algoritma şu

kullanici_hash = kullanıcı sifresi al ve bu şifrenin md5 veya sha özetini al(hangisini kullanıyorsan)
vt_hash = veritabanından sifrenin hash(özet) halini al(öndecen kayıt edilmiş)

eğer kullanici_hash == vt_hash:
    giriş başarılı
değilse:
    giriş başarısız

Aslinda bahsettigim bir terim (buyuk harf ve kisaltma koymam ipucuydu). Istediginiz sekilde arastirabilirsiniz, ben suradan basladim: key derivation function at DuckDuckGo

Arastirmayi odev olarak vermistim, @dildeolupbiten yine dayanamayip yapmis :slight_smile: [Benim de sahip oldugum faydali bir ozellik ama, takildigima bakmayin.]

Sonraki kisim yanlis anlasilmis gibi:

Ben bunu authentication (dogrulama) icin degil, encryption (sifreleme) icin soyledim.

Yani passphrase’den uretilen (derive edilen) key ile database encrypt/decrypt edilecek. Dogrulama isteniyorsa decryption sonrasinda ortaya cikan database database’e benziyor mu diye bakilabilir.

Veya @EkremDincel’in dedigi, simdi gordum.

3 Beğeni

Ben de ilk başta sorduğu soruya çözüm olarak bunu yapmasını önermiştim sizin çözümüne dair değildi yani. Şifrenin saklanması yerine kullanıcı tarafından girilecek şifreyi doğrulayıp onunla verileri çözmeye başlaması için. Sizinkisi yanlış demiyorum tabi, hatta belki en iyi çözümdür. Bu yüzden önerdiğim çözüme karşılık avantajlarından da bahsederseniz çok memnun oluruz.

1 Beğeni

Aslında şifreyi oluşturan karakterler ve bu karakterlerin hash edilmiş halini, @Emerald_Gamer programda bu şekilde kullansın diye değil, isterse authentication da yapabileceğini görsün diye kullandım. Gerek var mı bu da ayrı bir konu. Yanılıyor olabilirim ama bana öyle geliyor ki, bir veritabanını illa şifrelemek gerekiyorsa, bu şifrenin password veya hashed password olmasının çok bir farkı yok. Çünkü yanılmıyorsam her halükarda bu veritabanının kilidini açacak olan şifre, bir başkasının eline geçerse ve bu kişide veritabanı mevcutsa, o veritabanı açılır ve veritabanının içeriği görüntülenebilir. Yani @Emerald_Gamer’in programını kullanan bir kişi, veritabanını ve bu veritabanını açan şifreyi bir başkasıyla paylaşırsa bu veritabanını o kişi de açabilir.

Burada benim anlamaya çalıştığım şey @Emerald_Gamer’in tam olarak nasıl bir şey yapmaya çalıştığı ve bu yapmaya çalıştığı şeye neden gereksinim duyduğu.

Bu yazıdan anladığım şey şu: Kullanıcı yanlış bir şifre girdiğinde, veritabanının gerçek içeriği yerine, bozulmuş bir içerik üretilmesi. Sanıyorum bu doğrudan veritabanının içeriğinin değiştirilmesi anlamına gelmiyor. Aksine, veritabanının okunacağı programda kullanıcının şifre girerek veritabanına ulaşacağı ve eğer kullanıcı yanlış bir şifre girmişse bozulmuş bir içerikle karşılaşacağı anlamına geliyor diye düşündüm. Eğer yanlış düşünmediysem, o zaman veritabanının içinde bulunacak olan veriler şifrelenmiş bir şekilde duracak. Yani kullanıcı veritabanını açtığı zaman orada ne olduğunu anlayamayacak. Bu verileri ancak program çalışırken bir çözücü fonksiyon çözebilecek. Ve bu fonksiyon, kullanıcı ancak şifreyi doğru bir şekilde girdiği zaman içeriği düzeltecek. Doğru mu anlamışım acaba?

1 Beğeni

Bu da bir yöntem, bildiğim kadarı ile WinRAR bunu yapıyor. Son versiyonunda da benim bahsettiğim yöntem kullanılıyormuş.

1 Beğeni

Ah, tamam. Art arda gorunce…

Bu da ayni sekilde sanirim. Benim hatam.


Aynen. :+1:

Kullanicinin girdigi parola bir KDF’den gecirilerek sifreleme anahtarina donusturuluyor. Database bu anahtar ile sifrelenerek saklaniyor, parola ve anahtar hic bir yerde saklanmiyor. Haliyle database’i okumanin tek yolu parolayi bilmek.

Parola dogrulamasi hic bir zaman yapilmiyor.
Hatta teorik olarak “yanlis” bir parola girerek bambaska bir database (veya dogru database’i bile) elde etmek mumkun. (Cunku dogru parola disinda her sey rastgele icerik uretiyor gibi dusunulebilir.)

2 Beğeni

Decryption+decompression pahali diye oyle yapmislardir herhalde.

Rainbowa karsi tuzladiklari surece mantikli aslinda.

3 Beğeni

Ben de öyle düşünüyorum.

Hash’ı kullanıp şifreyi bulmayı amaçlayan bir saldırı şekli herhalde, araştırayım :smiley:

1 Beğeni

Yanılmıyorsam aşağıdaki kodlar bu amaca hizmet ediyor. Tabi daha karmaşık algoritmalar da kullanılabilir.

def encrypt(string: str, password: int):
    return "".join(
        chr(ord(item) + password + index)
        for index, item in enumerate(string)
    )


def decrypt(string: str, password: int):
    return "".join(
        chr(ord(item) - password - index)
        for index, item in enumerate(string)
    )
     

print(encrypt(string="hello", password=2020))  # ࡌࡊࡒࡓࡗ
print(decrypt(string="ࡌࡊࡒࡓࡗ", password=2020))  # hello
3 Beğeni

Bu KDF’ten sonraki kisim. Bir simple substitution cipher implementasyonu.

Benim aklimda daha cok SHA-256 PBKDF2 + AES-256 GCM gibi bir sey vardi…

3 Beğeni

evet basit bir yer değiştirme şifresi.

Sonraki kısım derken biraz açabilir misin lütfen?

Aklındakini kodlarla biraz somutlaştırsak mı acaba? :blush: