|
|
Implementierung Verschlüsselung im HIT-Protokoll für .NETIm Rahmen der Neuentwicklung des HIT-Webs mit ASP.NET (als "HIT3") wurde auch die Implementierung des HIT-Protokolls ("HITP") als solches aus dem ebenfalls mit ASP.NET implementierten "ZID2"-Web übernommen. Die dortige Implementierung der Verschlüsselung jedoch wurde durch ein größtenteils automatisiertes Verfahren aus dem Java-Code erzeugt und war daher mäßig performant. Für "HIT3" wurden daher die Verschlüsselungsverfahren nativ in C# (basierend auf der Java-Logik) implementiert.
TODO - Dokument und .NET-Assembly sind
out-of-date!!
Die Verschlüsselung in der Kommunikation mit HIT läuft über zwei Ebenen:
Mehr Details dazu hier. Ein verschlüsselter Datenaustausch erfordert eine erfolgreiche verschlüsselte Anmeldung an HIT. Umgekehrt jedoch erfordert eine erfolgreiche verschlüsselte Anmeldung nicht zwingend einen verschlüsselten Datenaustausch, ist aber zu empfehlen! Nur mit verschlüsseltem Datenaustausch: war eine verschlüsselte Anmeldung erfolgreich, dann bleibt die Verschlüsselung bis zur nächsten neuen verschlüsselten Anmeldung oder zum expliziten Abmelden aktiv - sowohl für HITP-Befehle als auch für HITP-Antworten. Eine nicht erfolgreiche Anmeldung aktiviert keine Verschlüsselung, d.h. es können dann (ausser einer neuen Anmeldung) nur unverschlüsselte Befehle gesendet und unverschlüsselte Antworten erhalten werden. In den folgenden Beispielen werden C#-Codestücke, HIT-Befehle und -Antworten aus
optischen Gründen teilweise mehrzeilig angezeigt. VerwendungDas Assembly ist so ausgelegt, dass sie bereits zum Versand fertig vorliegende Befehle, die an HIT-Server gesendet werden sollen, verschlüsseln und umgekehrt die vom HIT-Server erhaltenen verschlüsselten Antworten entschlüsseln kann. Das Erzeugen der HIT-Befehle und Auswerten der HIT-Antworten ist somit der eigentlichen Anwendung vorbehalten, die die Assembly nutzt. Nach dem Einbinden der Assembly in ein eigenes Projekt in eigenen C#-Programmen dessen Namespace einbinden: using HIT3.Secure; HexstringsDa mit Bytes in einem text-basieren Datenaustauschprotokoll nicht
gearbeitet werden kann, werden binäre Daten im HIT-Protokoll als
Hexstrings aufgefasst. Ein Byte (8 bit) wird in sein entsprechendes
hexadezimales Äquivalent in Form einer 2-stelligen Zeichenkette mit dem
Zeichensatz Das Assembly bietet zwei Hilfsfunktionen, um in beide Richtungen wandeln zu können: von Bytearray zu Hexstring und zurück. Beispiel: das Byte mit dem Wert 72 als Hexstring using HIT3.Secure; byte demo = 72; String hexstring = Helper.hexEncode(new byte[] { demo }); // das einzelne Byte in ein Bytearray verpacken Console.WriteLine(hexstring); Wird der Code ausgeführt, erhält man " Decodieren läuft ähnlich: using HIT3.Secure; String hexstring = "49485470"; byte[] demo = Helper.hexDecode(hexstring); Öffentlicher SchlüsselDer öffentliche Schlüssel für die asymmetrische Verschlüsselung ist hier veröffentlicht. Dieser kann in der Assembly als Bytearray oder als Hexstring vewendet werden: using HIT3.Secure; String pubkeyHex = "4801525001000...0003010001"; HitSecurityKey pubkey = new HitSecurityKey(pubkeyHex);
VerbindungsaufbauUnabhängig von unverschlüsseltem oder verschlüsseltem Datenaustausch müssen nach dem Verbindungsaufbau die Antworten als erstes gelesen werden. Nur wenn die Antworten keine Fehler anzeigen (erkennbar an <Schwere> in der Antwortstruktur), darf fortgesetzt werden. Anderenfalls ist zu einer anderen HIT-Serverinstanz zu verbinden. Die Antwortzeile mit dem <AntwortCode> (=Plausinummer) UTF-8Der HIT-Server kann inzwischen sowohl den Standard-Zeichensatz als
auch UTF-8 verstehen. Man sollte daher beim Anlegen eines Beispiel: using System.IO; using System.Text; Encoding UTF8_noBOM = new UTF8Encoding(false); // false = ohne BOM StreamReader in = new StreamReader(networkStream,UTF8_noBOM); StreamWriter out = new StreamWriter(networkStream,UTF8_noBOM); ( Ohne UTF-8 wäre dies lediglich: using System.IO; using System.Text; StreamReader in = new StreamReader(networkStream); StreamWriter out = new StreamWriter(networkStream); Wird UTF-8 verwendet, dann muss beim Anmelden die Spalte Asymmetrisch Verschlüsseln für AnmeldungFür die verschlüsselte Anmeldung sind beim Senden der Entität
Anlegen eines zufälligen byte[] sessKeyBytes = HitSecure.getRandomArray(48); String sessionKey = Helper.hexEncode(sessKeyBytes) Man erhält dann beispielsweise DF3D8AAFD57F6601A6700801B725112A869E6542027CAE690E7F5F3B82ED7C5A05D3C1B6B4EF0C4F300DD4E0ACD7D7C8 Genauso kann für BeispielAnmeldung unverschlüsselt: *1:XS:LOGON/BNR15;PIN;MELD_WG;CHA;MAXCERR;TIMEOUT: 09 199 000 0031;Aaaa$900000;3;0;0;1200 erweitert um Spalten für verschlüsselte Anmeldung ohne folgendem verschlüsselten Datenaustausch: *1:XS:LOGON/BNR15;PIN;MELD_WG;CHA;MAXCERR;TIMEOUT;SVR_HELO;RAND_CLI: 09 199 000 0031;Aaaa$900000;3;0;0;1200 ;HitServer bereit. Version 2600, 01.04.2019 00-00. Sie sind mit dem Testsystem T1B_HZ05 verbunden. Nur eingeschraenkt verfuegbar, da hier entwickelt wird. (Server benutzt neue Betriebstabellen/NEWADS) HI-Tierzeit 11.04.2019, 13-19-38h Challenge -2251982346156064082 ;164FD11B482B793CAC1243ED076F731D73A34DB182329EF794C82E8590625B35F16BF3D89A84DA72DC1911ECC53A44B5 erweitert um
Spalten für verschlüsselte Anmeldung mit folgendem verschlüsselten Datenaustausch
(Spalte *1:XS:LOGON/BNR15;PIN;MELD_WG;CHA;MAXCERR;TIMEOUT;SVR_HELO;SESS_KEY;RAND_CLI;ENC_SYM: 09 199 000 0031;Aaaa$900000;3;0;0;1200 ;HitServer bereit. Version 2600, 01.04.2019 00-00. Sie sind mit dem Testsystem T1B_HZ05 verbunden. Nur eingeschraenkt verfuegbar, da hier entwickelt wird. (Server benutzt neue Betriebstabellen/NEWADS) HI-Tierzeit 11.04.2019, 13-19-38h Challenge -2251982346156064082 ;DF3D8AAFD57F6601A6700801B725112A869E6542027CAE690E7F5F3B82ED7C5A05D3C1B6B4EF0C4F300DD4E0ACD7D7C8 ;164FD11B482B793CAC1243ED076F731D73A34DB182329EF794C82E8590625B35F16BF3D89A84DA72DC1911ECC53A44B5;2 Abschließend wird asymmetrisch verschlüsselt und dem erhaltenen Hexstring ein
using HIT3.Secure; String request = "*1:XS:LOGON/BNR15;....11ECC53A44B5;2"; // kompletter String vom Absatz vorher request = HitSecure.encodeAsymmetric(request,false,pubkey,true);
Das erhaltene $0202002AC0888754C9E5062134D155...000D2E40BB0C79E8B028647971DA56 (ist inklusive Die gesamte Zeile kann jetzt (abgeschlossen mit CRLF) als Zeichenkette über die bestehende Socket-Verbindung an HIT gesendet werden. Hat man die Spalte Übrigens: Client-seitig müssen und können keine asymmetrisch verschlüsselten Zeichenketten decodiert werden, da für den Vorgang der private Schlüssel benötigt wird, den nur die Zentrale Datenbank besitzt. Symmetrisch ver- und entschlüsselnDie Antworten einer erfolgreichen verschlüsselten Anmeldung und folgende
Anfragen und Antworten sind symmetrisch verschlüsselt, wenn beim Verschlüsseln, z.B. die Abfrage von bestimmten using HIT3.Secure; String request = "*2:RS:CODES/CODESET;CODENR;CODE;CODETEXT:CODENR;BW;1;4;ORDER;1;2"; request = HitSecure.encodeSymmetric(request,false,sessionKey,2,true); Der Entschlüsseln vom HIT-Server erhaltene Antwortzeilen: using HIT3.Secure; String response; while ( (response = readline()) != null) { // wenn verschlüsselt, dann erst decodieren if (response.StartsWith("#")) { response = HitSecure.decodeSymmetric(response.Substring(1),sessionKey,false); // true, wenn UTF8 beim LOGON verwendet wurde } // entschlüsselte Antwort auswerten HitAntwort antwort = HitAntwort.parse(response); // wenn Antwort nicht die letzte, dann lies nächste Zeile von HIT if (antwort == null) { // es war keine HitAntwort oder entschlüsseln schlug fehl throw new IOException(); } else if (antwort.IstLetzteAntwort) { // es ist die letzte, also Lesen abbrechen break; } // nächste lesen } Eine verschlüsselte HIT-Antwort beginnt mit einem
Aus einer #4C2BE5296EC91A8F1B2BADC9FD1462...14E77FE4B0715582DE23D82D6F7AE7 würde dann beispielsweise =2%1652:1/121:CODES:Anzahl Datenzeilen - 1651;Select CODESET,...;Dauer=0.242[Sek.] decodiert. Da die Antwort die letzte in einer Reihe ist (erkennbar am
Kurz & bündigRelevante Konstruktoren und Methodenaufrufe in der Assembly Bytes & Strings:
Schlüssel (für symmetrisch und asymmetrisch gleichermaßen):
Asymmetrisch verschlüsseln: (Achtung: Aufrufsignatur geändert für den unten angebotenen Download!)
Symmetrisch ver- und entschlüsseln (Achtung: Aufrufsignaturen geändert für den unten angebotenen Download!)
DownloadAssembly mit VisualStudio-XML-Dokumentation: 20220614_HitSecureLib.zip für .NET 4 und höher Es wird trotz ausgiebiger Tests und Einsatz in
unserer eigenen Webanwendung keinerlei Gewähr auf Richtigkeit der
Funktionalität Der Sourcecode in Java, auf dem dieses Assembly basiert, kann
aus der HitUpros-Bibliothek entnommen werden, |