Der digitale Schülerausweis — datenschutzkonform, fälschungssicher und einfach zu verwalten.The digital student ID — privacy-compliant, tamper-proof and easy to manage.
Diese Seite richtet sich an Schulleitungen, IT-Beauftragte und Schulträger, die den Einsatz eines digitalen Schülerausweises prüfen. Sie beschreibt Funktionsweise, Sicherheitsarchitektur und Datenschutzkonzept von Hagen-ID im Detail.This page is intended for school administrators, IT officers and school authorities evaluating the implementation of a digital student ID. It describes the functionality, security architecture and privacy concept of Hagen-ID in detail.
Der digitale Ausweis in der PWA — mit Testdaten und dynamischem QR-CodeThe digital ID card in the PWA — with test data and a dynamic QR code
Hagen-ID ist ein digitaler Schülerausweis, der als Progressive Web App (PWA) auf dem Smartphone der Schülerinnen und Schüler läuft. Er ersetzt den klassischen Papier- oder Plastikausweis durch eine fälschungssichere, digital verifizierbare Lösung.Hagen-ID is a digital student ID card that runs as a Progressive Web App (PWA) on students' smartphones. It replaces traditional paper or plastic ID cards with a tamper-proof, digitally verifiable solution.
Das System wurde speziell für den Schulkontext in Nordrhein-Westfalen entwickelt und berücksichtigt die Anforderungen der DSGVO sowie der schulrechtlichen Datenschutzverordnung (VO-DV I / VO-DV II).The system was specifically developed for the school context in North Rhine-Westphalia and meets the requirements of the GDPR as well as state school data protection regulations (VO-DV I / VO-DV II).
Hagen-ID besteht aus drei Komponenten: dem Schülerausweis (PWA) auf dem Smartphone, dem Admin-Dashboard für die Schulverwaltung und der Verifizierungsschnittstelle zum Prüfen eines vorgelegten Ausweises.Hagen-ID consists of three components: the student ID card (PWA) on the smartphone, the admin dashboard for school management, and the verification interface for checking a presented ID.
Schülerinnen und Schüler rufen die PWA im Browser auf und melden sich mit ihrem Nachnamen, Geburtsdatum und einer persönlichen 6-stelligen PIN an. Nach dem Login wird der digitale Ausweis angezeigt: Name, Klasse, Schulfoto und ein dynamischer QR-Code, der alle 30 Sekunden wechselt.Students open the PWA in their browser and log in with their last name, date of birth, and a personal 6-digit PIN. After login, the digital ID is displayed: name, class, school photo, and a dynamic QR code that changes every 30 seconds.
Login mit Nachname, Geburtsdatum und PIN — ohne Passwort, ohne E-Mail-AdresseLogin with last name, date of birth and PIN — no password, no email address
Wer die Identität prüfen möchte — zum Beispiel an der Bibliothek, in der Mensa oder am Schuleingang — scannt den QR-Code mit einem beliebigen Smartphone oder Tablet. Die Verifizierung erfolgt serverseitig und liefert ein eindeutiges Ergebnis: gültig oder ungültig.Anyone who wants to verify identity — for example at the library, in the cafeteria, or at the school entrance — scans the QR code with any smartphone or tablet. Verification happens on the server side and returns a clear result: valid or invalid.
Kein spezielles Gerät nötig:No special device needed: Die Verifizierung funktioniert mit jedem Gerät, das einen QR-Code scannen kann. Es wird keine spezielle App benötigt — ein Smartphone-Browser genügt.Verification works with any device that can scan a QR code. No special app is needed — a smartphone browser is sufficient.
Warum ein Screenshot des Ausweises wertlos ist.Why a screenshot of the ID card is worthless.
Der Fälschungsschutz von Hagen-ID basiert auf zwei kryptografischen Verfahren, die ineinandergreifen: TOTP (Time-based One-Time Password) für den zeitlich begrenzten Code und eine gerätegebundene digitale Signatur (ECDSA P-256) über den gesamten QR-Code-Inhalt.Hagen-ID's tamper protection is based on two cryptographic methods that work together: TOTP (Time-based One-Time Password) for the time-limited code and a device-bound digital signature (ECDSA P-256) over the entire QR code content.
Bei der Erstanmeldung erhält jeder Schüler ein individuelles TOTP-Secret (eine zufällige Zeichenfolge nach RFC 6238). Aus diesem Secret und der aktuellen Uhrzeit berechnet die PWA alle 30 Sekunden einen neuen 6-stelligen Code — vollständig offline auf dem Gerät. Der Server kennt dasselbe Secret und kann den Code unabhängig verifizieren.At first login, each student receives an individual TOTP Secret (a random string according to RFC 6238). Using this secret and the current time, the PWA calculates a new 6-digit code every 30 seconds — entirely offline on the device. The server knows the same secret and can verify the code independently.
Das bedeutet: Selbst wenn jemand den QR-Code fotografiert oder abschreibt, ist dieser nach spätestens 30 Sekunden ungültig. Ein statischer Screenshot reicht nicht aus, um sich als eine andere Person auszugeben.This means: even if someone photographs or writes down the QR code, it becomes invalid after at most 30 seconds. A static screenshot is not sufficient to impersonate another person.
Zusätzlich zum TOTP-Code wird der gesamte QR-Code-Inhalt (Schüler-ID, TOTP-Code, Session-Kennung und Zeitstempel) digital signiert — mit ECDSA auf der Kurve P-256, einem etablierten asymmetrischen Signaturverfahren, das jeder moderne Browser nativ unterstützt.In addition to the TOTP code, the entire QR code content (student ID, TOTP code, session identifier and timestamp) is digitally signed — using ECDSA on the P-256 curve, an established asymmetric signature algorithm natively supported by every modern browser.
Das Schlüsselpaar entsteht dabei direkt auf dem Gerät des Schülers — über die WebCrypto-API des Browsers und als nicht exportierbarer Schlüssel: Der private Schlüssel kann per Konstruktion nicht ausgelesen werden, auch nicht durch eingeschleuste Schadskripte, und verlässt das Gerät nie. Nur der öffentliche Schlüssel wird beim Server registriert und dient dort ausschließlich zur Verifizierung — der Server selbst signiert nie.The key pair is created directly on the student's device — via the browser's WebCrypto API and as a non-extractable key: by construction, the private key cannot be read out, not even by injected malicious scripts, and never leaves the device. Only the public key is registered with the server, where it is used solely for verification — the server itself never signs.
Zusammenspiel:How it works together: Der QR-Code enthält die Schüler-ID, den aktuellen TOTP-Code, eine Session-Kennung, den Zeitstempel und die digitale Signatur über all diese Daten. Bei der Verifizierung prüft der Server:The QR code contains the student ID, the current TOTP code, a session identifier, the timestamp and the digital signature over all this data. When verifying, the server checks:
1. Ist der TOTP-Code für diesen Schüler gerade gültig? (Zeitfenster: ±30 Sekunden)1. Is the TOTP code currently valid for this student? (Time window: ±30 seconds)
2. Ist der Zeitstempel aktuell?2. Is the timestamp fresh?
3. Gehört die Session-Kennung zur aktuell aktiven Sitzung? (Ein-Geräte-Prinzip)3. Does the session identifier belong to the currently active session? (single-device principle)
4. Stimmt die Signatur mit dem registrierten Geräteschlüssel überein?4. Does the signature match the registered device key?
Erst wenn alle vier Prüfungen bestanden sind, gilt der Ausweis als verifiziert. Ein QR-Code ohne gültige Signatur wird grundsätzlich abgelehnt (fail-closed).The ID card is only considered verified if all four checks pass. A QR code without a valid signature is always rejected (fail-closed).
Bei jedem Login wird ein neuer kryptografischer Session-Token generiert (256 Bit Entropie). Der SHA-256-Hash dieses Tokens wird in der Datenbank gespeichert. Gleichzeitig wird der bisherige Geräteschlüssel serverseitig entwertet; das neue Gerät erzeugt ein frisches Schlüsselpaar und registriert dessen öffentlichen Schlüssel. Dadurch werden alle vorherigen Sitzungen automatisch ungültig.At each login, a new cryptographic session token is generated (256 bits of entropy). The SHA-256 hash of this token is stored in the database. At the same time, the previous device key is invalidated on the server; the new device generates a fresh key pair and registers its public key. This automatically invalidates all previous sessions.
Konsequenz:Consequence: Selbst wenn jemand die Login-Daten eines Schülers kennt und sich auf einem zweiten Gerät anmeldet, wird das erste Gerät sofort abgemeldet und der dort gespeicherte private Schlüssel ist wertlos. Es kann zu keinem Zeitpunkt zwei gültige Ausweise für dieselbe Person geben.Even if someone knows a student's login credentials and logs in on a second device, the first device is immediately logged out and the private key stored there becomes worthless. There can never be two valid ID cards for the same person at any time.
GDPR Datenschutz ist kein nachträgliches Feature, sondern Entwurfsprinzip.Privacy is not an afterthought but a design principle.
Hagen-ID speichert ausschließlich die Daten, die für die Funktion eines Schülerausweises zwingend erforderlich sind: Vor- und Nachname, Geburtsdatum, Klassenzugehörigkeit, Schulfoto und eine interne Schüler-ID aus der Schulverwaltungssoftware. Optional kann eine E-Mail-Adresse hinterlegt werden (z. B. für einen künftigen PIN-Reset). Es werden keine Leistungsdaten, Noten, Fehlzeiten, Adressen oder sonstigen personenbezogenen Daten erhoben.Hagen-ID stores only data that is strictly required for the function of a student ID: first and last name, date of birth, class membership, school photo, and an internal student ID from the school management software. Optionally, an email address can be stored (e.g., for future PIN reset). No performance data, grades, attendance records, addresses or other personal data are collected.
Die PWA enthält weder Analytics-Tools noch Tracking-Pixel oder Drittanbieter-Skripte. Es werden keine Nutzungsprofile erstellt. Die Ausweis-App kommuniziert ausschließlich mit dem schuleigenen Server — zu keinem Zeitpunkt werden Daten an externe Dienste übertragen.The PWA contains neither analytics tools nor tracking pixels or third-party scripts. No usage profiles are created. The ID card app communicates exclusively with the school's own server — data is never transmitted to external services at any time.
Besonders sensible Felder werden in der Datenbank zusätzlich verschlüsselt gespeichert (Fernet: AES + HMAC): Vor- und Nachname, Geburtsdatum, Schulfoto, Login-PIN und TOTP-Secret. Der Schlüssel dafür liegt außerhalb der Datenbank in der Server-Konfiguration. Ein entwendetes Datenbank-Backup enthält damit keine lesbaren Schülerdaten. Der Login-Abgleich erfolgt über sogenannte Blind-Indexe (HMAC), sodass die Klartextdaten dafür nicht benötigt werden.Particularly sensitive fields are additionally stored encrypted in the database (Fernet: AES + HMAC): first and last name, date of birth, school photo, login PIN and TOTP secret. The key is kept outside the database in the server configuration. A stolen database backup therefore contains no readable student data. Login matching is done via blind indexes (HMAC), so the plaintext data is not needed for it.
Wenn ein Ausweis per QR-Code gescannt wird, sendet der Prüfende lediglich den Inhalt des QR-Codes an den Server. Der Server antwortet mit einem binären Ergebnis: gültig oder ungültig, ergänzt um den Namen und das Foto des Schülers (damit die prüfende Person das Gesicht abgleichen kann). Es werden keine darüber hinausgehenden Daten übertragen.When an ID card is scanned via QR code, the verifier only sends the content of the QR code to the server. The server responds with a binary result: valid or invalid, supplemented with the student's name and photo (so the verifier can check the face). No additional data is transmitted.
Sicherheitsrelevante Ereignisse werden in einem Änderungsprotokoll (Audit-Log) festgehalten: CSV-Imports, manuelle Löschungen und Deaktivierungen, fehlgeschlagene Login-Versuche, Ausweis-Verifizierungen sowie die Vergabe und der Widerruf von API-Schlüsseln. Das Protokoll ist pseudonym (IDs statt Klarnamen), wird nach 180 Tagen automatisch bereinigt und ist ausschließlich für den Systembetreiber einsehbar.Security-relevant events are recorded in a change log (audit log): CSV imports, manual deletions and deactivations, failed login attempts, ID verifications, and the issuing and revocation of API keys. The log is pseudonymous (IDs instead of names), automatically purged after 180 days, and visible only to the system operator.
Bewusst nicht protokolliert wird der normale Abruf des eigenen Ausweises durch die Schülerin oder den Schüler. Nur für einen konkreten Verdachtsfall (z. B. Missbrauch eines Ausweises) kann der Betreiber eine gezielte, zeitlich begrenzte Detail-Nachverfolgung aktivieren — auf eine Schule oder eine einzelne ID eingegrenzt, mit automatischer Abschaltung (Standard 48 Stunden, maximal 7 Tage). Die Aktivierung selbst wird ebenfalls protokolliert.Routine access to one's own ID card by the student is deliberately not logged. Only for a concrete suspicious case (e.g., misuse of an ID) can the operator activate a targeted, time-limited detailed trace — scoped to one school or a single ID, with automatic shutoff (default 48 hours, maximum 7 days). The activation itself is also logged.
Rechtsgrundlage:Legal basis: Die Verarbeitung der Daten stützt sich auf die Erfüllung der schulischen Aufgabe (Art. 6 Abs. 1 lit. e DSGVO) in Verbindung mit den schulrechtlichen Datenschutzverordnungen des Landes NRW. Für das Schülerfoto kann eine Einwilligung erforderlich sein, sofern es über den Zweck der Identifikation hinaus verwendet wird.Data processing is based on the fulfillment of school tasks (Art. 6 Para. 1 lit. e GDPR) in connection with state school data protection regulations in NRW. Consent may be required for student photos if used beyond the purpose of identification.
Welche Daten werden wo gespeichert?Which data is stored where?
Die folgende Tabelle zeigt alle gespeicherten Datenkategorien, ihren Zweck und den Speicherort.The following table shows all stored data categories, their purpose, and storage location.
| DatenkategorieData Category | ZweckPurpose | SpeicherortStorage Location |
|---|---|---|
| Vor- und NachnameFirst and Last Name | Anzeige auf dem Ausweis, Login-IdentifikationDisplay on ID card, login identification | Datenbank (Server, verschlüsselt)Database (Server, encrypted) |
| GeburtsdatumDate of Birth | Login-Authentifizierung, Anzeige auf AusweisLogin authentication, display on ID card | Datenbank (Server, verschlüsselt)Database (Server, encrypted) |
| KlassenzugehörigkeitClass Membership | Anzeige auf dem Ausweis, VerwaltungDisplay on ID card, administration | Datenbank (Server)Database (Server) |
| SchulfotoSchool Photo | Anzeige auf dem Ausweis, Identitätsprüfung bei VerifizierungDisplay on ID card, identity verification during verification | Datenbank (Server, verschlüsselt)Database (Server, encrypted) |
| Interne Schüler-IDInternal Student ID | Abgleich mit Schulverwaltungssoftware beim Import und SyncReconciliation with school management software during import and sync | Datenbank (Server)Database (Server) |
| E-Mail-Adresse (optional)Email Address (optional) | Optionales Feld, z. B. für künftigen PIN-ResetOptional field, e.g., for future PIN reset | Datenbank (Server)Database (Server) |
| 6-stellige Login-PIN6-digit Login PIN | Authentifizierung der Schüler beim LoginStudent authentication during login | Datenbank (Server, verschlüsselt)Database (Server, encrypted) |
| TOTP-Secret | Generierung des wechselnden QR-CodesGeneration of changing QR code | Datenbank (Server, verschlüsselt) + Gerät (als nicht exportierbarer Schlüssel)Database (Server, encrypted) + Device (as non-extractable key) |
| Geräteschlüssel (privat)Device Key (private) | Signierung der QR-Codes (ECDSA P-256)Signing of QR codes (ECDSA P-256) | Nur auf dem Gerät des Schülers (nicht exportierbar)Only on student's device (non-extractable) |
| Geräteschlüssel (öffentlich)Device Key (public) | Serverseitige SignaturprüfungServer-side signature verification | Datenbank (Server)Database (Server) |
| Session-Token-Hash | Highlander-Prüfung (Ein-Geräte-Prinzip)Highlander check (single-device principle) | Datenbank (Server)Database (Server) |
Was nicht gespeichert wird:What is not stored: Adressen, Telefonnummern, Noten, Fehlzeiten, Standortdaten, Geräteinformationen oder Nutzungsstatistiken. IP-Adressen werden beim normalen Abruf des eigenen Ausweises nicht gespeichert — nur bei sicherheitsrelevanten Ereignissen (z. B. fehlgeschlagenen Login-Versuchen) oder während einer aktiven Verdachtsfall-Nachverfolgung.Addresses, phone numbers, grades, attendance records, location data, device information or usage statistics. IP addresses are not stored during normal access to one's own ID — only for security-relevant events (e.g., failed login attempts) or during an active suspicious-case trace.
Auf dem Smartphone des Schülers werden nach dem Login folgende Daten lokal gespeichert: die Anmelde-Sitzung als HttpOnly-Cookies (per JavaScript nicht auslesbar, daher XSS-geschützt), das TOTP-Secret und der private Signierschlüssel — beide als nicht exportierbare kryptografische Schlüssel in der Browser-Datenbank (IndexedDB) — sowie die Ausweisdaten für die Offline-Anzeige. Diese Daten ermöglichen es, den Ausweis auch ohne Internetverbindung anzuzeigen und gültige QR-Codes zu erzeugen. Beim Abmelden werden sie gelöscht.The following data is stored locally on the student's smartphone after login: the login session as HttpOnly cookies (not readable by JavaScript, hence XSS-protected), the TOTP secret and the private signing key — both as non-extractable cryptographic keys in the browser database (IndexedDB) — plus the ID card data for offline display. This data allows the ID card to be displayed and valid QR codes to be generated even without internet connectivity. It is deleted on logout.
Hagen-ID unterscheidet drei Rollen im Admin-Bereich. Jede Rolle hat klar definierte Berechtigungen nach dem Prinzip der minimalen Rechte.Hagen-ID distinguishes three roles in the admin area. Each role has clearly defined permissions following the principle of least privilege.
Systemweiter Vollzugriff. Kann Schulen anlegen, alle Daten einsehen und systemübergreifende Einstellungen verwalten. Vorgesehen für den technischen Betreiber oder Schulträger.System-wide full access. Can create schools, view all data, and manage system-wide settings. Intended for technical operators or school authorities.
Vollzugriff auf die eigene Schule. Kann Schülerdaten importieren, Fotos hochladen, Klassen und Bildungsgänge verwalten, Login-PINs drucken und Schuleinstellungen anpassen. Vorgesehen für Schulleitungen und Sekretariate.Full access to their own school. Can import student data, upload photos, manage classes and programs, print login PINs, and adjust school settings. Intended for school principals and administrative staff.
Eingeschränkter Lesezugriff auf die eigene Schule im Admin-Dashboard. Kann Schülerdaten einsehen, aber keine Imports durchführen und keine Daten verändern. Erhält zusätzlich einen eigenen digitalen Ausweis über die PWA (Klasse „Lehrerkollegium“) und kann das eigene Foto selbst über die App hochladen.Limited read-only access to their own school in the admin dashboard. Can view student data but cannot perform imports or modify data. Additionally receives their own digital ID via the PWA (class "Lehrerkollegium") and can upload their own photo directly through the app.
Das System ist mandantenfähig: Mehrere Schulen können dieselbe Installation nutzen, ohne gegenseitig auf Daten zugreifen zu können. Jede Schule hat einen eigenen URL-Pfad (z. B. example.de/kkbk), eigenes Branding (Logo, Farben) und eigene Benutzerkonten. Schuladmins und Lehrkräfte sehen ausschließlich die Daten ihrer eigenen Schule.The system is multi-tenant: multiple schools can use the same installation without being able to access each other's data. Each school has its own URL path (e.g., example.com/kkbk), its own branding (logo, colors), and its own user accounts. School admins and teachers see only their own school's data.
Die Trennung wird nicht nur in der Anwendung geprüft, sondern zusätzlich auf Datenbankebene erzwungen (PostgreSQL Row-Level-Security): Selbst ein Programmierfehler in der Anwendung könnte die Daten einer anderen Schule nicht sichtbar machen — die Datenbank selbst verweigert den Zugriff.The separation is not only checked in the application but additionally enforced at the database level (PostgreSQL row-level security): even a programming error in the application could not expose another school's data — the database itself denies access.
Administratoren melden sich mit E-Mail-Adresse und Passwort an. Das System setzt Rate Limiting ein: Nach 5 fehlgeschlagenen Anmeldeversuchen innerhalb von 15 Minuten wird temporär gesperrt — und zwar pro Konto und pro IP-Adresse, sodass sich die Sperre nicht durch wechselnde IP-Adressen umgehen lässt. Die Admin-Session wird über ein HttpOnly-Cookie verwaltet, das nicht per JavaScript ausgelesen werden kann und somit vor Cross-Site-Scripting (XSS) geschützt ist. Eine Passwortänderung macht alle bestehenden Sitzungen des Kontos sofort ungültig.Administrators log in with email address and password. The system implements rate limiting: after 5 failed login attempts within 15 minutes, access is temporarily blocked — per account and per IP address, so the lockout cannot be bypassed by rotating IP addresses. Admin sessions are managed via HttpOnly cookies, which cannot be read by JavaScript and are thus protected against Cross-Site Scripting (XSS) attacks. A password change immediately invalidates all existing sessions of the account.
Wie Daten ins System kommen und der Ausweis zum Schüler gelangt.How data gets into the system and how the ID reaches the student.
Das Sekretariat exportiert eine CSV-Datei aus der Schulverwaltungssoftware (z. B. SchILD-NRW) mit den Feldern: Interne ID, Vorname, Nachname, Geburtsdatum und Klasse. Diese Datei wird im Admin-Dashboard hochgeladen.The administrative office exports a CSV file from the school administration software (e.g., SchILD-NRW) with the fields: Internal ID, first name, last name, date of birth, and class. This file is uploaded in the admin dashboard.
Hagen-ID zeigt zunächst eine Vorschau aller Änderungen: Welche Schüler werden neu angelegt, welche aktualisiert, welche sind nicht mehr in der CSV enthalten (und werden daher zur Löschung vorgemerkt). Erst nach expliziter Bestätigung durch den Admin werden die Änderungen übernommen.Hagen-ID first shows a preview of all changes: which students will be created, which will be updated, and which are no longer in the CSV file (and will therefore be marked for deletion). Changes are only applied after explicit confirmation by the admin.
Die Schülerverwaltung im Admin-Dashboard nach dem Import (Testdaten)Student management in the admin dashboard after import (test data)
Automatische TOTP-Secret-Generierung:Automatic TOTP Secret Generation: Für jeden neu angelegten Schüler wird automatisch ein individuelles TOTP-Secret erzeugt. Dies geschieht serverseitig mit einem kryptografisch sicheren Zufallsgenerator. Ebenso wird automatisch eine zufällige 6-stellige Login-PIN generiert.For each newly created student, an individual TOTP secret is automatically generated. This is done server-side using a cryptographically secure random number generator. A random 6-digit login PIN is also automatically generated.
Automatisierter Sync (Alternative zum CSV-Import):Automated Sync (Alternative to CSV Import): Für Schulen mit entsprechender IT-Infrastruktur bietet Hagen-ID auch eine REST-API zur automatisierten Synchronisation der Schülerdaten. Über diese API können externe Tools neue Schüler anlegen, bestehende Daten aktualisieren und ausgetretene Schüler deaktivieren — ohne manuellen CSV-Upload. Die Authentifizierung erfolgt über schulspezifische API-Keys. Mit SchildSpider steht ein fertiges Management-Tool fürs Sekretariat bereit, das den Abgleich mit SchILD-NRW übernimmt.For schools with suitable IT infrastructure, Hagen-ID also offers a REST API for automated synchronization of student data. Through this API, external tools can create new students, update existing data, and deactivate departed students — without manual CSV upload. Authentication is via school-specific API keys. With SchildSpider, a ready-made management tool for the school office is available that handles reconciliation with SchILD-NRW.
Nach dem Import können die Login-PINs über eine Druckfunktion im Admin-Dashboard als individuelle Kärtchen ausgedruckt werden. Jedes Kärtchen enthält den Namen des Schülers, die 6-stellige PIN und einen QR-Code, der direkt zur Login-Seite der Schule führt. Die Verteilung erfolgt über die Klassenlehrkräfte — analog zu Zugangsdaten für andere Schulsysteme.After import, login PINs can be printed as individual cards via a print function in the admin dashboard. Each card contains the student's name, the 6-digit PIN, and a QR code linking directly to the school's login page. Distribution is done through class teachers — similar to access credentials for other school systems.
Druckansicht der Login-PIN-Kärtchen — pro Person mit QR-Code zur Login-Seite (Testdaten)Print view of the login PIN cards — one per person with a QR code to the login page (test data)
Schülerfotos können im Admin-Dashboard einzeln pro Schüler hochgeladen werden. Das Foto wird serverseitig gespeichert und auf dem Ausweis angezeigt. Beim CSV-Import wird ein Hash des Fotos gespeichert, sodass bei späteren Imports nur geänderte Fotos aktualisiert werden.Student photos can be uploaded individually per student in the admin dashboard. The photo is stored server-side and displayed on the ID. During CSV import, a hash of the photo is stored so that only changed photos are updated in later imports.
Lehrkräfte können ihr Foto selbst über die PWA hochladen — direkt aus der Ausweis-App heraus. Für Schülerinnen und Schüler erfolgt der Upload ausschließlich über das Admin-Dashboard durch die Schulverwaltung.Teachers can upload their own photo directly through the PWA — from within the ID card app. For students, photo upload is exclusively done through the admin dashboard by school administration.
Einzelne Schüler können vom Schuladmin manuell deaktiviert werden (z. B. bei Schulverweis). Der Ausweis wird dann sofort ungültig. Bei der nächsten endgültigen Löschung (nach der 4-Wochen-Frist) werden alle personenbezogenen Daten unwiderruflich entfernt.Individual students can be manually deactivated by the school admin (e.g., in case of expulsion). The ID then becomes immediately invalid. Upon permanent deletion (after the 4-week grace period), all personal data is irreversibly removed.
Jede Schule kann eine Gültigkeitsstrategie für Ausweise festlegen: automatisch bis zum Ende des aktuellen Schulhalbjahres oder ein festes Datum. Beim Schuljahreswechsel wird die Gültigkeit durch einen neuen CSV-Import aktualisiert. Schüler, die nicht mehr in der CSV auftauchen, werden automatisch zur Löschung vorgemerkt.Each school can set an ID validity strategy: automatically until the end of the current school term or a fixed date. At the school year transition, validity is updated through a new CSV import. Students who no longer appear in the CSV are automatically marked for deletion.
Schulen können pro Klasse freischalten, dass Schülerinnen und Schüler direkt aus der App eine Schulbescheinigung als PDF herunterladen (Lehrkräfte entsprechend eine Dienstbescheinigung). Das Dokument trägt einen dauerhaften Verifizierungs-QR-Code: Beim Scannen zeigt der Server den aktuellen Live-Status — aktiv eingeschrieben oder nicht. Eine Bescheinigung „widerruft sich“ damit automatisch, sobald die Person die Schule verlässt. Briefkopf, Logo und Textbausteine sind pro Schule anpassbar.Schools can enable, per class, that students download an enrollment certificate as a PDF directly from the app (teachers receive an employment certificate accordingly). The document carries a permanent verification QR code: when scanned, the server shows the current live status — actively enrolled or not. A certificate thus “revokes itself” automatically as soon as the person leaves the school. Letterhead, logo and text blocks are customizable per school.
Für IT-Beauftragte und Schulträger.For IT officers and school authorities.
Hagen-ID besteht aus vier Docker-Containern, die als Einheit betrieben werden:Hagen-ID consists of four Docker containers that are operated as a unit:
| KomponenteComponent | TechnologieTechnology | FunktionFunction |
|---|---|---|
| DatenbankDatabase | PostgreSQL 16 | Persistente Datenspeicherung aller Schüler- und VerwaltungsdatenPersistent storage of all student and administrative data |
| API-ServerAPI Server | Python / FastAPI | Geschäftslogik, Authentifizierung, QR-Code-Verifizierung, CSV-Import, Sync-APIBusiness logic, authentication, QR code verification, CSV import, sync API |
| Admin-DashboardAdmin Dashboard | React (SPA) | Weboberfläche für die SchulverwaltungWeb interface for school administration |
| Schüler-PWAStudent PWA | React (PWA) | Digitaler Ausweis auf dem Smartphone (für Schüler und Lehrkräfte)Digital ID on the smartphone (for students and teachers) |
Die Anwendung wird auf einem dedizierten Server oder einer VM betrieben. Für den produktiven Einsatz steht eine gehärtete Docker-Compose-Konfiguration bereit, die folgende Sicherheitsmaßnahmen umfasst:The application runs on a dedicated server or VM. For production use, a hardened Docker Compose configuration is available with the following security measures:
| MaßnahmeMeasure | BeschreibungDescription |
|---|---|
| JWT-AuthentifizierungAuthentication | Signierte Tokens mit Ablaufzeit (HS256, mind. 32 Zeichen Secret), Auslieferung als HttpOnly-CookieSigned tokens with expiration time (HS256, min. 32 character secret), delivered as HttpOnly cookies |
| bcrypt-Passwort-HashingPassword Hashing | Brute-Force-resistentes Hashing mit automatischem SaltBrute-force resistant hashing with automatic salt |
| Verschlüsselung at-restEncryption at rest | Namen, Geburtsdaten, Fotos, PINs und TOTP-Secrets liegen verschlüsselt in der Datenbank (Fernet); der Schlüssel liegt außerhalb der DBNames, dates of birth, photos, PINs and TOTP secrets are stored encrypted in the database (Fernet); the key is kept outside the DB |
| Row-Level-Security | Mandantentrennung zusätzlich auf Datenbankebene erzwungen (PostgreSQL RLS)Tenant separation additionally enforced at the database level (PostgreSQL RLS) |
| Rate Limiting | 5 Fehlversuche pro 15 Minuten, dann temporäre Sperre — pro Konto und pro IP; Grenzen serverseitig fest verankert5 failed attempts per 15 minutes, then temporary block — per account and per IP; limits enforced server-side |
| CORS-WhitelistWhitelist | Nur explizit erlaubte Domains können auf die API zugreifenOnly explicitly allowed domains can access the API |
| Gerätegebundene SignaturenDevice-bound Signatures | QR-Codes werden auf dem Gerät signiert (ECDSA P-256, WebCrypto); der private Schlüssel ist nicht exportierbar und verlässt das Gerät nieQR codes are signed on the device (ECDSA P-256, WebCrypto); the private key is non-extractable and never leaves the device |
| TOTP (RFC 6238) | Zeitbasierte Einmalcodes mit 30-Sekunden-IntervallTime-based one-time codes with 30-second intervals |
| Highlander-SessionHighlander Session | Nur ein aktives Gerät pro Schüler, Token- und Schlüssel-Invalidierung bei neuem LoginOnly one active device per student; token and key invalidation on new login |
| API-Key-AuthentifizierungAuthentication | Schulspezifische API-Keys für die Sync-Schnittstelle (SHA-256-Hash in DB, einmalig sichtbar); optional zusätzlich per IP-Allowlist abgesichertSchool-specific API keys for the sync interface (SHA-256 hash stored in DB, shown once only); optionally secured further with an IP allowlist |
| Pseudonymes Audit-LogPseudonymous Audit Log | Sicherheitsereignisse mit 180-Tage-Aufbewahrung; Detail-Nachverfolgung nur zeitlich begrenzt im VerdachtsfallSecurity events with 180-day retention; detailed tracing only time-limited in suspicious cases |
| Security Headers | CSP, X-Frame-Options, X-Content-Type-Options, HSTS via Reverse Proxy |
Was wird benötigt, wie läuft die Einführung ab?What is needed and how is the rollout structured?
Im ersten Schritt wird der Server mit der gehärteten Docker-Compose-Konfiguration eingerichtet. Anschließend wird die Schule im System angelegt (Name, Logo, Farben, URL-Pfad). Danach erfolgt der erste CSV-Import der Schülerdaten. Die generierten Login-PINs werden ausgedruckt und über die Klassenlehrkräfte an die Schülerinnen und Schüler verteilt.In the first step, the server is set up with the hardened Docker Compose configuration. Next, the school is created in the system (name, logo, colors, URL path). Then, the first CSV import of student data takes place. The generated login PINs are printed and distributed to students through their class teachers.
Zeitaufwand:Time Required: Die technische Einrichtung ist innerhalb eines Arbeitstages abgeschlossen. Der organisatorische Rollout (PIN-Verteilung, Einführung im Kollegium) kann parallel vorbereitet und in der ersten Schulwoche durchgeführt werden.Technical setup is completed within one business day. The organizational rollout (PIN distribution, staff introduction) can be prepared in parallel and conducted during the first school week.
Für Schulen ohne dediziertes IT-Personal empfehlen wir den Betrieb über Coolify — eine Self-Hosting-Plattform mit grafischer Oberfläche. Coolify übernimmt automatisch die TLS-Zertifikatsverwaltung, ermöglicht einfache Deployments und Rollbacks über ein Web-UI und reduziert den operativen Aufwand erheblich.For schools without dedicated IT staff, we recommend running it via Coolify — a self-hosting platform with a graphical interface. Coolify automatically handles TLS certificate management, enables simple deployments and rollbacks via web UI, and significantly reduces operational overhead.
Sie möchten Hagen-ID an Ihrer Schule einsetzen oder haben Fragen zur technischen Umsetzung, zum Datenschutzkonzept oder zur Einführung? Nehmen Sie gerne Kontakt auf:Would you like to implement Hagen-ID at your school, or do you have questions about technical implementation, data protection, or rollout? Please get in touch:
Wir zeigen Ihnen das System in einer Live-Demo und beantworten alle Fragen zu Funktionsumfang, Datenschutz und Einführung.We'll show you the system in a live demo and answer all your questions about features, data protection, and implementation.
Starten Sie mit einer einzelnen Klasse oder Jahrgangsstufe, um das System im Schulalltag zu erproben, bevor Sie den Rollout auf die gesamte Schule ausweiten.Start with a single class or grade level to test the system in your school environment before rolling out to the entire school.
Hagen-ID ist Open Source (AGPL-3.0). Der vollständige Quellcode ist auf GitHub einsehbar und kann von Ihrer IT-Abteilung oder externen Gutachtern geprüft werden — die Nutzung ist kostenlos.Hagen-ID is open source (AGPL-3.0). The complete source code is available on GitHub and can be reviewed by your IT department or external auditors — use is free of charge.