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.