Die Software SQLite ist eine verbreitete Programmbibliothek. Sie bietet die vollständige Laufzeitumgebung für eine SQL-basierte Datenbank. Die Besonderheit ist, dass sie den Datenbestand in einer einzelnen Datei vorhält. Zudem ist sie mit der Abfragesprache SQL kompatibel. Die Software ist gemeinfrei, also frei von Urheberrechten. SQLite ist in allen gängigen Betriebssystemen implementiert.

Geschichte und Herkunft

SQLite wurde im Jahr 2000 durch D. Richard Hipp im Rahmen seiner Tätigkeit für die amerikanische Firma General Dynamics entwickelt. Dies geschah im Auftrag der Marine des US-Militärs. Zunächst handelte es sich um eine Erweiterung der Skriptsprache Tcl. Inzwischen wird SQLite von zahlreichen Programmier- und Skriptsprachen unterstützt.

Der Name setzt sich aus der Abkürzung für die Abfragesprache Structured Query Language (SQL) und der umgangssprachlichen Bezeichnung Lite, für eine „abgespeckte“ Version, zusammen. Aktuell wird das Projekt SQLite von D. Richard Hipp und zwei weiteren Entwicklern fortgeführt.

Obwohl SQLite lizenzfrei angeboten wird, ist es möglich, kostenpflichtigen Support und Erweiterungen bei den Entwicklern zu erwerben.

Details zur Funktionsweise

Die SQLite-Bibliothek ist in Desktop Betriebssystemen wie Windows, MacOS und den Linux-Distributionen enthalten. Auch die verbreiteten Smartphone-Betriebssysteme Android und iOS unterstützen SQLite nativ.

Die gesamte Anwendung läuft in einem Prozess. Anders als bei anderen Datenbanksystemen, wie MySQL, ist keine Server-Client-Architektur nötig.

SQLite verwendet eine relationale Datenbank. Die Daten werden in Tabellen abgelegt, die spaltenweise über einen Identifier angesprochen werden können. Dies hat den Vorteil, dass Daten nicht redundant vorgehalten werden müssen. Vielmehr können die Inhalte einer Tabelle mit einer oder mehreren Spalten anderer Tabellen verknüpft, also in Relation gesetzt werden.

So ist es typisch für eine Speicherung in relationalen Datenbanken, dass Daten je nach Zweck in unterschiedlichen Tabellen abgelegt werden. Eine Mail-Software könnte beispielsweise folgende Tabellen in ihrer Datenbank führen:

-Kontakte: Enthält die Mailadressen der Kommunikationspartner,

-Konversation: Speichert den Mailverlauf mit einem Gesprächspartner,

-Mails: Beinhaltet die Metadaten einzelner Mails,

-Attachments: Weist Metadaten und Pfade von Anlagen auf.

Anstatt nun in jeder Spalte der Tabelle „Mails“ die Adressen der Absender und Empfänger aufzuführen, wird dort nur die Ordnungsnummer des Kontakts abgelegt. Entsprechend erfolgt die Zuordnung der Anlagen und die Zuordnung einer einzelnen Mail zu einer Konversation.

Datentypen unter SQLite

Daten können in verschiedenen Formaten abgelegt werden. Dies erleichtert die Weiterverarbeitung ohne vorherige Konvertierung. Mögliche Datentypen sind: Null (Nullwert), Integer (Zahlenwert), Real (Fließkommazahl), Text (Klartextlicher Inhalt) und Blob (Binärwert).

Hiermit sind alle Datentypen abbildbar. So werden Datumswerte häufig als Zahlenwert, etwa im Format Unix-Time (Sekunden seit dem 01.01.1970), abgelegt. Alternativ findet sich auch eine Notierung im klartextlichen Datumsformat.

Sehr universell wird der Datentyp Blob (Binary Large Object) eingesetzt. Es können beispielsweise Vorschaubilder darin abgelegt werden. Ebenso finden sich aber auch Konfigurationsdateien, etwa im XML- oder PLIST-Format, in Blob-Datenfeldern.

Datensicherheit und temporäre Dateien

SQLite beherrscht zwei Methoden zur Gewährleistung der Konsistenz einer Datenbank.

Eine Möglichkeit ist das Führen eines Rollback-Journals. Hier wird beim Öffnen der Datenbank ein temporäres Journal erstellt. Dies erhält den Namen der Datenbank mit der Endung „-journal“. In der Datei werden die vorgenommenen Änderungen dokumentiert. So kann beim Auftreten von Problemen eine Wiederherstellung (Rollback) erfolgen.

Die andere Alternative ist die Nutzung des Write-Ahead-Logs (WAL). Bei dieser Methode werden Änderungen zunächst in die Logdatei geschrieben. Die permanente Übernahme in die Datenbank erfolgt beim ordnungsgemäßen Schließen der Datenbank oder durch manuelle Speicherung mit einem Commit-Befehl.

