Python dosya oluşturma

Sifrelemek degistirmek oluyor, degistirmek de tanim geregi bitlerini degistirmek zaten. Bir seyi bitleriyle oynamadan sifrelemek veya baska herhangi bir sekilde degistirmek imkansiz.

“Karistir ki plaintext’teki en ufak degisiklik butun ciphertext’i degistirsin” dersen diffusion, “Karistir ki key’deki en ufak degisiklik butun ciphertext’i degistirsin” dersen confusion. Bitlerle bu sekilde oynamak icin S-box’lar, P-box’lar kullaniliyor.

2 Beğeni

Kullanıcı parolaları için çoğunlukla salt-hash algoritmaları tercih ediliyor diye biliyorum. Google eposta şifrelerini bu şekilde saklıyor mesela. Bu sistemde şifrenin kendisi saklanmıyor. Her yeni şifre oluşturulduğunda rastgele bir salt (tuz) oluşturuluyor. Daha sonra bu salt kullanılarak şifremiz hashleniyor. Biz de bu hashı kayıt ediyoruz. Daha sonra kullanıcı tekrar şifre girişi yaptığında bu şifrenin daha önce kaydettiğimiz hash ile uyuşup uyuşmadığını kontrol ediyoruz. Dikkat ederseniz burada şifreyi hiçbir yere kaydetmedik. Bu yüzden isteyen istediği dosyayı okusun veya ele geçirsin, şifremizi (doğrudan) elde edemiyor. Bu işlem için örnek bir kod veriyorum:

import hashlib, binascii, os

def hash_password(password):
    """Hash a password for storing."""
    salt = hashlib.sha256(os.urandom(60)).hexdigest().encode('ascii')
    pwdhash = hashlib.pbkdf2_hmac('sha512', password.encode('utf-8'), 
                                salt, 100000)
    pwdhash = binascii.hexlify(pwdhash)
    return (salt + pwdhash).decode('ascii')

def verify_password(stored_password, provided_password):
    """Verify a stored password against one provided by user"""
    salt = stored_password[:64]
    stored_password = stored_password[64:]
    pwdhash = hashlib.pbkdf2_hmac('sha512', 
                                  provided_password.encode('utf-8'), 
                                  salt.encode('ascii'), 
                                  100000)
    pwdhash = binascii.hexlify(pwdhash).decode('ascii')
    return pwdhash == stored_password
>>> hash = hash_password("şifrem")
>>> verify_password(hash, "yanlış")
False
>>> verify_password(hash, "şifrem")
True

Şimdi güvenlik kısmına gelince, bu yöntem ile şifrelediğimiz şifreler de her yöntemde olduğu gibi deneme yanılma yoluyla (brute force) ile bulunabilir. Zaten bu yüzden hep etraftan şifrelerimizin en az 8 harf olması gerektiğini, noktalama işaretleri vs olması gerektiğini duyuyoruz. Mümkün şifrelerin sayısı arttıkça zorla bulma işlemi uzuyor çünkü. Ama mesela kişisel bilgisayarımız gibi ortalama işlem gücüne sahip bir bilgisayarda bu şifrelerin brute force ile kırılması 10.000 yıldan fazla sürüyor. Kriptoloji tamamen buna dayanarak çalışır zaten.

3 Beğeni

“Kullanici sifresi kaydedip giriste kontrol etme” dersek dogru. “Sifreleme” (encryption) dersek yanlis, o bambaska bir sey ve hash ile yapilamiyor.

Hm altindaki kod ornegi anlatilandan biraz farkli (daha modern ve guvenli). Ben olsam aciklamayla uyussun ve anlamasi kolay olsun diye su ornegi verirdim:

def hash_password(password):
    salt = random_string() #okunur olabilir
    hash = sha256(salt + password)
    return (salt, hash)

def verify_password(stored_salt, stored_hash, provided_password):
    return sha256(stored_salt + provided_password) == stored_hash

Sonucta ikisi de production-ready kod degil.

2 Beğeni

Evet, asıl amacım kodu açıklamak olsaydı sizin örneğiniz daha yerinde olurdu. Çok daha anlaşılır.

Haklısınız, terimleri yanlış kullanmışım. Şifreleme farklı bir şey tabii, biz bu yöntemde parolanın kendisini elde edemiyoruz.

1 Beğeni