Metadatensatz erstellen
Für jede Einreichung müssen sendende Systeme einen Metadatensatz erstellen und beim Versenden der Einreichung an FIT-Connect übermitteln. Der Metadatensatz wird dabei wie auch die Fachdaten Ende-zu-Ende-verschlüsselt, sodass FIT-Connect keinen Einblick in die enthaltenen Metadaten erhält.
Im Abschnitt contentStructure
des Metadatensatzes einer Einreichung wird die Struktur der Einreichung und deren Inhalte, wie Anhänge oder Fachdaten, beschrieben.
Der Metadatensatz enthält ebenfalls Hashwerte der übermittelten Fachdaten und Anlagen, um einen bösartigen Austausch von einzelnen Anlagen zu verhindern (siehe unten).
Zusätzlich können weitere Informationen über Verwaltungskund:innen hinterlegt werden.
Weitere Informationen finden sich im Grundlagen-Artikel zum Metadatensatz.
Eine genaue Definition und weitere Informationen sind in der Schema-Beschreibung zum Metadatensatz zu finden.
Sicherstellen der Integrität einer Submission
Es muss sichergestellt sein, dass Zwischensysteme, wie z. B. auch FIT-Connect selbst, Fachdaten oder Anhänge von Submissions nicht austauschen können. Hierfür wird eine Hashfunktion verwendet, welche die Integrität der Datensätze prüfbar macht. Die so berechneten Hashes werden vom sendenden System in den Metadaten verschlüsselt abgelegt und können bei Abruf vom empfangenden System validiert werden.
Nur wenn sowohl der Sender als auch der Subscriber Ihre Aufgaben übernehmen, ist die Integrität einer Submission sichergestellt. Wie diese Aufgaben für den Sender im Detail aussehen, wird im Folgenden beschrieben. Eine Beschreibung der Aufgaben des Subscribers findet sich im Artikel Einreichung überprüfen.
Aufgaben des Senders
Vor dem Versenden des Antrags muss der Sender sowohl für die Fachdaten als auch für jeden einzelnen Anhang den Hashwert berechnen. Starten wir mit den Fachdaten:
- Prüfen, ob Fachdaten vorhanden sind. Wenn nein, können die Schritte 2. und 3. übersprungen werden.
- Berechnen eines mit dem Metadatenschema kompatiblen Hashes (aktuell: SHA-512) der unverschlüsselten Fachdaten.
- Schreiben des Hashtyps sowie des Hashwertes in die Metadaten unter
contentStructure.data.hash
.
Nun zu den Anhängen:
- Prüfen, ob Anhänge vorhanden sind. Wenn nein, können die Schritte 2. und 3. übersprungen werden.
- Für jeden Anhang: Berechnen eines mit dem Metadatenschema kompatiblen Hashes (aktuell: SHA-512) der unverschlüsselten Anhänge.
- Für jeden Anhang: Schreiben des Hashtyps sowie des Hashwertes in die Metadaten unter
contentStructure.attachments.*.hash
.
- .NET (SDK)
- CLI
- Java
- Python
- .NET
Diese Funktionalität wird durch das .NET-SDK bereits intern umgesetzt
und ist durch einen Aufruf der folgenden Methoden der Klasse SendableSubmission
automatisch mit abgedeckt (siehe folgendes Beispiel).
Mit diesen Methoden erzeugen Sie eine sendbare Einreichung (sendable Submission):
var sendableSubmission = SendableSubmission.Builder()
.SetDestination(destinationId)
.SetServiceType(leikaKey, "FIT Connect Demo")
.SetJsonData("{\"message\":\"Hello World\"}")
.AddAttachments(new Attachment("./Attachments/Test.pdf", "Test Attachment"),
new Attachment("./Attachments/Test.pdf", "Test Attachment #2"),
new Attachment(null, "Json Text Attachment", MediaTypeNames.Application.Json,
Encoding.UTF8.GetBytes("{\"message\":\"Hello World\"}"))
)
.SetAuthenticationInformation(new AuthenticationInformation("12345",
AuthenticationInformationType.IdentificationReport, "1.3.5"))
.SetPaymentInformation(new PaymentInformation(PaymentMethod.Creditcard,
PaymentStatus.Booked, "12345445", "2345566"))
.SetReplyChannel(
new ReplyChannel {
DeMail = new DeMail(address: "klaus.fischer@trash.de-mail.de")
})
.Build();
Der Quellcode oben ist ein Auszug aus dem Projekt ConsoleAppExample
,
das im Repository Codebeispiele - examples von FIT-Connect hinterlegt ist.
Eine Beschreibung des .NET-SDKs finden Sie im Hauptmenü unter "SDKs > .NET-SDK".
# Ohne Dateinamen am Ende
➜ sha512sum fachdaten.json | cut -d' ' -f1
92aae16fa71f045b482dafdfa12aed8dc502945444367e78600bb48df32d2b4be01e805c923cc8de11992616666cc80e9e133b73b1f234f8a27688a61ab065a9
Der vollständige Beispielcode kann im Beispielcoderepository unter /java/metadata-verifier
gefunden werden.
MetadataVerifier metadataVerifier = new MetadataVerifier();
byte[] exampleFileContent = MetadataVerifier.class.getResourceAsStream("/example.pdf").readAllBytes();
// Sender: create hash of data (Fachdaten) or attachments (Anhänge) for Metadata
byte[] hash = metadataVerifier.createHash(exampleFileContent);
String hexHash = MetadataVerifier.toHexString(hash); // Optional
System.out.printf("Sender: {\"type\": \"sha512\", \"content\": \"%s\"}\n", hexHash);
Der vollständige Beispielcode kann im Beispielcoderepository unter /python/metadata-verifier
gefunden werden.
import hashlib
import json
def create_hash(data: bytes):
return hashlib.sha512(data)
def sender(example_pdf):
with open(example_pdf, "rb") as file_to_send:
file_to_send_bytes = file_to_send.read()
file_to_send_hash = create_hash(file_to_send_bytes)
print(
json.dumps(
{"type": "sha512", "content": file_to_send_hash.hexdigest()}, indent=4
)
)
Der vollständige Beispielcode kann im Beispielcoderepository unter /dotnet/metadata-verifier
gefunden werden.
using System;
using System.Security.Cryptography;
using System.Reflection;
using System.Text.Json;
using (Stream? inputData = Assembly.GetExecutingAssembly().GetManifestResourceStream("example.pdf"))
{
if (inputData == null)
{
Console.Error.WriteLine("Error reading file from assembly.");
return;
}
using (var hashFunction = SHA512.Create())
{
byte[] hash = hashFunction.ComputeHash(inputData);
String hashAsString = BitConverter.ToString(hash)
.Replace("-", "")
.ToLowerInvariant();
Console.WriteLine("Sender: " + JsonSerializer.Serialize(new
{
type = "sha512",
content = hashAsString
}, new JsonSerializerOptions { WriteIndented = true }));
}
}