Zudem wird in diesem Fall ein Index in der „Shared-Memory“-Datei (SHM) geführt.

Entsprechend werden bei dieser Methode zwei temporäre Dateien angelegt. Diese erhalten den Namen der Datenbank mit den Endungen „-shm“ und „-wal“.

Schnittmengen mit SQL

Die Verarbeitung der Inhalte in SQLite-Datenbanken erfolgt mittels der Abfragesprache nach dem SQL-92 Standard. Hierdurch ist gewährleistet, dass SQL-Befehle und Abfragen angewendet werden können.

Die Speicherung eines Kontaktes könnte beispielsweise durch einen Befehl nach dem Muster

INSERT INTO kontakte (lfd_nr, name, vorname, mailadresse, rufnummer) VALUES (1, „Mustermann“, „Max“, „mustermann@muster.xyz“, „0123/45678“)

erfolgen. Hierdurch würden in der Tabelle „kontakte“ in die Spalten innerhalb der ersten Klammer die Werte aus der zweiten Klammer eingetragen.

Inhalte aus verschiedenen Tabellen können durch den Befehl JOIN kombiniert werden. Zudem ist es möglich, die Ausgaben beispielsweise durch Befehle wie WHERE und LIKE an Bedingungen zu knüpfen.

Anwendungsgebiete von SQLite

Inzwischen findet man SQLite-Datenbanken als Unterbau vieler Anwendungen. Gängige Apps auf Smartphones, zum Beispiel Messenger wie WhatsApp und Facebook, legen ihre Daten darin ab. Ebenso Browser wie Firefox und Chrome auf Desktop-PC.

Auch kommerzielle Programme nutzen SQLite. Dies bietet sich für verteilte Anwendungen an. Es muss nur die Datenbank für alle Anwender freigegeben sein. Hierdurch ist auch keine besondere Performanz mehr nötig und es ist gut möglich, diese auf virtuellen Servern bereitzustellen.

Ein solcher muss sich nicht notwendigerweise physikalisch im eigenen Netzwerk befinden. Zur Gewährleistung der Verfügbarkeit können sich hierfür extern gehostete Server anbieten.

Bei Microsoft SQL (MS-SQL) handelt es sich um ein relationales Datenbankmanagementsystem, welches von dem US-Konzern in den 90er-Jahren veröffentlicht wurde. SQL ist speziell für Anwendungen konzipiert, die in Unternehmen eingesetzt werden. Das Datenbankmanagementsystem orientiert sich an standardisierten SQL-Versionen und wird von Microsoft durch zusätzliche moderne Features ergänzt.

Die Geschichte von MS-SQL

Seinen Ursprung hat MS-SQL Ende der 80er-Jahre. SQL basiert auf einem von der Firma Sybase entwickelten Code. Im Rahmen einer Zusammenarbeit zwischen den Firmen Microsoft, Sybase und Ashton-Tate wurde die erste Version des Datenbankmanagementsystems für das Betriebssystem OS/2 veröffentlicht. Im Jahr 1992 erschient für OS/2 bereits die SQL-Version 4.2. Version 4.21 kam im Jahr 1993 auf den Markt und war erstmals mit Microsofts Windows NT kompatibel. Kurz darauf endete die Kooperation zwischen Microsoft und Sybase. Mittlerweile bieten beide Unternehmen eigene SQL-Server-Versionen an: Sybase unter der Bezeichnung Adaptive Server Enterprise (ASE) und Microsoft unter dem Namen Microsoft SQL Server.

Wozu wird MS-SQL benötigt?

Wenn ein Unternehmen zum Beispiel ein CRM– oder ERP-System im Einsatz hat, dann benötigt die Software eine Datenbankstruktur, um Daten jedweder Art speichern zu können. Nach wie vor ist es gängig, dass vor allem Puristen den Betrieb von Datenbank-Servern nach wie vor gerne auf physischer Hardware bewerkstelligen. Mittlerweile lassen allerdings ein Großteil aller Datenbank-Server auf virtuellen Servern problemlos betreiben.

Grundsätzlich lässt MS-SQL dadurch beschreiben, dass die sogenannte Abfragesprache einen standardisierten Zugriff auf Datenbanken gewährleistet. Sowohl MS-SQL als auch MySQL können auf fast alle Datenbanksysteme angewendet werden. Mit Hilfe von MS-SQL können Administratoren oder Datenbank-Entwickler Tabellen erstellen oder abfragen ersten. Die SQL-Befehle „Select“ sowie „Create“ sind in diesem Zusammenhang wohl die am meisten genutzt Abfrage-Befehle.

