Güvenli şifre oluşturma artık oldukça büyük bir sorun. Özellikle bazı sistemlerin giriş kontrolü ya da “insan mısınız” kontrolünü yapmadığını düşünürsek basit şifreler kullanmak oldukça tehlikelidir.

Bu python kodu bize güvenli şifre [rastgele] oluşturmamıza yardımcı olacaktır.
Güvenli şifre oluşturmak için 2 noktaya bakıyoruz:
- Şifre uzunluğu 8 – 16 karakter arasında olmalı
- Şifre büyük harf, küçük harf, rakam ve özel karakter içermeli.
Gerçek bir güvenli şifre ise bundan çok daha komplikedir. O konuya belki sonra değiniriz. Buradaki asıl amacımız kullanıcıdan veri girişleri alarak gereken sets değişkenlerinden verileri almak.
import secrets
import string
def get_password_length():
"""Kullanıcıdan 8-16 arası geçerli bir uzunluk alır."""
while True:
try:
length = int(input("Şifre uzunluğu (8-16 arası): "))
if 8 <= length <= 16:
return length
else:
print("Hata: Uzunluk 8 ile 16 arasında olmalıdır.")
except ValueError:
print("Hata: Lütfen geçerli bir sayı girin.")
def get_character_sets():
"""Kullanıcıya hangi karakter türlerini dahil edeceğini sorar."""
print("\nHangi karakter türlerini kullanmak istersiniz? (e/h)")
sets = {}
sets["büyük harf"] = string.ascii_uppercase
sets["küçük harf"] = string.ascii_lowercase
sets["rakam"] = string.digits
sets["özel karakter"] = string.punctuation # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
selected = []
for name, chars in sets.items():
while True:
cevap = input(f"{name} dahil edilsin mi? (e/h): ").strip().lower()
if cevap in ("e", "h"):
if cevap == "e":
selected.append(chars)
break
else:
print("Lütfen 'e' veya 'h' girin.")
if not selected:
print("En az bir karakter türü seçmelisiniz. Varsayılan olarak tüm türler seçiliyor.")
selected = list(sets.values())
return selected
def generate_password(length, char_sets):
"""
Belirtilen uzunlukta ve karakter setlerinden oluşan bir şifre üretir.
Her setten en az bir karakter bulunmasını garanti eder.
"""
# Tüm karakter havuzu
all_chars = ''.join(char_sets)
# Her setten en az bir karakter seç
password_parts = [secrets.choice(chars) for chars in char_sets]
# Kalan karakterleri rastgele doldur
remaining = length - len(password_parts)
if remaining > 0:
password_parts.extend(secrets.choice(all_chars) for _ in range(remaining))
# Karakterleri karıştır (ilk kısım setlerden seçildiği için başlangıçta sıralı olabilir)
secrets.SystemRandom().shuffle(password_parts)
return ''.join(password_parts)
def main():
print("=== Güvenli Şifre Oluşturucu ===\n")
length = get_password_length()
char_sets = get_character_sets()
password = generate_password(length, char_sets)
print(f"\nOluşturulan şifre: {password}")
print(f"Uzunluk: {len(password)} karakter")
if __name__ == "__main__":
main()Burada dikkat etmenizi istediğim sets tanımlarken ascii karakterlerini kullandık. Bunun anlamı şudur. Kullanıcı büyük veya küçük harf seçtiğinde Türkçe karakter’ler gelmez. Sadece İngilizce (Latin) karakterler seçilir.
string.ascii_uppercase: ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.ascii_lowercase: abcdefghijklmnopqrstuvwxyz
string.digits: 0123456789
string.punctuation: !"#$%&'()*+,-./:;<=>?@[\]^_{|}~
Eğer ille de Türkçe karakterler de olsun derseniz aşağıdaki kodları değiştirebilirsiniz:
sets["büyük harf"] = string.ascii_uppercase + "ÇĞİÖŞÜ"
sets["küçük harf"] = string.ascii_lowercase + "çğıöşü"