Skip to content
SilverPC Blog

SilverPC Blog

Tech

Ne nézd sárgán a világot! Így szüntesd meg a monitorod sárga képét!
  • Tech

Ne nézd sárgán a világot! Így szüntesd meg a monitorod sárga képét!

2025.08.16.
A feltörhetetlen erőd: Így férj hozzá a zárolt merevlemez adataihoz!
  • Tech

A feltörhetetlen erőd: Így férj hozzá a zárolt merevlemez adataihoz!

2025.08.16.
Router csere után csak korlátozott az internet? Így állítsd helyre a teljes hozzáférést!
  • Tech

Router csere után csak korlátozott az internet? Így állítsd helyre a teljes hozzáférést!

2025.08.16.
Láthatatlan a világháló? Így oldd meg, ha az ipv4 kapcsolat nincs csatlakoztatva!
  • Tech

Láthatatlan a világháló? Így oldd meg, ha az ipv4 kapcsolat nincs csatlakoztatva!

2025.08.16.
Örökkévalóságnak tűnik? Pörgesd fel a számítógép lassú be- és kikapcsolását!
  • Tech

Örökkévalóságnak tűnik? Pörgesd fel a számítógép lassú be- és kikapcsolását!

2025.08.16.
Megőrjít, hogy nagyon hamar elsötétül a képernyő? Számolj le a bosszantó hibával végleg!
  • Tech

Megőrjít, hogy nagyon hamar elsötétül a képernyő? Számolj le a bosszantó hibával végleg!

2025.08.16.

Express Posts List

Das Benachrichtigungen-Icon ist verschwunden oder nervt? So bekommen Sie die Kontrolle zurück!
  • Német

Das Benachrichtigungen-Icon ist verschwunden oder nervt? So bekommen Sie die Kontrolle zurück!

2025.08.16.
Kennen Sie das Gefühl? Sie brauchen dringend eine bestimmte Benachrichtigung, doch das vertraute Icon ist spurlos verschwunden,...
Bővebben Read more about Das Benachrichtigungen-Icon ist verschwunden oder nervt? So bekommen Sie die Kontrolle zurück!
Xbox Game Bar Problem: Warum ist bei der Aufzeichnung nur Ihre Stimme zu hören und wie beheben Sie das?
  • Német

Xbox Game Bar Problem: Warum ist bei der Aufzeichnung nur Ihre Stimme zu hören und wie beheben Sie das?

2025.08.16.
Achtung, Falle: Erkennen und wehren Sie den neusten Enkeltrick ab, bevor es zu spät ist!
  • Német

Achtung, Falle: Erkennen und wehren Sie den neusten Enkeltrick ab, bevor es zu spät ist!

2025.08.16.
Bereit für die Garten-Apokalypse? So können Sie sicher Plants vs Zombies 3 herunterladen
  • Német

Bereit für die Garten-Apokalypse? So können Sie sicher Plants vs Zombies 3 herunterladen

2025.08.16.
Frustriert durch einen Google Play Karte Fehler? Diese Sofort-Lösungen helfen wirklich!
  • Német

Frustriert durch einen Google Play Karte Fehler? Diese Sofort-Lösungen helfen wirklich!

2025.08.16.
Primary Menu
  • Főoldal
  • Hírek
  • Tech
  • Hardver
  • Szoftver
  • Mobil
  • Gamer
  • Játék
  • Web
  • Tudomány
  • Egyéb
  • Német

Ihr erstes sicheres Login System mit Python: Einsteigerfreundlicher Leitfaden zum Nachprogrammieren

2025.08.16.

In der digitalen Welt von heute sind sichere Login-Systeme das A und O für jede Anwendung, ob Web-App, mobile Anwendung oder Desktop-Programm. Sie schützen nicht nur die Daten Ihrer Nutzer, sondern auch die Integrität Ihres Systems. Doch wie baut man so ein System, insbesondere wenn man noch am Anfang seiner Programmierkarriere steht? Keine Sorge! Dieser umfassende Leitfaden nimmt Sie an die Hand und zeigt Ihnen Schritt für Schritt, wie Sie Ihr eigenes, sicheres Login-System mit Python erstellen können. Ganz ohne Vorkenntnisse in komplexen Web-Frameworks, konzentrieren wir uns auf die Kernmechanismen, die jede Authentifizierung sicher machen.