Vor diesem Hintergrund ist es nützlich zu wissen, dass die Abkürzung „SQL“ für Structured Query Language, übersetzt „strukturierte Abfrage-Sprache“, steht. MS-SQL ist eine Abfragesprache für relationale Datenbanken, um etwa Tabellen zu definieren und Daten zu bearbeiten oder abzufragen. Häufige genutzte Daten von Unternehmen sind hierbei unter anderem Material- und Kundendaten, Rechnungen sowie Unterlagen für erhaltene Aufträge.

Redundanzen verhindern

MS-SQL ist für relationale Datenbanken entwickelt. Die dort hinterlegten Informationen sind üblicherweise auf viele verschiedene Tabellen verteilt. Dass Felder bzw. Informationen „doppelt“ vorkommen, ist nicht vorgesehen, wenn die Idee des relationalen Datenbankmodells eingehalten werden soll. Um Redundanzen (Doppelte Einträge) zu vermeiden, müssen alle notwendigen Informationen auf mehrere Tabellen verteilt und durch einen Schlüssel miteinander verknüpft werden. Diese essentiell wichtige Schlüssel wird auch als primärer Schlüssel bezeichnet und bildet das Fundament für eine relationale Datenbank auf Basis von MS-SQL.

MS-SQL geht mit der Zeit

MS-SQL hat eine lange Entstehungsgeschichte und konnte sich über alle die Jahre hinweg gegenüber etwaige Konkurrenzprodukte stets behaupten. Dafür sind vor allem permanente Weiterentwicklungen verantwortlich, welche sich dem jeweils aktuellen Stand der Technik angepasst haben und für den Einsatz im Unternehmen einen Mehrwert mit sich gebracht haben.

Aktuelle MS-SQL-Versionen sind überaus leistungsfähig und lassen sich problemlos im Big-Data-Umfeld sowie für komplexe Cloud-Lösungen einsetzen. Darüber hinaus ist die Realisierung von Datenbankmanagementsystemen für geschäftskritische sowie intelligente Anwendungen oder für hochskalierbare Hybrid-Datenbankplattformen im Bereich des Möglichen. Zum derzeitigen Leistungsspektrum von MS-SQL gehören unter anderem erweiterte Sicherheitsfeatures, In-Memory-Funktionen sowie Analysemöglichkeiten für große Datenbestände.

Auf der Basis von MS-SQL sind mittlerweile Apps verfügbar, welche Onlinetransaktionsverarbeitung (OLTP) mit einer sehr guten Skalierbarkeit und einer hohen Verfügbarkeit bereitstellen können. Umfassende Analysefunktionen stehen durch „R“, eine spezielle Statistiksprache, für SQL-Datenbanken zur Verfügung. Durch den Einsatz von „R“ ist selbst das Verschieben von Daten vollkommen überflüssig geworden. MS-SQL findet somit in Private Clouds, Public Clouds (zum Beispiel Microsoft Azure) oder in einem Rechenzentrum nach wie vor nützliche Verwendungen für die unterschiedlichsten Bereiche.

Überall dort, wo große Datenmengen in Netzwerken verarbeitet werden, ist eine leistungsfähige Datenbank notwendig. Sind eine Mehrbenutzerfähigkeit und hohe Performanz gefragt, wird diese oft durch SQL-Server realisiert. Hierbei handelt es sich um Software, die einen Dienst zur Speicherung, Bearbeitung und Abfrage von Datensätzen unterschiedlicher Art bietet.

Ein paar Details zu SQL-Servern

Allen SQL-Servern ist gemein, dass sie relationale Datenbanksysteme verwenden. Die zu speichernden Inhalte werden in zweckgebundene Tabellen abgelegt. Ziel ist, dass möglichst wenige Daten redundant gespeichert sind. Vielmehr werden diese mit Ordnungskriterien versehen und miteinander verknüpft, also in Relation gesetzt.

Dies bietet Vorteile bei der Verarbeitungsgeschwindigkeit und hält die Datenbank schlank. In einer Kundendatenbank könnten die Kontaktdaten beispielsweise in einer Tabelle verwaltet werden. Die Bestellungen hingegen würden in einer separaten Tabelle verwaltet und nur mit der Kennziffer des Kunden versehen. In gleicher Weise könnte es eine Tabelle für Rechnungen und Mahnungen geben. Für neue Einträge müssten nur die notwendigen Werte in der entsprechenden Tabelle erstellt werden.

Alle SQL-Server können mittels der namensgebenden Structured Query Language (SQL) angesprochen werden. Mittels der entsprechenden Syntax können Datensätze erstellt, verändert, gelöscht und abgefragt werden.

Ein einfacher Befehl zum Speichern eines Datensatzes lautet:

INSERT INTO Adressen (kundennr, nachname, vorname, strasse, plz, stadt) VALUES (1, „Mustermann“, „Max“, „Hauptstraße 1“ „12345“, „Musterstadt“).

Dieser speichert die Werte aus der zweiten Klammer in die Spalten der Tabelle „Adressen“. Die Namen der Spalten ergeben sich aus der ersten Klammer.

