<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sarwiki.informatik.hu-berlin.de/index.php?action=history&amp;feed=atom&amp;title=JavaCard%40KeePassDX</id>
	<title>JavaCard@KeePassDX - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://sarwiki.informatik.hu-berlin.de/index.php?action=history&amp;feed=atom&amp;title=JavaCard%40KeePassDX"/>
	<link rel="alternate" type="text/html" href="https://sarwiki.informatik.hu-berlin.de/index.php?title=JavaCard@KeePassDX&amp;action=history"/>
	<updated>2026-07-09T03:14:07Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://sarwiki.informatik.hu-berlin.de/index.php?title=JavaCard@KeePassDX&amp;diff=15512&amp;oldid=prev</id>
		<title>Weigtvin: initial entry; coarse description of the project</title>
		<link rel="alternate" type="text/html" href="https://sarwiki.informatik.hu-berlin.de/index.php?title=JavaCard@KeePassDX&amp;diff=15512&amp;oldid=prev"/>
		<updated>2026-07-06T11:26:26Z</updated>

		<summary type="html">&lt;p&gt;initial entry; coarse description of the project&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Dieser Artikel ist Teil des Studienprojekts:&lt;br /&gt;
&amp;quot;JavaCard als Secure Element für FIDO2-Passkeys in KeePassDX&amp;quot;.&lt;br /&gt;
Der zugehörige Quellcode ist in der Gitlab-Instanz des CMS zu finden.&lt;br /&gt;
&amp;lt;ref&amp;gt;https://scm.cms.hu-berlin.de/sar/javacard-keepassdx&lt;br /&gt;
abgerufen am 15.06.2026&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel des Studienprojekts ist die Nutzung einer Smartcard als Zugangsmittel für einen mobilen Schlüsselring,&lt;br /&gt;
der Credentials über die Autofill-Funktion an Anwendungen bereitstellt.&lt;br /&gt;
Hierfür soll die Smartcard-Funktionalität in einen bestehenden Passwortmanager integriert werden.&lt;br /&gt;
Neben der Entschlüsselung des Masterpassworts soll ein verschlüsselter Datenblob an die Smartcard übermittelt werden,&lt;br /&gt;
um alle kryptografischen Operationen auf dieser auszuführen.&lt;br /&gt;
Das Interface zwischen Smartcard und Passwortmanager wird eigens definiert;&lt;br /&gt;
standardisierte Interfaces werden nicht verwendet.&lt;br /&gt;
Während die Passwortdatenbank mit der Smartcard entsperrt wird,&lt;br /&gt;
erfolgt die Freigabe von Passkeys schlüsselindividuell.&lt;br /&gt;
&lt;br /&gt;
== Ist-Zustand ==&lt;br /&gt;
&lt;br /&gt;
Für die Implementierung eines mobilen Schlüsselrings wurde der Open-Source-Passwortmanager KeePassDX ausgewählt.&lt;br /&gt;
&amp;lt;ref&amp;gt;https://github.com/Kunzisoft/KeePassDX&lt;br /&gt;
abgerufen am 21.04.2026&amp;lt;/ref&amp;gt;&lt;br /&gt;
Die Android-App verwaltet Datenbanken im KeePass-Format und unterstützt bereits Autofill sowie Passkeys.&lt;br /&gt;
Zudem ermöglicht sie die Entsperrung einer KeePass-Datenbank mittels Yubikey,&lt;br /&gt;
sofern dieser das Challenge-Response-Verfahren mit HMAC-SHA1 unterstützt.&lt;br /&gt;
&lt;br /&gt;
Da KeePassDX keine direkte Kommunikation mit Hardware-Keys unterstützt,&lt;br /&gt;
wurde vom Entwickler eine separate App,&lt;br /&gt;
der „Hardware Key Driver“,&lt;br /&gt;
entwickelt.&lt;br /&gt;
&amp;lt;ref&amp;gt;https://gitlab.com/kunzisoft/android-hardware-key-driver&lt;br /&gt;
abgerufen am 26.04.2026&amp;lt;/ref&amp;gt;&lt;br /&gt;
Bei der Entsperrung wird der Datenbank-Seed als Challenge an den Hardware-Key gesendet.&lt;br /&gt;
Dieser berechnet den HMAC-SHA1 der Challenge,&lt;br /&gt;
und die Response fließt in die Schlüsselableitung ein.&lt;br /&gt;
Die Verbindung zum Yubikey erfolgt über USB oder NFC.&lt;br /&gt;
&lt;br /&gt;
KeePassDX kann als Credential Provider in den Android-Einstellungen konfiguriert werden,&lt;br /&gt;
um Passkeys in der Datenbank zu speichern.&lt;br /&gt;
Bei der Registrierung eines neuen Passkeys wird dieser gespeichert;&lt;br /&gt;
bei der Authentifizierung bei einem bekannten Dienst kann nach der Datenbankentsperrung der gespeicherte Passkey ausgewählt werden.&lt;br /&gt;
&lt;br /&gt;
Als Testumgebung diente ein Google Pixel 9a mit GrapheneOS (basierend auf Android 16).&lt;br /&gt;
Die Funktionalität der Passkeys wurde mit dem Browser Vanadium auf der Seite `webauthn.io` getestet.&lt;br /&gt;
Vanadium ist eine Chromium-Variante,&lt;br /&gt;
die eine native Android-Autofill-Implementierung und Credential-Manager-Support für Passkeys nutzt,&lt;br /&gt;
wodurch keine Google Play Services erforderlich sind.&lt;br /&gt;
&amp;lt;ref&amp;gt;https://grapheneos.org/features#vanadium&lt;br /&gt;
abgerufen am 13.04.2026&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Konfiguration waren die Registrierung und Authentifizierung mit Passkeys erfolgreich.&lt;br /&gt;
Die Entsperrung einer Datenbank mit einem Yubikey war jedoch nicht möglich.&lt;br /&gt;
&lt;br /&gt;
== Entsperrung einer Datenbank mit einer JavaCard ==&lt;br /&gt;
&lt;br /&gt;
Das erste Ziel bestand darin,&lt;br /&gt;
eine JavaCard als Hardware-Key zur Datenbankentsperrung zu nutzen.&lt;br /&gt;
Da diese Funktionalität für Yubikeys in KeePassDX bereits implementiert war,&lt;br /&gt;
wurde auf Seiten des Passwortmanagers lediglich ein neuer Hardware-Token-Typ hinzugefügt.&lt;br /&gt;
Die weitere Implementierung basierte weitgehend auf der vorhandenen Logik mit entsprechenden Anpassungen.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wurde ein JavaCard-Applet entwickelt,&lt;br /&gt;
welches das Challenge-Response-Verfahren implementiert.&lt;br /&gt;
Als Algorithmus wurde HMAC-SHA256 gewählt.&lt;br /&gt;
Da die verfügbare JavaCard diesen Algorithmus nicht nativ unterstützte,&lt;br /&gt;
wurde eine eigene Implementierung in einer separaten Klasse erstellt,&lt;br /&gt;
die auch von anderen Applets genutzt werden kann.&lt;br /&gt;
Diese unterstützt ausschließlich Schlüssellängen von 256 Bit.&lt;br /&gt;
&lt;br /&gt;
Bei der Installation des Applets wird ein zufälliger 256-Bit-Schlüssel generiert,&lt;br /&gt;
der nicht exportierbar ist.&lt;br /&gt;
Die Challenge muss eine Länge von 32 Byte aufweisen.&lt;br /&gt;
Der HMAC-SHA256 wird mit dem bei der Installation generierten Schlüssel berechnet.&lt;br /&gt;
Die Response hat ebenfalls eine Länge von 32 Byte und wird als Antwort zurückgesendet.&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung einer neuen Datenbank in KeePassDX kann die Verwendung eines Hardware-Keys gewählt werden,&lt;br /&gt;
wobei nun zwischen Yubikey und JavaCard unterschieden werden kann.&lt;br /&gt;
Bei Auswahl der JavaCard muss diese bei jeder Entsperrung über NFC mit dem Gerät verbunden werden.&lt;br /&gt;
Da der HMAC-Schlüssel nicht exportierbar ist,&lt;br /&gt;
ist eine Entschlüsselung der Datenbank im Falle des Verlusts der Karte&lt;br /&gt;
oder einer Neuinstallation des Applets praktisch nicht mehr möglich.&lt;br /&gt;
&lt;br /&gt;
== Signaturerstellung auf der JavaCard ==&lt;br /&gt;
&lt;br /&gt;
Das nächste Ziel bestand darin,&lt;br /&gt;
kryptografische Operationen,&lt;br /&gt;
die bei der Nutzung von Credentials in Software durchgeführt werden,&lt;br /&gt;
auf der JavaCard auszuführen.&lt;br /&gt;
Der Fokus lag hierbei auf Passkeys.&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung eines Passkeys wird ein Schlüsselpaar generiert.&lt;br /&gt;
Als Signaturalgorithmus wurde ECDSA-SHA-256 gewählt,&lt;br /&gt;
da die JavaCard ML-DSA und EdDSA nicht unterstützt.&lt;br /&gt;
Webauthn.io priorisiert die Algorithmen in der Reihenfolge ML-DSA, EdDSA, ECDSA-SHA-256 und RSA-Signaturen.&lt;br /&gt;
&amp;lt;ref&amp;gt;https://github.com/duo-labs/webauthn.io/blob/b35f262688149b95cade28c2ec8d1d1c7190decd/_app/homepage/services/registration.py#L79-L112&lt;br /&gt;
abgerufen am 17.05.2026&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das JavaCard-Applet wurde um eine Instruktion zur Generierung eines ECDSA-Schlüsselpaars erweitert.&lt;br /&gt;
Vor der Rückgabe wird der private Schlüssel auf der Karte mit AES-256-CBC verschlüsselt.&lt;br /&gt;
Der Initialisierungsvektor (IV) wird zufällig gewählt.&lt;br /&gt;
Anschließend wird über IV und Ciphertext ein HMAC berechnet.&lt;br /&gt;
Die Antwort der Instruktion umfasst den öffentlichen Schlüssel im Klartext, den IV, den privaten Schlüssel als Ciphertext, sowie den HMAC.&lt;br /&gt;
Der AES-256-Schlüssel wird,&lt;br /&gt;
analog zum HMAC-Schlüssel,&lt;br /&gt;
bei der Installation des Applets zufällig generiert.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wurde eine Instruktion zur Signaturerstellung auf der JavaCard implementiert.&lt;br /&gt;
Da die Signaturschlüssel nicht auf der Karte gespeichert werden,&lt;br /&gt;
müssen der verschlüsselte private Schlüssel&lt;br /&gt;
(bestehend aus IV, Ciphertext und HMAC)&lt;br /&gt;
sowie die zu signierenden Daten auf die Karte übertragen werden.&lt;br /&gt;
Zunächst wird der HMAC verifiziert.&lt;br /&gt;
Bei erfolgreicher Verifikation wird der Signaturschlüssel entschlüsselt und die Daten signiert.&lt;br /&gt;
Die Signatur wird anschließend als Antwort zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Weigtvin</name></author>
	</entry>
</feed>