Warum ist ein sicheres Login-System so wichtig?

Stellen Sie sich vor, Sie haben eine fantastische Idee für eine Anwendung, die persönliche Daten speichert. Ohne ein robustes Login-System sind diese Daten schutzlos. Angreifer könnten leicht Zugriff erlangen, sensible Informationen stehlen und das Vertrauen Ihrer Nutzer nachhaltig zerstören. Ein sicheres Login-System ist nicht nur eine technische Notwendigkeit, sondern auch eine Frage des Vertrauens und der Reputation.

  • Datenschutz: Schutz persönlicher und sensibler Informationen.
  • Integrität: Verhinderung unbefugter Änderungen an Daten oder Systemen.
  • Vertrauen: Aufbau einer soliden Basis mit Ihren Nutzern.
  • Compliance: Einhaltung von Datenschutzvorschriften wie der DSGVO.

In diesem Artikel lernen Sie die grundlegenden Konzepte kennen, die hinter der Benutzerauthentifizierung stecken, und implementieren diese praktisch mit Python. Wir werden uns auf die Kernkomponenten konzentrieren: die Speicherung von Benutzerdaten, das sichere Speichern von Passwörtern und die Überprüfung der Anmeldedaten.

Grundlagen verstehen: Die Säulen eines sicheren Logins

Bevor wir in den Code eintauchen, lassen Sie uns die wichtigsten Elemente eines Login-Systems beleuchten:

  1. Benutzerregistrierung: Hier erstellen Nutzer ein Konto, indem sie einen Benutzernamen und ein Passwort wählen.
  2. Passwort-Hashing: Der kritischste Schritt! Passwörter dürfen niemals im Klartext gespeichert werden. Stattdessen werden sie gehasht – eine Einwegfunktion, die das ursprüngliche Passwort in eine nicht umkehrbare Zeichenkette umwandelt.
  3. Datenbank: Ein Ort, an dem Benutzernamen und die gehashten Passwörter sicher gespeichert werden. Wir verwenden SQLite, eine einfache, dateibasierte Datenbank, die perfekt für kleinere Projekte ist.
  4. Authentifizierung (Login): Der Prozess, bei dem ein Benutzer seine Anmeldedaten eingibt und das System diese überprüft.
  5. Session Management: Nach erfolgreichem Login muss das System sich „merken”, dass ein Benutzer angemeldet ist, um den Zugriff auf geschützte Bereiche zu ermöglichen. Für unser einfaches CLI-Beispiel lösen wir dies mit einer simplen Statusvariable.

Die Werkzeuge für unser Projekt: Python und seine Bibliotheken

Für dieses Projekt benötigen Sie:

  • Python 3: Stellen Sie sicher, dass Sie Python auf Ihrem System installiert haben. Sie können es von python.org herunterladen.
  • bcrypt: Eine leistungsstarke und weit verbreitete Bibliothek für das Passwort-Hashing. Bcrypt ist resistent gegen Brute-Force-Angriffe und Rainbow-Table-Angriffe, da es sogenannte „Salts” verwendet und absichtlich langsam ist.
  • sqlite3: Dies ist eine Standardbibliothek in Python, die bereits integriert ist. Sie benötigen keine zusätzliche Installation.

Um bcrypt zu installieren, öffnen Sie Ihr Terminal oder Ihre Eingabeaufforderung und geben Sie ein:

pip install bcrypt

Schritt 1: Datenbank-Setup mit SQLite

Zuerst erstellen wir eine SQLite-Datenbank und eine Tabelle, um unsere Benutzerdaten zu speichern. Wir brauchen Spalten für eine ID, den Benutzernamen und den Hash des Passworts.

Erstellen Sie eine Datei namens database.py:

import sqlite3

DATABASE_NAME = 'users.db'