Die abgelegten Daten können unterschiedlicher Art sein. Wichtige Datentypen sind INTEGER (Ganzzahlen), FLOAT (Gleitkommazahl), CHAR (Zeichenketten), BOOLEAN (boolesche Wahrheitswerte) und BLOB (Binäre Werte, auch eingebettete Dateien wie Bilder sind möglich). Im Detail können die Datentypen bei unterschiedlichen Anbietern von SQL-Servern abweichen.

Die wichtigsten Anbieter von SQL-Servern

Es gibt mehrere Entwickler für SQL-Server. Darunter befinden sich kommerzielle aber auch kostenlose Anbieter. Die wichtigsten Anbieter sind die folgenden:

Oracle

Das älteste kommerzielle System ist der SQL-Server der Firma Oracle. Die erste Version erschien 1979. Bis zum heutigen Tag wird die Software weiterentwickelt. Je nach Art und Umfang des Einsatzes werden nicht unerhebliche Lizenzkosten fällig. Es handelt sich um einen der verbreitetsten SQL-Server, der Basis für viele kommerzielle Softwareprodukte ist.

Microsoft SQL-Server

Der SQL-Server von Microsoft ist das zweite kommerzielle System, welches zu den Marktführern zählt. Es wurde 1989 erstmals veröffentlicht und durch die Firma Sybase mitentwickelt. Anfangs gehörte es zum Betriebssystem OS/2 und wurde später für Windows NT portiert. Auch für den Einsatz dieses Systems sind Lizenzkosten zu entrichten. Bemerkenswert an Microsofts SQL-Server ist eine große Anzahl spezieller Datentypen. So sind zum Beispiel die Datentypen „smallmoney“ und „smalldatetime“ definiert.

MySQL / MariaDB

Das verbreitetste quelloffene Produkt ist der MySQL-Server. Dieser ist kostenlos für alle gängigen Betriebssysteme erhältlich. Zusätzlich wird ein kostenpflichtiges Enterprise-Paket angeboten, bei dem es zusätzlich Supportleistungen gibt. Erstmals vorgestellt wurde MySQL im Jahre 1995. Zunächst war die Firma „MySQL AB“ Entwickler. Das Unternehmen wurde später durch die Firma Sun aufgekauft. Inzwischen gehört MySQL zur Firma Oracle. MySQL hat eine hohe Verbreitung im Bereich von Webservern. Es ist in den Repositories der gängigen Linux-Distributionen enthalten. Daher können diese mit wenig Aufwand für den Einsatz eines MySQL-Servers eingesetzt werden.

Kurz nach der Übernahme von MySQL durch Oracle, spaltete sich im Jahr 2009 das Projekt MariaDB als Fork ab. Verantwortlich hierfür war Michael Widenius, der ehemalige Hauptentwickler von MySQL. Einige Linux-Distributionen setzen inzwischen als Standard auf MariaDB. Darunter Fedora, CentOS und openSUSE.

Weitere SQL-Varianten

PostgreSQL

Eine weitere quelloffene Alternative ist der PosgreSQL-Server. Dieser wurde 1996 veröffentlicht und wird von einer Entwicklergemeinschaft, der PostgreSQL Global Development Group, gepflegt. Eine Besonderheit ist, dass er eine objektrelationale Datenbank verwendet. Hierdurch können nicht nur Felder in Relation gesetzt werden, sondern Mengen von Datensätzen, die als Objekte zusammengefasst wurden. Deher kann unter PostgreSQL das Prinzip der Vererbung aus der objektorientierten Programmierung angewendet werden.

-SQL Anywhere

Das ebenfalls kommerzielle SQL Anywhere gehört zum in Deutschland ansässigen Unternehmen SAP. Dieses übernahm den ursprünglichen Entwickler Sybase im Jahr 2010 und entwickelt das Produkt weiter. Bemerkenswert ist, dass Sybase bereits für die Basis des Microsoft SQL-Server verantwortlich war.

Anwendungsgebiete für SQL-Server

Neben dem bereits erwähnten Einsatz im Bereich von Webanwendungen, nutzen häufig komplexe Anwendungen im Firmenumfeld SQL-Server. Ein Beispiel sind Softwareprodukte des Enterprise-Resource-Planning (ERP). Unter deren Entwicklern finden sich, nicht ganz zufällig, einige bereits aufgeführte Hersteller von SQL-Servern, wie Oracle, Microsoft und SAP.

Ebenso genutzt werden SQL-Server für Software auf dem Gebiet des Custom-Relationship-Managements (CRM). Hierbei geht es ebenfalls um die Erfassung und Verknüpfung vieler Datensätze, in diesem Fall zur Kundenpflege.

