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.