def create_users_table():
    """Erstellt die Benutzertabelle, falls sie noch nicht existiert."""
    conn = sqlite3.connect(DATABASE_NAME)
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT UNIQUE NOT NULL,
            password_hash TEXT NOT NULL
        )
    ''')
    conn.commit()
    conn.close()
    print("Datenbank und 'users'-Tabelle erfolgreich erstellt oder geprüft.")

if __name__ == '__main__':
    create_users_table()

Führen Sie diese Datei einmal aus (python database.py), um Ihre Datenbank zu initialisieren. Sie werden eine Datei namens users.db in Ihrem Projektverzeichnis sehen.

  Vom Aussterben bedroht: Warum sich eine eigene Suchleiste im Browser nicht durchsetzen konnte

Schritt 2: Sicheres Passwort-Hashing mit Bcrypt

Wie bereits erwähnt, ist das Hashing von Passwörtern absolut entscheidend. Bcrypt ist hier unsere erste Wahl. Es erzeugt für jedes Passwort einen einzigartigen Hash, selbst wenn zwei Benutzer das gleiche Passwort wählen würden, dank der Verwendung eines zufälligen „Salts” und einer variablen Anzahl von Runden (Work Factor).

Diese Funktionen werden wir in unseren Registrierungs- und Login-Prozessen verwenden. Sie werden Teil unserer auth.py-Datei sein.

Schritt 3: Benutzerregistrierung implementieren

Die Registrierungsfunktion nimmt einen Benutzernamen und ein Passwort entgegen, hasht das Passwort und speichert beides in unserer SQLite-Datenbank.

Schritt 4: Benutzer-Authentifizierung (Login) erstellen

Die Login-Funktion ruft den Hash des eingegebenen Benutzernamens aus der Datenbank ab und vergleicht ihn mit dem vom Benutzer eingegebenen Passwort unter Verwendung von bcrypt.checkpw().

Schritt 5: Session Management (Einfache Implementierung für CLI)

Für unser Kommandozeilen-basiertes System können wir eine einfache globale Variable verwenden, um den aktuell angemeldeten Benutzer zu speichern. In einer echten Webanwendung würden Sie hierfür robuste Session Management-Techniken (z.B. Cookies und serverseitige Sessions in Flask oder Django) verwenden.

Zusammenfügen: Das komplette Login-System

Nun verknüpfen wir alle Komponenten zu einem interaktiven Kommandozeilenprogramm. Für eine saubere Struktur teilen wir den Code in drei Dateien auf:

database.py (unverändert von Schritt 1):

import sqlite3

DATABASE_NAME = 'users.db'

def create_users_table():
    conn = sqlite3.connect(DATABASE_NAME)
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT UNIQUE NOT NULL,
            password_hash TEXT NOT NULL
        )
    ''')
    conn.commit()
    conn.close()
    print("Datenbank und 'users'-Tabelle erfolgreich erstellt oder geprüft.")

auth.py (enthält Hashing, Registrierung und Login-Logik):

import sqlite3
import bcrypt
from database import DATABASE_NAME # Importiert den Datenbanknamen

def hash_password(password):
    """Hasht ein Passwort mit bcrypt."""
    # bcrypt benötigt Bytes als Eingabe, daher .encode('utf-8')
    hashed = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
    # Wir speichern den Hash als String, daher .decode('utf-8')
    return hashed.decode('utf-8')

def check_password(password, hashed_password):
    """Überprüft, ob ein eingegebenes Passwort mit einem Hash übereinstimmt."""
    try:
        # Auch hier müssen die Eingaben Bytes sein
        return bcrypt.checkpw(password.encode('utf-8'), hashed_password.encode('utf-8'))
    except ValueError:
        # Falls der Hash ungültig ist (z.B. falsches Format)
        return False

def register_user(username, password):
    """Registriert einen neuen Benutzer."""
    conn = sqlite3.connect(DATABASE_NAME)
    cursor = conn.cursor()

    # Prüfen, ob der Benutzername bereits existiert
    cursor.execute("SELECT id FROM users WHERE username = ?", (username,))
    if cursor.fetchone():
        conn.close()
        return False, "Benutzername existiert bereits."

    hashed_password = hash_password(password)

    try:
        cursor.execute("INSERT INTO users (username, password_hash) VALUES (?, ?)",
                       (username, hashed_password))
        conn.commit()
        conn.close()
        return True, "Registrierung erfolgreich!"
    except sqlite3.Error as e:
        conn.rollback()
        conn.close()
        return False, f"Fehler bei der Registrierung: {e}"