Aufgrund der besonderen Stellung eines SQL-Servers in Systemen, wird dieser häufig auf einem dedizierten Server betrieben. Hier kann Virtualisierung eine geeignete Lösung sein, da diese eine hohe Ausfallsicherheit und insbesondere Skalierbarkeit gewährleistet. Viele Hoster für virtuelle Server bieten kurzfristige Anpassbarkeit von Ressourcen. Hierdurch kann flexibel auf Belastungsspitzen reagiert werden.

Die sogenannte „Obfuskation“ bietet einen sehr guten Schutz gegen sämtliche Reverse Engineering-Techniken. Aktuelle Decompiler können relativ einfach den Quellcode aus einem kompilierten Code rekonstruieren. Der folgende Artikel erklärt, wie sich Code-Obfuskation in modernen OOP-Programmiersprachen realisieren lässt und warum dieses obfuscate Verfahren im Kontext des World Wide Web besonders wichtig ist.

Die Flexibilität moderner Programmiersprachen birgt Risiken

Es ist sehr einfach Klassendateien gängiger Programmiersprachen wie Java oder C# zurückentwickeln. Der kompilierte Code ist mit viele Informationen versehen, die auch im ursprünglichen Quellcode enthalten sind. Darüber hinaus bieten viele moderne Programmiersprachen ein hohes Maß an Flexibilität, um einen schnellen und vereinfachten Entwicklungsprozess zu ermöglichen. Obwohl diese Flexibilität zahlreiche Vorteile in verteilten Umgebungen bietet, birgt sie auch einige potenzielle Risiken, die sich Hacker und Exploit-Entwickler eventuell zunutze machen könnten.

Was versteht man unter Obfuskation?

Code-Obfuscate ist aktuell das beste Verfahren, um Code gegen Reverse Engineering- und Hacking-Techniken zu schützen. Durch das Obfuscate-Verfahren wird der kompilierte Code des Programms zwar kryptisch und unverständlich, funktioniert jedoch weiterhin einwandfrei nach dem ursprünglichen Quellcode. Obfuskation lässt sich sowohl manuell als auch durch den Einsatz spezieller Programme, den sogenannten „Obfuskatoren“, realisieren. Die Software ist so komplizierter zu dechiffrieren, was sie unempfindlicher gegen sämtliche Reengineering- und Exploit-Techniken macht. Durch Obfuskation wird aus einem bestimmten Satz von Klassendateien „K“ ein anderer Satz von Klassendateien „K*“. Ergebnis der Obfuskation ist, dass der Code für die beiden Klassendateien nicht mehr der gleiche ist. Als Beispiel dient uns der folgende Java-Quellcode:

