Binary Kodları Nasıl Yazılır?

Genelde şifreler oldukları haliyle veritabanına eklenmez. Hashed password olarak kaydedilir.

Python’ın base64 isimli bir kütüphanesi var. O kütüphanede b16, b32, b64, a85, b85 gibi değişik kodlama sınıfları mevcut. Ama pek şifreleme için kullanılmaları pek güvenilir değil.

from base64 import b64encode, b64decode


def to_b64(string: str) -> str:
    return b64encode(string.encode("utf-8")).decode("utf-8")


def from_b64(string: str) -> str or None:
    try:
        return b64decode(
            string.encode("utf-8").decode("utf-8")
        ).decode("utf-8")
    except (UnicodeDecodeError, ValueError):
        return None


print(to_b64("hello"))
print(from_b64(to_b64("hello")))

Çıktı:

aGVsbG8=
hello

flask öğrenirken flask_bcrypt isimli bir kütüphanenin kullanıldığını gördüm. Kodlarla size nasıl kullanıldığını biraz olsun göstermeye çalışayım:

pip install flask-bcrypt

Örnek:

from flask_bcrypt import Bcrypt

# Bcrypt'i ilklendirelim.
bcrypt = Bcrypt()

# Şifremiz aşağıdaki olsun:
sifre = "hello"
# Şimdi yukarıdaki şifreden karmaşık bir şifre oluşturalım.
karmasik_sifre = bcrypt.generate_password_hash(sifre)

# Bu şifre şunun gibi bir byte verisi geri dönderir:
# $2b$12$FdASfUBQ3PP1dWBmzFz26OHeocj4NIHUUM.nO3fpUa1bj160XnZvO'

# Bu karmaşık şifreyi veritabanınıza ekleyebilirsiniz. 

# Bunun `hello`'ya eşit olup olmadığını görmek için de şöyle bir fonksiyon kullanabilirsiniz.
bcrypt.check_password_hash(karmasik_sifre, sifre)

Not: bcrypt'in şöyle güzel bir özelliği var; bir şifreyi oluşturduktan sonra aynı şifreyi kodu tekrar yazarak bir daha oluşturamıyorsunuz.

# Yani aşağıdaki kodun ürettiği karmaşık şifre ile 
bcrypt.generate_password_hash("hello")
# Aşağıdaki kodun ürettiği karmaşık şifre aynı değil.
bcrypt.generate_password_hash("hello")

Başka bir şifreleme yöntemi de şöyle olabilir.

import hashlib


class Serialize:      
    
    @classmethod 
    def create_hashed_password(cls, password):
        return hashlib.sha512(password.encode("utf-8")).hexdigest()

    @classmethod
    def check_hashed_password(self, password, hashed_password):
        if hashlib.sha512(password.encode("utf-8")).hexdigest() == \
                hashed_password:
            return True
        else:          
            return False
    

hashed_password = Serialize.create_hashed_password(password="hello")
print(hashed_password)
print(
    Serialize.check_hashed_password(
        password="hello", 
        hashed_password=hashed_password
    )
)

Çıktı:

9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
True

hashlib içinde sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), blake2s() gibi değişik şifreleme algoritmaları var. Bunlara bakabilirsiniz.

Sonuç: Şifreleme yöntemi olarak "a" yerine "01100001" kullanmak pek mantıklı değil. Çünkü bilen birisi bu ifadeyi çok çabuk decode edebilir. Bunun yerine şifreleme algoritmaları kullanmak daha uygun.

Cevaplarınız için teşekkürler @aib ve @EkremDincel

tam olarak ifade etmek istediğimin net karşılığını @dildeolupbiten tam olarak şu kısımda yanıtlamış;


Tam olarak anlatmak istediğim burada çalışan yapıydı. Elbette kendimi tam ifade edemedim ayrıca düşündüğüm şeyin daha önce düşünüldüğünü ve yapıldığını düşünerek örnek görmek istemiştim o yüzden bu cevap benim için yeterli oldu. Fakat @aib ve @EkremDincel yaptığınız yorumlardaki şu kısımlar;