def login_user(username, password):
    """Meldet einen Benutzer an."""
    conn = sqlite3.connect(DATABASE_NAME)
    cursor = conn.cursor()

    cursor.execute("SELECT password_hash FROM users WHERE username = ?", (username,))
    result = cursor.fetchone()
    conn.close()

    if result:
        stored_password_hash = result[0]
        if check_password(password, stored_password_hash):
            return True, "Login erfolgreich!"
        else:
            return False, "Falsches Passwort."
    else:
        return False, "Benutzername nicht gefunden."

main.py (das Hauptprogramm mit Menü und Session-Handling):

from database import create_users_table
from auth import register_user, login_user
import sys # Für sys.exit()

# Globale Variable für den aktuell angemeldeten Benutzer (einfaches Session-Management)
current_user = None

def get_current_user():
    """Gibt den aktuell angemeldeten Benutzernamen zurück."""
    return current_user

def set_current_user(username):
    """Setzt den aktuell angemeldeten Benutzer."""
    global current_user
    current_user = username

def logout():
    """Meldet den aktuellen Benutzer ab."""
    global current_user
    current_user = None
    print("Sie wurden abgemeldet.")

def protected_area():
    """Ein Beispiel für einen Bereich, der nur für angemeldete Benutzer zugänglich ist."""
    if get_current_user():
        print(f"nWillkommen im geschützten Bereich, {get_current_user()}!")
        print("Hier könnten geheime Informationen oder Funktionen angezeigt werden.")
    else:
        print("nSie müssen angemeldet sein, um diesen Bereich zu betreten.")

def main_menu():
    """Zeigt das Hauptmenü an und verarbeitet Benutzereingaben."""
    while True:
        print("n--- Hauptmenü ---")
        if get_current_user():
            print(f"Angemeldet als: {get_current_user()}")
            print("1. Geschützter Bereich")
            print("2. Abmelden")
            print("3. Beenden")
        else:
            print("1. Registrieren")
            print("2. Anmelden")
            print("3. Beenden")

        choice = input("Ihre Wahl: ")

        if get_current_user(): # Angemeldetes Menü
            if choice == '1':
                protected_area()
            elif choice == '2':
                logout()
            elif choice == '3':
                print("Auf Wiedersehen!")
                sys.exit()
            else:
                print("Ungültige Wahl. Bitte versuchen Sie es erneut.")
        else: # Abgemeldetes Menü
            if choice == '1':
                username = input("Benutzername: ")
                password = input("Passwort: ")
                password_confirm = input("Passwort bestätigen: ")
                if not username or not password or not password_confirm:
                    print("Benutzername und Passwörter dürfen nicht leer sein.")
                    continue
                if password != password_confirm:
                    print("Passwörter stimmen nicht überein!")
                    continue
                success, message = register_user(username, password)
                print(message)
            elif choice == '2':
                username = input("Benutzername: ")
                password = input("Passwort: ")
                if not username or not password:
                    print("Benutzername und Passwort dürfen nicht leer sein.")
                    continue
                success, message = login_user(username, password)
                print(message)
                if success:
                    set_current_user(username)
            elif choice == '3':
                print("Auf Wiedersehen!")
                sys.exit()
            else:
                print("Ungültige Wahl. Bitte versuchen Sie es erneut.")

if __name__ == '__main__':
    create_users_table() # Stellen Sie sicher, dass die Tabelle existiert
    main_menu()

So verwenden Sie es:

  1. Speichern Sie die drei Dateien (database.py, auth.py, main.py) im selben Verzeichnis.
  2. Stellen Sie sicher, dass Sie bcrypt installiert haben (pip install bcrypt).
  3. Führen Sie zuerst python database.py aus, um die Datenbank zu erstellen (users.db).
  4. Führen Sie dann python main.py aus, um Ihr Login-System zu starten.
  Vorsicht, Falle! Darum solltest du bei verlockenden Angeboten niemals deine Telefonnummer rausgeben

Experimentieren Sie mit der Registrierung neuer Benutzer, dem Anmelden und Abmelden, und versuchen Sie, auf den geschützten Bereich zuzugreifen.