class OriginalHey {

public OriginalHey() {

int number=99;

}

public String getHey(String helloname){

return helloname;

}

Nach dem Obfuscate-Verfahren werden in diesem Code alle Namen der Klasse geändert oder zerhackt und die Zeilennummern entfernt. Dadurch entsteht dann der folgende obfuskierte Code:

class x {

public static boolean x;

public x() {

int a=1;

}

public String x(String x){

return y;

}

An dem obigen Beispiel erkennen Sie, dass die OriginalHey-Klasse und ihre Methode durch das Obfuscate-Verfahren geändert wurden. Der Name der Methode „x“ ist nichtssagend und viel schwieriger zu verstehen als getHey(). Wenn Sie den Bytecode mit dem ursprünglichen Bytecode vergleichen, sehen Sie, dass sämtliche Zeilennummern und Zeilenumbrüche entfernt wurde. Dadurch erhalten Hacker und Exploit-Entwickler weniger Informationen, wodurch der Prozess des Reverse Engineerings wesentlich erschwert wird.

Typische Obfuskationstechniken

Neben dem Austauschen von Buchstaben bzw. Zahlen und dem Entfernen von Zeilennummern, gibt es auch noch eine Vielzahl anderer Tricks, die von den einzelnen Obfuskatoren eingesetzt werden, um Quellcode zu obfuskieren. Eine effektive Möglichkeit zur Verschleierung von Quellcode ist die Aneinanderreihung bedeutungsloser Zeichenketten. Bei diesem Obfuscate-Verfahren wird ein Symbol in der Klassendatei durch eine Zeichenkette ersetzt. Der Ersatz kann beispielsweise ein bestimmtes Schlüsselwort sein oder ein völlig bedeutungsloses Symbol, wie zum Beispiel „***“.

Eine andere Technik, die bei vielen Obfuskatoren implementiert wird, zielt auf bestimmte Decompiler ab, wie zum Beispiel JODE oder Mocha. Hier wird durch das sogenannte „Dependency Injection-Verfahren“ eine schlechte Anweisung absichtlich in den Code eingebaut. Beim normalen Einsatz macht der Code keinerlei Probleme. Möchte man den Code jedoch mit einem Decompiler analysieren, lässt die schlechte Anweisung den Decompiler abstürzen. Als Beispiel für eine solche schlechte Anweisung dient uns der folgende Java-Code:

Method void main(java.lang.String[])

0 new #5

3 invokespecial #15

6 return

Nach dem Obfuscate-Verfahren wird in diesem Code am Ende eine schlechte Anweisung „pop“ eingefügt:

Method void main(java.lang.String[])

0 new #5

3 invokespecial #15

6 return

7 pop

Die Funktion verfügt jetzt nach der Returnanweisung auch über eine Abhebungsanweisung. Eine Funktion kann nach ihrem Rücksprung jedoch nichts mehr bewirken, sodass die Abhebungsanweisung beim normalen Einsatz ignoriert wird. Möchte man den Code mit einem Decompiler inspizieren, bewirkt dies einen Absturz des Programms.

Die National Security Agency (NSA) ist ein Auslandsgeheimdienst der Vereinigten Staaten von Amerika. Seine Hauptaufgabe besteht in der Überwachung elektronischer Kommunikation ausländischer Geheimdienste und Militärs. Das bringt ihm, berechtigt oder nicht, einige Kritik ein. Wussten Sie aber, dass Entwicklung und Forschung im Bereich von Sicherheit und Verschlüsselung auch Aufgaben des Geheimdienstes sind? Quellcode der Behörde befindet sich beispielsweise in fast jedem Android-Mobiltelefon und auf nahezu jedem Linux-Server.

Geschichte und Entwicklung der NSA

Gegründet wurde der Vorläufer der NSA, die Army Security Agency (ASA) 1945 durch den damaligen Präsidenten Harry S. Truman. Sie war zunächst eine Unterabteilung des Verteidigungsministeriums. Hauptgrund der Gründung war in der Anfangszeit die Spionage gegen das Deutsche Reich. Später trug der beginnende Kalte Krieg mit der Sowjetunion zum Fortbestand und Ausbau der Abteilung bei.

Im Jahr 1952 ging die NSA aus der ASA hervor. Sie ist mittlerweile der größte Auslandsgeheimdienst der USA.

De NSA hat über die Jahre beträchtliche Verdienste an der Entwicklung von Sicherheitsstandards in Hard- und Software erworben. Zum Beispiel auf dem Feld der Kryptografie.

Aufgaben der NSA heute

Die Aufgaben der NSA sind gesetzlich festgelegt. Sie hat Informationen zu sammeln, die zum Schutz der nationalen Sicherheit benötigt werden. Die zweite Hauptaufgabe ist der Schutz vor Angriffen auf geheime Informationen der US-Regierung. Die NSA untersteht dem Verteidigungsministerium. Das Internet wiederum basiert auf einer Entwicklung des US-Militärs, dem APRANET. Daher war die Behörde von Anfang an in die Entwicklung von Sicherheitsstandards eingebunden. Sie hat sich im Laufe der Jahre maßgeblich an der Forschung im Bereich der Verschlüsselungstechnik beteiligt. Dies beschreibt zugleich auch das dritte große Aufgabenfeld der NSA.

Entwicklung von Verschlüsselung

Die verschlüsselte Übertragung von Daten wurde in den 1970er Jahren als Schutz vor unbefugtem Abhören etabliert. Die NSA arbeitete früh an der Entwicklung und Implementierung von Algorithmen mit.

Der Data Encryption Standard (DES) wurde ab 1977 durch die US-Regierung für die verschlüsselte Übertragung von Daten eingesetzt. Der symmetrische Verschlüsselungsalgorithmus war für lange Zeit erste Wahl, wenn im Internet Daten verschlüsselt versandt werden sollten. Erst in den 1990er Jahren äußerten Forscher vermehrt Sicherheitsbedenken. Die Entwicklung erfolgte durch die Firma IBM, die US-amerikanische Behörde NBS (National Bureau of Standards) und die NSA. Sie war auch in die Planung und Ausschreibung eingebunden.

Am Nachfolger von DES, dem Advanced Encryption Standard (AES), war der Geheimdienst dann nicht mehr beteiligt.

Entwicklung von Software

Im Open-Source-Bereich hat die NSA gemeinsam mit Red Hat-Linux die Kernel-Erweiterung SELinux entwickelt. Diese setzt das Prinzip der Mandatory Access Control (MAC) für Zugangsrechte um. Nach der ist jeglicher Zugriff verboten, es sei denn, er wird explizit erlaubt. Das System wurde in den Linux-Kernel integriert (ab Version 2.6). In das Smartphone-Betriebssystem Android fand es mit der Version 4.3 als SEAndroid Einzug.

Seit 2017 veröffentlicht die NSA zahlreiche Programme auf Github.com in einem eigenen Repository. Darunter befinden sich einige zum Aufspüren von Sicherheitslücken. Auch Programme zum Absichern der eigenen Kommunikation werden angeboten, beispielsweise das VPN-Tool goSecure.

Für Aufsehen sorgte das kostenfreie Angebot des mächtigen Reverse-Engineering-Frameworks Ghidra. Dieses wird von Fachleuten als ernstzunehmender Konkurrent für das bekannte „IDA Pro“ angesehen.

Für alle Programme ist der Quellcode öffentlich. Daher können sich Sicherheitsexperten weltweit daran beteiligen, sie auf ihre korrekte Funktionalität zu überprüfen.

Dies wurde für Ghidra intensiv betrieben. Dabei fanden Forscher einen gravierenden Fehler im Code. Es herrscht aber Einigkeit unter den Fachleuten, dass es sich um einen Bug und keine Hintertür handelt.

Engagement im Bereich IT-Sicherheit

Die Behörde überprüft und zertifiziert Verschlüsselungsalgorithmen. Sie arbeitet mit Entwicklern von Verschlüsselung zusammen, beispielsweise beim Protokoll RSA.

In der „NSA Suite B“ werden die getesteten Produkte veröffentlicht und in Sicherheitsstufen eingeteilt. Sie empfiehlt beispielsweise folgende Standards:

-Verschlüsselung: AES (Schlüssellänge 128/256 für „geheim“/“streng geheim“)

-Digitale Signatur: ECDSA (Schlüssellänge 256/384 für „geheim“/“streng geheim“)

-Schlüsseltausch: ECDH (Schlüssellänge 256/384 für „geheim“/“streng geheim“)

-Hashfunktion: SHA-2 (Schlüssellänge 256/384 für „geheim“/“streng geheim“)

Die NSA veröffentlicht zudem Schwachstellen und Möglichkeiten, sich davor zu schützen. Über die Plattform Github.com lässt sich der „Hardware-and-Firmware-Security-Guidance“ herunterladen. Dieser gibt Anleitungen, sein System auf Verwundbarkeiten („Vulnerabilities“) zu überprüfen. Möglichkeiten zum Patchen werden dort beschrieben.

Sponsoring durch die NSA

Auch im Bereich der Ausbildung und Förderung junger IT-Talente engagiert sich die NSA. Sie pflegt Kooperationen mit Schulen. Ausgewählte Universitäten sponsert sie als Center of Academic Excellence (CAE). Zudem beteiligt der Geheimdienst sich an der Ausschreibung von Preisen für Forschungsergebnisse von Wissenschaftlern und Ingenieuren.

 

Bei SHA256 handelt es sich um eine Variante der kryptologischen Hashfunktion Secure Hash Algorithm, in der Version 2. Hashfunktionen werden in der Informationstechnik vorrangig dazu benutzt, die Integrität von Daten zu garantieren. Sie eignen sich hierzu besonders, da der Ausgabewert beliebig langer Datensätze immer die gleiche, kompakte Größe hat. Die Änderung an nur einem Bit hingegen führt dazu, dass ein komplett anderer Hashwert entsteht. Dies hat zur Folge, dass kein Rückschluss auf Länge und Inhalte der übertragenen Daten möglich ist.

Ein paar Details zu Hashfunktionen wie SHA256

Eine Hashfunktion führt eine Berechnung mit den Bestandteilen des Inhalts durch. Ähnlich einer Prüfsumme. In der einfachsten Form könnte dies eine Quersummenberechnung sein. Diese könnte solange durchgeführt werden, bis das Ergebnis immer eine bestimmte Anzahl Stellen hat. Hierbei würde es, trotz unterschiedlicher Ausgangszahlen, massenhaft Überschneidungen beim Ergebnis geben. Diese nennt man Hash-Kollisionen. Daher ist eine derart simple Rechenoperation für diesen Zweck ungeeignet. Vielmehr verwendet man stattdessen komplexe Algorithmen. Neben der Anforderung, dass es zu keinen Kollisionen kommen darf, muss ein guter Hash-Algorithmus weitere Voraussetzungen erfüllen. Eine ist die Effizienz der Berechnung, eine weitere der Lawineneffekt. Hiermit ist gemeint, dass kleinste Veränderungen am Eingabewert größtmögliche Veränderungen am Ausgangswert verursachen sollen. Besonders wichtig ist die Unumkehrbarkeit. Es muss unmöglich sein, den Eingabewert anhand des Ausgabewerts zu errechnen. Man spricht hier von einem Einweg-Hash. Wesentlich ist zudem die Unkenntlichkeit der zugrunde liegenden Daten. Diese sind, nimmt man die Übersetzung des englischen Begriffs „to hash“ wörtlich, nach Durchführung der Berechnungen „zerhackt“.

Die Geschichte

Der SHA wurde in seiner ersten Fassung (SHA-0) vom National Institute of Standards and Technology (NIST) sowie der National Security Agency (NSA) entwickelt und 1993 vorgestellt. Aufgrund einer Schwäche im Algorithmus, wurde bereits 1995 der Nachfolger SHA-1 vorgestellt. Dieser wiederum gilt seit 2005 als nicht mehr sicher. Forschern war es gelungen, den Rechenaufwand zur Erzeugung von Kollisionen soweit zu reduzieren, dass eine Berechnung in einem endlichen Zeitraum möglich schien. Aus diesem Grund wurde SHA-2 entwickelt. Ihn gibt es in den Varianten SHA224, SHA256, SHA384 und SHA512. Die Ziffer beschreibt die Länge der Bitfolge in der Ausgabe. Die Darstellung erfolgt in der Regel allerdings in hexadezimaler Schreibweise. Dies ist kompakter und Veränderungen an der Ausgabe sind für den Menschen leichter erkennbar.

SHA-3 ist seit 2015 veröffentlicht, aber bislang noch nicht sehr verbreitet. Diesem liegt ein komplett anderer Algorithmus zur Berechnung zugrunde. SHA-2, mit ausreichender Ausgabelänge, kann allerdings nach wie vor als sicher angesehen werden.

Wie funktioniert SHA-2?

Der Eingangswert wird in gleichlange Elemente unterteilt. Diese nennt man Blöcke. Da ein Vielfaches der Blocklänge benötigt wird, ist es in der Regel notwendig, die Daten aufzufüllen, also zu expandieren. Der aufgefüllte Wert ist das Padding. Die Verarbeitung erfolgt danach blockweise. Es werden die Blöcke durchlaufen und dabei jeweils als Schlüssel für Zwischenberechnungen an den nachfolgend zu kodierenden Daten verwendet. Der Datensatz wird in 64 Runden (SHA224 und SHA256) oder 80 Runden (SHA384 und SHA512) durchlaufen. Das Ergebnis der letzten Berechnung ist der Ausgabewert, also der Hash.

Anwendungszwecke von SHA256

Der Hashwert einer Datei wird oftmals im Zusammenhang mit deren Download bereitgestellt. Hier ist SHA256 inzwischen eine der häufigsten Varianten. Der Nutzer kann nach dem vollständigen Download den Hashwert seiner Datei lokal berechnen und mit dem Wert auf der Anbieterseite abgleichen. Stimmt er überein, besteht eine absolute Sicherheit, dass die korrekte Datei fehlerfrei übertragen wurde. Man spricht in diesem Zusammenhang auch vom digitalen Fingerabdruck einer Datei. Zur Berechnung des Hashwertes können kostenlose Programme wie HashCalc verwendet werden.

Anwendung von Suchalgorithmen

Den im Vergleich zum Inhalt um ein Vielfaches kürzeren Fingerabdruck kann man auch zur Indexierung von Dateien, beispielsweise in Datenbanken, nutzen. Hier ist es oft üblich, dass Metadaten wie Dateinamen und Pfad, getrennt vom eigentlichen Inhalt gespeichert werden. Zum einen muss dann nicht nach dem gesamten Inhalt gesucht werden. Zum anderen können die entstandenen Hashwerte der Dateien sortiert werden, was die Anwendung von Suchalgorithmen erleichtert.

In ähnlicher Weise kann SHA256 bei digitalen Zertifikaten zur Anwendung kommen. So findet das Verfahren bei der Erstellung von TLS/SSL-Zertifikaten Anwendung. Weiterhin wird es für die Signaturerstellung bei den Verschlüsselungsverfahren S/MIME und PGP genutzt. Auch IPSec, das Protokoll zum Aufbau einer sicheren Internetverbindung, nutzt SHA256 zur Authentifizierung im Zusammenhang mit dem Verfahren HMAC (Keyed-Hash Message Authentication Code).

SHA256 bei der Erstellung von Blockchains

Zudem kann SHA256 Bestandteil der Erstellung von Blockchains sein. Dieses Prinzip ist vor allem im Zuge der Verbreitung von Bitcoins bekannt geworden. Es ist aber auch auf andere Bereiche übertragbar. Verwendet man einen sicheren Hash-Algorithmus, ist es möglich, Transaktionen dezentral zu verwalten. Jede Transaktion besteht aus einer Kopfzeile (Header) und einem Datenteil und wird in einem Block festgehalten. Diese Blöcke werden nun untrennbar miteinander verbunden. Im Header einer Transaktion werden der SHA256-Hashwert des vorhergehenden Headers und des eigenen Datenteils festgehalten. Nach Beendigung der Transaktion wird die Blockchain wieder auf mehrere redundante Speicherorte (Knoten) hochgeladen. Eine Manipulation ist somit ausgeschlossen. Wird eine Transaktion entfernt oder verändert, stimmen die Hashwerte der folgenden Transaktionen nicht mehr. Zudem ist jedes beteiligte System in der Lage, die Integrität der Blockchain anhand der Hashwerte zu berechnen.