Arkadaşlar Python ile kendi veritabanı sistemimi yapmaya çalışıyorum ama encrypt ettiğim datanın keylerini nasıl saklicam hiçbir fikrim yok yardımcı olabilir misiniz ?
O anahtarlar erişilebilir olduktan sonra şifrelemenin anlamı yok.
Peki yaptığım sistemi nasıl sifrelicem ki ozaman
Verileri kimden saklamaya çalışıyorsunuz?
Genel olarak veritabanına erisilmesin kullanan kişiden başka
Burada birkaç yöntemden bahsedilmiş:
En kolay yol şifreyi sadece veri tabanına erişecek kişinin bilmesidir herhalde.
Evet ama şifreyi de keye donusturmem gerekiyor ve eğer kişi yanlış şifre girerse asıl şifrenin keye dönüşmüş haline denk gelebilir yanlış sifreninde dönüşmüş hali
Ne demek istediğinizi anlamadım ama ben şunu demek istemiştim: veritabanını şifrelerken ve deşifre ederken kullanılacak anahtarı kullanıcı girecek.
Bu arada bu projeyi kendinizi geliştirmek için yapıyorsunuz sanırım, veritabanı güvenliğine gerçek bir uygulamada ihtiyaç duyuyorsanız bilinen bir kütüphane kullanmanız gerektiğini söylememe gerek yok herhalde.
Zaten suanki yaptıklarımın hepsi kendimi geliştirmeye yönelik olmalı bence bu yüzden yapicam
Mesela adamın girdiği key yanlış olsa
Ama şifre ile aynı encrypt sonucu verse nolcak
Şifreleme algoritmamızda bir açık olduğunu görmüş olacağız. Siz nasıl bir algoritma kullanıyorsunuz ki?
Bana bu cevabı arkadaşım vermişti bende size aktardım o algoritmalar dan hangisini kullanmalıyım ki ve keyi dosyanın içine gizlesem olmazmı yani datanın yanında key olucak
Veritabanina erismeye calisan seyin kullanan kisi olup olmadigini nasil anlayacagiz?
Anlayamiyacagiz ama verilerin ortada öylece koruma olmadan durmasını istemiyorum kişi veritabanına ulaşmak isitiyorsa şifresini giricek en azından sistemi öyle dusunuyorum
Verileri kimden ve neden korumaya çalışıyorsunuz? Veritabanında ne tür veriler olacak?
O zaman şifrenin saklanmasına gerek yok, ilk başta şifreyi de kullanıcı seçer veya uygulama rastgele bir tane oluşturup ona söyler.
Tam olarak aradigim cevap! Ve aslinda iyi bir sekilde yanlis:
“kişi […] şifresini giricek” ise dogru kisiyi bu sekilde tanimlayabiliyoruz: sifresini girebilen kisi dogru kisi, giremeyen kisi yanlis kisi.
Kisinin girdigi sifreyi bir Key Derivation Function’dan (KDF) gecirip ciktiyi (simetrik) key olarak kullanabilirsin.
Söylediğiniz seyi birazdaha acarmisiniz en azından bir link
Sanıyorum @aib şundan bahsediyor:
Key, anahtar demek; derivation, türetme demek, function’ı da zaten biliyorsunuz. O halde bahsettiği şey, anahtar türetme fonksiyonu gibi bir anlama karşılık geliyor. Yani fonksiyon, kendisine parametre olarak verilen bir karakter dizisi için, bir takım işlemler sonucunda şifrelenmiş bir çıktı üretecek.
Bildiğim kadarıyla bcrypt bu tarz bir şifreleme fonksiyonu.
Örnek:
from flask_bcrypt import Bcrypt
bcrypt = Bcrypt()
hashed_password = bcrypt.generate_password_hash("hello")
print(bcrypt.check_password_hash(hashed_password, "hello"))
bcrypt’in özelliği şu; mesela hello
karakter dizisi için generate_password_hash
fonksiyonunu art arda çağırarak aynı şifreyi iki kez üretemezsiniz.
Buna benzer şifre oluşturucu ve şifre çözücü fonksiyonları Python’ın standart modülü olan secrets
'ı kullanarak siz de yazabilirsiniz.
Örneğin:
from secrets import token_hex
class Bcrypt:
__matching = {}
@classmethod
def create_password_hash(cls, string: str):
hashed_password = token_hex(32)
cls.__matching[hashed_password] = string
return hashed_password
@classmethod
def check_password_hash(cls, hashed_password: str, string: str):
return cls.__matching[hashed_password] == string
bcrypt = Bcrypt()
hashed_password = bcrypt.create_password_hash("hello")
print(bcrypt.check_password_hash(hashed_password , "hello"))
Encrypt etmek icin kullanilan sifrenin bir md5 veya sha özetini veritabaninda tutabilirsin. Kullanıcı sifreyi girince özetini alip veritabanindaki ozet ile karşılaştırarak doğru olup olmadığını kontrol edebilirsin. Linux sistemlerindeki gibi.