Datensicherheit
Dr.wait verwendet drei Prinzipien, um einen klaren Umgang mit Daten im digitalen Wartezimmer zu ermöglichen. Zusätzlich zur Datensparsamkeit, Datenkurzlebigkeit und Transparenz, schafft Dr.wait eine zusätzliche Ebene an Sicherheit mit einer Ende-zu-Ende-Verschlüsselung der persönlichen Daten. So funktioniert die Verschlüsselung im Detail:
Asymmetrische Verschlüsselung
Ein asymmetrisches Verschlüsselungsverfahren bedeutet im Wesentlichen, dass mit zwei Schlüsseln gearbeitet wird: Ein öffentlicher Schlüssel, um Daten zu verschlüsseln und ein privater Schlüssel, um die verschlüsselten Daten wieder zu entschlüsseln. Ein öffentlicher Schlüssel kann z.B. so aussehen:
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAs0m0fODsKjU/LRzRc1To
WIsxBSfhplEMptf7uSBpUd8Mxtr65Mdtp/Bn1a7M9XoSZ34K0nALFkFSn5T6Vqj3
bpJ2aX3hkk55OhHFo1lFge5hKqwd8PEZUs8aTUuPgZLnMO81MrRV5Msua6/0oRBR
tXlGRauLprewKMneg51kM3U/D4W7Aq8kmLY+n3fJPHwXLOfuKs06Ze7F+WNwBzcT
omDrzpPDhoUMwhvFwDvveS93W0pD7FfudjgNV5olp3q9KWc6OBbPAs2lqja7ZfOo
Hkr93F5sNWMhBJDomGHvQtw72cMgKHXBdLoE31t1J4pWpmWzylTyFcbZuz83YjJs
llf4rETxaRlr9N6EDnF69PLa2KRCiYF9mvUfMXfRQy30GvaP8f+qah5Vdz3H5kxr
2Mwk4NUEdHGbkXwwfpki7kjTy2RvITbj8qsP61v6UMdenGdBLCjzIUI1cCHO2qLs
wA1XI4VbLAXZQTCKiywE6/kcOdS6alyWqUUVz2NKZNQeVafa31zUdKUIKdDAUYEI
luvFyJcoqSpl8gCRz4KbOna9m5HnkUO1ozlJgbMRcwsiBuZnut5O3sECdh54qXve
WLdrPxU20j32ZYOy9gz3iWjO3WN7BEG9X+z8Ec34pbtAaZ1gqd+eRCNZjirZYbwn
7JgdbPRRQIZfevXNujoqGPMCAwEAAQ==
-----END PUBLIC KEY-----
Als Gegenstück zum öffentlichen Schlüssel wird ein privater Schlüssel generiert. Der private Schlüssel verbleibt ausschließlich bei der Praxis und wird niemals an Dr.wait-Server übertragen.
Das Schlüsselpaar wird nach der erstmaligen Einrichtung auf dem Rechner der Arztpraxis generiert:
const keyPair = await window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["encrypt", "decrypt"]
)
Key-Wrapping
Um den privaten Schlüssel nicht in Klartext in der Datenbank zu speichern, passiert noch ein wichtiger Schritt: Der private Schlüssel wird mit einem zusätzlichen geheimen Key ummantelt und encodiert. Dieser zusätzlicher Schlüssel wird aus einem - nur der Praxis bekannten - Passwort abgeleitet:
const wrapCryptoKey = async (keyToWrap, password) => {
const salt = window.crypto.getRandomValues(new Uint8Array(16))
const ivWrap = window.crypto.getRandomValues(new Uint8Array(12))
const { iv, wrappingKey } = await getKey(salt, password)
const exportablePrivateKey = await window.crypto.subtle.wrapKey(
"jwk",
keyToWrap,
wrappingKey,
{
name: "AES-GCM",
iv: ivWrap,
}
)
return { exportablePrivateKey, iv, ivWrap, salt }
}
const getKey = async (salt, password) => {
const enc = new TextEncoder()
const keyMaterial = await window.crypto.subtle.importKey(
"raw",
enc.encode(password),
{ name: "PBKDF2" },
false,
["deriveBits", "deriveKey"]
)
const iv = window.crypto.getRandomValues(new Uint8Array(12))
const key = await window.crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt: salt,
iterations: 100000,
hash: "SHA-256",
},
keyMaterial,
{
name: "AES-GCM",
iv: iv,
length: 256,
},
true,
["wrapKey", "unwrapKey"]
)
return { wrappingKey: key, iv, salt }
}
Der private Schlüssel, ummantelt mit dem Passwort, wird nun für die Praxis in der Datenbank gespeichert und kann von allen Praxismitarbeitern aufgerufen werden.
Wie werden die Daten jetzt verschlüsselt?
Zurück zu den Daten. Bei Dr.wait werden die Patientendaten also mit dem öffentlichen Schlüssel der Praxis bereits auf dem Smartphone in der Patienten-App verschlüsselt. Das sieht ungefähr so aus:
const encryptData = async (str, publicKey) => {
let enc = new TextEncoder()
const encoded = enc.encode(str)
const encrypted = await window.crypto.subtle.encrypt(
{
name: "RSA-OAEP",
hash: "SHA-256",
},
publicKey,
encoded
)
return btoa(String.fromCharCode(...new Uint8Array(encrypted)))
}
const publicKey = "-----BEGIN PUBLIC KEY-----..." // See above for full public key.
const encryptedName = encryptData("Joe Duncan", publicKey)
Nach dem erfolgreichen Verschlüsseln werden die Patientendaten aus der App zu den Servern von Dr.wait geschickt und in der Datenbank gespeichert.
Auf den Computern der Praxis werden nach erfolgreicher Authentifizierung der Praxismitarbeiter, die gesamte Warteschlange samt verschlüsselter Daten geladen. Um die Daten zu entschlüsseln, wird der private Schlüssel (mit einem Passwort ummantelt) aus der Datenbank geladen und nach Eingabe des Passworts durch die Praxis dekodiert.
Die Ebenen der Sicherheit
Das asymmetrische Verschlüsselungsverfahren schafft im Zusammenspiel mit Key-Wrapping eine gute zusätzliche Ebene an Datensicherheit. Das hilft natürlich auch nur, wenn die Sicherheit in anderen Bereichen wie Datenbankzugriff, Serververwaltung und Datenübertragung auch beachtet wird.