Wichtige Sicherheitshinweise und nächste Schritte

Obwohl unser System die Grundlagen der sicheren Authentifizierung abdeckt, gibt es immer Raum für Verbesserungen und weitere Sicherheitsmaßnahmen:

  • Input-Validierung: Überprüfen Sie Benutzereingaben strenger (z.B. Mindestlänge für Passwörter, keine Leerzeichen am Anfang/Ende). Wir haben eine grundlegende Prüfung auf leere Felder hinzugefügt.
  • Fehlerbehandlung: Unser Code hat grundlegende Fehlerbehandlung, aber in einer Produktivumgebung sollten alle möglichen Fehlerzustände abgefangen und benutzerfreundlich behandelt werden (z.B. detailliertere Fehlermeldungen ohne interne Details).
  • Rate Limiting: Um Brute-Force-Angriffe (automatisches Ausprobieren vieler Passwörter) zu verhindern, sollten Sie die Anzahl der fehlgeschlagenen Login-Versuche pro Benutzer oder IP-Adresse begrenzen und eine kurze Sperre nach zu vielen Fehlversuchen einführen.
  • Keine sensiblen Daten im Klartext! Wir haben dies beim Passwort gehandhabt, aber denken Sie daran für andere sensible Daten, die Sie speichern könnten.
  • Umgebungsabhängige Konfiguration: Speichern Sie Datenbankpfade oder andere Konfigurationsdetails nicht direkt im Code, sondern in Umgebungsvariablen oder Konfigurationsdateien (z.B. .env-Dateien).
  • Web-Frameworks: Für eine echte Webanwendung würden Sie Frameworks wie Flask oder Django nutzen. Diese bieten integrierte Lösungen für Session Management, CSRF-Schutz (Cross-Site Request Forgery) und weitere Sicherheitsfunktionen, die über das reine Login hinausgehen.
    • Flask: Leichtgewichtig und flexibel, ideal für kleinere Projekte und APIs.
    • Django: Ein „Batteries included”-Framework, das viele Funktionen (wie ein integriertes User-Modell) bereits mitbringt und sich für größere, komplexe Anwendungen eignet.
  • Zwei-Faktor-Authentifizierung (2FA): Eine zusätzliche Sicherheitsebene, bei der Benutzer neben dem Passwort eine zweite Bestätigung (z.B. SMS-Code, App-Code) eingeben müssen.
  • Passwort-Reset-Funktionen: Implementieren Sie sichere Methoden, um Passwörter zurückzusetzen, ohne das ursprüngliche Passwort offenzulegen (z.B. mittels temporärer Token, die per E-Mail gesendet werden).

Fazit: Ihr erster Schritt in die digitale Sicherheit

Herzlichen Glückwunsch! Sie haben erfolgreich Ihr erstes sicheres Login-System mit Python erstellt. Sie haben nicht nur die grundlegenden Programmierkonzepte gelernt, sondern auch ein tiefes Verständnis für die Bedeutung von Passwort-Hashing und die Prinzipien der sicheren Authentifizierung entwickelt.

Dies ist ein fantastischer Startpunkt für Ihre Reise in die Webentwicklung und Systemsicherheit. Experimentieren Sie weiter, bauen Sie auf diesem Wissen auf und machen Sie Ihre nächsten Projekte noch sicherer. Die Welt der Programmierung wartet darauf, von Ihnen entdeckt zu werden!

bcrypt Benutzerverwaltung Einsteiger Login-System Passwort-Hashing Python Sichere Authentifizierung Sicherheit SQLite Webentwicklung
Auf Facebook teilen Auf X teilen Auf Messenger teilen Auf WhatsApp teilen Auf Viber teilen

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Verwandte

Achtung, Falle: Erkennen und wehren Sie den neusten Enkeltrick ab, bevor es zu spät ist!
  • Német

Achtung, Falle: Erkennen und wehren Sie den neusten Enkeltrick ab, bevor es zu spät ist!

2025.08.16.
Debugging wie ein Profi: Diese GDB-Erweiterungen sollten Sie unbedingt nutzen
  • Német

Debugging wie ein Profi: Diese GDB-Erweiterungen sollten Sie unbedingt nutzen