şifreyi sakladığım dosyayı saklamak için bir dosya o dosyayı da saklamam için başka bir dosya başka bir yapı ve sonsuza kadar devam etmesi gereken bir bütünlük içereceğini anladım dediğinizden. Bir kodu saklamak için sonsuza kadar birbirini saklayan dosyalar oluşturmanın mümkün olmadığını düşünüyorum o yüzden bu fikrin daha farklı bir yapısına ihtiyacım var. Güzel bir bakış ile göremediğim şeyleri gördüm teşekkürler.

yani biz yeni bir şeyler üretemeyip bozuk çözümler üreterek en az bozuk çözümlü halini bulup onu mu geliştiriyoruz? Bir şeyler üreten bir program yazmak mümkün mü? Yani demek istediğim ölümlü olmayıp da başarılı çözümler üreten **

bir insandan daha üstün şekilde program yazabilen yapay zekalar var mı?

**


En yaygın kullanılan şifreleme yöntemi nedir peki?

Nasil bir sifreden bahsediyoruz?

Kullanici dogrulamak (mesela uye girisi) icin kullanilan bir parolanin saklanmasi gerekmedigini zaten soyledik. Harflerin toplam sayisini (a=1, b=2, …) tutabiliriz mesela:

sifredegilparola

s + i + f + r + e + … + l + a
19 + 9 + 6 + 18 + 5 + 4 + 5 + 7 + 9 + 12 + 16 + 1 + 18 + 15 + 12 + 1 = 157

Kullanici giris yaparken yazdigi parolanin da harf toplamini alip, 157 olup olmadigina bakabiliriz.


Sifrelemenin temel sorunu tavuk-yumurta problemi, evet. Asimetrik sifreleme bu probleme ilginc bir yaklasim getiriyor, onu inceleyebilirsin. (Sadece benim acabilecegim bir sifreli metin yaratmak icin herkesin bildigi bir anahtar kullanmak mumkun.)

Yok, bozuk olmayan cozumler uretmek de mumkun, isin uzmanlari icin. Kullanicilar olarak bizim yapmamiz gereken hangi cozumlerin ne zaman kullanilacagini, zayiflik noktalarinin ne oldugunu bilmek ve sistemleri buna gore tasarlamak.

Mesela bir metni oldugu gibi saklamakla sifreleyip sifreleme anahtarini oldugu gibi saklamak arasinda guvenlik acisindan hic bir fark yok.

Mesela parola dogrulamasi icin parolanin kendisi yerine tek yonlu bir fonksiyondaki goruntusunu saklamak yeter. Goruntu tablosu saldirisina maruz kalmamak icin parolanin kendisini degil, rastgele uretilmis (ve bilinen) bir salt ile islenmis halini kullanmak gerekir.

En yaygin kullanilan yön bulma yontemi nedir?

1 Beğeni

Konuştukça benim zihnimde yeni yeni şeyler canlanıyor. Ben bu zamana kadar kullanıcı kontrolü yaparken şu şekilde doğrulama sağlıyordum.

Benim ki daima şöyle oluyordu. Kullanıcıdan bir id ve şifre al daha sonra bunu text halinde sorgula metnin aynısına karşılık geliyorsa doğru yanıt dön. eşit değilse yanlış yanıt dön. Bu yüzden de sormakta ısrarcı olduğum şeyi yapıyor ve şifreleri metin halinde saklıyordum. Uzunlukları toplamını tutup ona göre kayıt etme fikri hiç aklıma gelmemişti.

evet bende bunu demeye getirdim zaten. ekstra yük olmuş oluyor sadece.

Bunu cevaplanacak bir soru olarak algıladığım da buraya ilk pusula yazasım geldi. sonra aklıma google haritalar ve fazlası geldi. Soruyu sorarken vermiş olduğunuz cevabı anladım. Teşekkürler