2025.08.16.
Sicherheits-Check: Verbindet Ihr Tor Browser wirklich nicht über Tor? So finden Sie es heraus
  • Német

Sicherheits-Check: Verbindet Ihr Tor Browser wirklich nicht über Tor? So finden Sie es heraus

2025.08.16.
Achtung, Better Discord-Nutzer: Können Plugins wirklich Viren enthalten und wie schützen Sie sich davor?
  • Német

Achtung, Better Discord-Nutzer: Können Plugins wirklich Viren enthalten und wie schützen Sie sich davor?

2025.08.16.
Fehlersuche für Einsteiger: Wie Sie systematisch herausfinden, was an Ihrem Programm falsch ist
  • Német

Fehlersuche für Einsteiger: Wie Sie systematisch herausfinden, was an Ihrem Programm falsch ist

2025.08.16.
Sicher unterwegs: Wo Sie vertrauenswürdige Darknet Links finden und anzeigen lassen können
  • Német

Sicher unterwegs: Wo Sie vertrauenswürdige Darknet Links finden und anzeigen lassen können

2025.08.16.

Olvastad már?

Das Benachrichtigungen-Icon ist verschwunden oder nervt? So bekommen Sie die Kontrolle zurück!
  • Német

Das Benachrichtigungen-Icon ist verschwunden oder nervt? So bekommen Sie die Kontrolle zurück!

2025.08.16.
Kennen Sie das Gefühl? Sie brauchen dringend eine bestimmte Benachrichtigung, doch das vertraute Icon ist spurlos verschwunden,...
Bővebben Read more about Das Benachrichtigungen-Icon ist verschwunden oder nervt? So bekommen Sie die Kontrolle zurück!
Xbox Game Bar Problem: Warum ist bei der Aufzeichnung nur Ihre Stimme zu hören und wie beheben Sie das?
  • Német

Xbox Game Bar Problem: Warum ist bei der Aufzeichnung nur Ihre Stimme zu hören und wie beheben Sie das?

2025.08.16.
Achtung, Falle: Erkennen und wehren Sie den neusten Enkeltrick ab, bevor es zu spät ist!
  • Német

Achtung, Falle: Erkennen und wehren Sie den neusten Enkeltrick ab, bevor es zu spät ist!

2025.08.16.
Bereit für die Garten-Apokalypse? So können Sie sicher Plants vs Zombies 3 herunterladen
  • Német

Bereit für die Garten-Apokalypse? So können Sie sicher Plants vs Zombies 3 herunterladen

2025.08.16.
Frustriert durch einen Google Play Karte Fehler? Diese Sofort-Lösungen helfen wirklich!
  • Német

Frustriert durch einen Google Play Karte Fehler? Diese Sofort-Lösungen helfen wirklich!

2025.08.16.

Verpassen Sie das nicht

Das Benachrichtigungen-Icon ist verschwunden oder nervt? So bekommen Sie die Kontrolle zurück!
  • Német

Das Benachrichtigungen-Icon ist verschwunden oder nervt? So bekommen Sie die Kontrolle zurück!

2025.08.16.
Xbox Game Bar Problem: Warum ist bei der Aufzeichnung nur Ihre Stimme zu hören und wie beheben Sie das?
  • Német

Xbox Game Bar Problem: Warum ist bei der Aufzeichnung nur Ihre Stimme zu hören und wie beheben Sie das?

2025.08.16.
Achtung, Falle: Erkennen und wehren Sie den neusten Enkeltrick ab, bevor es zu spät ist!
  • Német

Achtung, Falle: Erkennen und wehren Sie den neusten Enkeltrick ab, bevor es zu spät ist!

2025.08.16.
Bereit für die Garten-Apokalypse? So können Sie sicher Plants vs Zombies 3 herunterladen
  • Német

Bereit für die Garten-Apokalypse? So können Sie sicher Plants vs Zombies 3 herunterladen

2025.08.16.
Copyright © 2025 SilverPC Blog | SilverPC kérdések

Az oldalon megjelenő minden cikk, kép és egyéb tartalom a SilverPC.hu tulajdonát képezi, felhasználásuk kizárólag az eredeti forrás pontos és jól látható feltüntetésével engedélyezett.