Bu arada dün söylemeyi unuttum ama yukarıda bahsettiğim flask-bcrypt gibi çalışan bir karmaşık şifreyi, şöyle de oluşturabilirsiniz.

Python’ın secrets isimli bir kütüphanesi var. Bu kütüphaneyi de kullanabilirsiniz.
Örnek:

import secrets


class Serialize:
    def __init__(self):
        self.__set = set()

    def create_password_hash(self, password, length):
        hashed_password = secrets.token_hex(length)
        self.__set.add((password, hashed_password))
        return hashed_password
        
    def check_password_hash(self, password, hashed_password):
        if (password, hashed_password) in self.__set:
            return True
        else:
            return False

Şifre oluştururken artık bu sınıfı kullanacağız ve tıpkı bcrypt'te yaptığımız gibi önce serial'i ilklendirelim.

serial = Serialize()

sifre = "hello"

karmasik_sifre1 = serial.create_password_hash(sifre, 16)
print(karmasik_sifre1)

karmasik_sifre2 = serial.create_password_hash(sifre, 16)
print(karmasik_sifre2)

Bu karmasik_sifre1 ile, karmasik_sifre2 aynı değeri üretiyor gibi görünüyor ama tıpkı bcrypt'te olduğu gibi aslında farklı şifreler oluşuyor.
Çıktı:

2054cd6ae15299781d6388d9ffeaf397
8f8b34cb1d5e6251a100d94126fbdb17

Şifrenin uzunluğunu length parametresine verdiğiniz değerlerle değiştirebilirsiniz.
Ayrıca bu sınıfın içinde şifre ile karmaşık şifre'nin bir ilişkisi olup olmadığını test eden bir fonksiyon da yazılı. Veritabanı sorguları yaparken, böyle bir özelliği kullanabilirsiniz. Yani kısaca burada flask-bcrypt'in yaptığına benzer bir şey yaptık.

Edit: Doğrulama metodu düzeltildi.

1 Beğeni

O bir örnek, ve bu kurala dahil:

Zaten farklı şifrelerin aynı sonucu kolaylıkla verebileceği hemen anlaşılıyor.

@aib zaten işin uzmanlarının geliştirdiğini söylemiş. Şifreleme yöntemleri ve hash fonksiyonları ortaya bir algoritma çıkarıp “Güvenli gibi duruyor.” denerek kullanılmıyor. Matematiksel olarak bir açığı olup olmadığı kontrol ediliyor, örneğin şifre saklamada kullanılacak hash algoritmalarının pratikte farklı şifreler için aynı sonucu vermemeyi garanti ediyor olması lazım. Bu algoritmalar açık (public) olduğu için yıllarca kullanılmış fonksiyonlarda açık bulunabiliyor, sonra yenisi geliştiriliyor.

2 Beğeni

Ben mesela “hatirlama” veya “etrafa bakma” diyebilirdim. Hangi amacla yapildigina, hangi konu dahilinde konustugumuza gore degistigi icin cevaplamasi zor, bunu gostermek istedim :slight_smile:

Populer bir kriptografi kutuphanesinin dokumentasyonuna bakip destekledigi sifreleme metodlarina bakabilirsin. (Sadece sifreleme degil, imzalama, hash’leme, dogrulama, vs. metodlarina da bak)

Program da olurmus.

1 Beğeni

Şuandaki en güçlü hash algoritmalarının sha512, RIPEMD-320 ve Whirlpool olduğuna dair yazılar okudum.

1 Beğeni

bu siteyi daha önce görmüş müydünüz?

Yok görmedim. Yukarıda hashlib kütüphanesiyle alakalı bir örnek paylaşmıştım, o örnekte sha512 kullanılıyordu zaten.

1 Beğeni

Sezar şifreleme ve fibonacci ye bakabilirsiniz

O ne alaka anlamadım?

A ya 29,Z ye 1 diyen şifreleme dizisi.(Numara ve harfleri salladım)