Suchen
Inside Wiki
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard Kryptographie

 

Inhalte

Kurze Einführung


Unter Kryptographie versteht man die Verschlüsselung von Daten (Chiffrierung) und alle damit verwandten Begriffe.

Durch mathematische Funkionen kann diese für folgende Bereiche eingesetzt werden:
  1. Zugriffsschutz: Die Daten sollen nur von vertrauten Personen gelesen werden könnnen.
  2. Änderungsschutz: Eine Veränderung der Daten soll nachweisbar sein.
  3. Fälschungsschutz: Eine Manipulation der Daten soll ersichtlich sein.
  4. Nachweisbarkeit: Der Urheber von Daten soll nicht abstreitbar sein.

Nicht alle Verschlüsselungsmethoden sind für alle Bereiche geeignet. Es gilt daher noch weiter zu unterscheiden zwischen
  • Hashes
  • Symmetrische Schlüssel
  • und Asymmetrische Schlüssel.

Jede Methode hat jedoch einen charakteristische Eigenschaft: Der erzeugte Wert ist immer gleich dem Ausgangsprodukt, jede Methode erzeugt immer den gleichen Wert auf jedem beliebigen Rechner, der diese Methode unterstützt.

Verschlüsselungsmethoden


Hashes

Ein Hash (to hash; engl. zerhacken) ist eine durch einen Algorithmus veränderte Zeichenfolge, deren ursprüngliche Original-Darstellung aus dem erzeugtem Hash nicht mehr reproduzierbar ist.

Der verwendete Algorithmus erscheint aber mit etwas Basiswissen gar keinen so komplexen Aufbau zu haben, idR. lässt sich dieser sogar leicht nachbilden. Dies lässt sich darauf zurück führen, dass man im allgemeinen darauf achtet, keine schwerfälligen Algorithmen zu verwenden, da diese Zeit beanspruchen.

Dennoch sind diese so genial verfasst, dass kleinste Änderungen am Ausgangsprodukt - ja sogar das Verändern eines einzigen Zeichens - völlig andere Ergebnisse produziert:

PHP Quellcode:
echo md5("Das ist ein Test");
echo md5("Das ist ein test");
/* Ausgabe:
b112c76d02b5832e8d83b74c102e0ca5
d0934cbedbf90a2d517f7780c7f4f87f
*/


Nicht ohne Grund: Mit Hilfe von Hash-Methoden soll in erster Linie Veränderungen an den Daten sichtbar werden. Man befürchtet hier keine Manipulation derer, sondern falsche Daten durch fehlerhafte Übertragungen. So kann man leicht feststellen, ob die Daten erfolgreich übermittelt wurden.

Da man aus dem Hash keinen Schlüsse auf die Ausgangsdaten ziehen kann, eignen sich diese Methoden um Hashes von Passwörtern in unsichere Umgebungen zu speichern. Man vertritt hier die Überlegung, dass nur das original Passwort den gleichen Hash erzeugen kann.

Das trifft aber nur teilweise zu. Da diese Methoden immer einen Wert gleicher Länge zurückgeben, liegt die Überlegung nahe, dass nicht alle Daten immer unterschiedliche Werte erzeugen können. In der Tat kann Passwort A durchaus Passswort B entsprechen. Wenn dieser Fall eintritt spricht man von einer sogenannten "Kollision".

Hat ein Angreifer deshalb beide Hash-Werte vorliegen und kann daraus eine Kollision ableiten, so benötigt dieser nicht mehr das Passwort A, da er mit Passwort B ebenfalls Zugriff erhalten würde. Um diese Schwachstelle zu umgehen, fügt man etwas Salz in die Suppe. Das Verfahren hierzu nennt sich Salting (engl. salzend; salzen). Nun liegt dem Angreifer ein völlig anderer Hashwert vor, aus dem sich keine Kollison mehr erkennen lässt. Mehr hierzu in Angriffe.

Nun eignen sich Hashwerte auch dazu festzustellen, ob ein Text oder Daten verändert wurden, ehe sie beim Empfänger eintrafen (Man-in-the-Middle-Attack). Hierzu wird der Hashwert der Daten in einer Signatur hinterlegt, die sich in einem - ohne Schlüssel nicht lesbaren - Bereich befindet. Stimmt der Hashwert durch die Veränderung nicht mehr mit der in der Signatur gespeicherten überein, wurden die Daten verfälscht. Die Signatur selbst kann nicht ohne weiteres verändert werden und gilt daher als sicher.

In der Softwareindustrie macht man sich den Umstand von Kollisionen zu nutze, um Software mit Produktschlüssel zu versehen. Hierbei Verwendet man einen symmetrischen Schlüssel, mit dem das Programm geöffnet werden kann. Dieser Schlüssel kann aber in dieser Form nicht eingegeben werden. Statt dessen wird dieser durch eine Hash-Funktion gebildet. Ein Schlüssel ist so aufgebaut, dass eine Berechnung eines validen Schlüssel stehts zum selben Ergebnis führt.

PHP kennt standardmäßig 2 solcher Hash-Funktionen:
  • MD5 - Message Digest Algorithm 5
  • SHA-1 - Secure Hash Algorithm 1

Um SHA-256 und höher sowie viele anderen Hash-Methoden verwenden zu können, muss man sich auf die Erweiterung HASH (Message Digest Framework) beziehen.


Symmetrische Schlüssel

Möchte man Daten verschlüsseln und hinterher wieder auslesen, muss man auf eine andere Methode und auch auf eine Erweiterung von PHP zugreifen, da PHP keine Standardmethoden hierzu kennt.

Um seine Daten sicher zu verstauen wählt man einen geheimen Schlüssel. Die Schlüssellänge variiert dabei von Methode zu Methode. Der Schlüssel kann aus lesbaren Text sein, was aber nicht empfohlen wird, da man diesen durch Attacken möglicherweise erraten kann. Ohne diesen Schlüssel ist es nahezu unmöglich bzw. nur unter extrem hohem Aufwand möglich, die verschlüsselten Daten zu lesen.

Um die Daten zu verschlüsseln wird der Schlüssel durch diverse Bitoperationen und/oder verschachtelten Funktionen mit der Verschlüsselung verknüpft. Der Schlüssel selbst wird nicht gespeichert. Die verschlüsselten Daten können nur mit ein und demselben Schlüssel wieder gelesen werden.

Ein Beispiel hierzu mit AES [Advanced Encryption Standard] (Nachfolger des DES [Data Encryption Standard]):

PHP Quellcode:
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$Key = "FGX78-HU92I-DVBMC-092DX-12YSD";
$Data = "Meine Daten - gesichert";

$crypted = mcrypt_encrypt(
  MCRYPT_RIJNDAEL_256,
  $Key,
  $Data,
  MCRYPT_MODE_CBC,
  $iv
  );

$decrypted = mcrypt_decrypt(
  MCRYPT_RIJNDAEL_256,
  $Key,
  $crypted,
  MCRYPT_MODE_CBC,
  $iv
  );

$decrypted = rtrim($decrypted, "\0\4");

echo "crypted: $crypted";
echo "decrypted: $decrypted";

/* Ausgabe:
crypted: €u|ùÀ„\Ñéw6qq_œŒ‹Ð´uÞHª¦¯÷6b¿;
decrypted: Meine Daten - gesichert
*/


Erläuterung:

mcrypt_get_iv_size = Gibt die Größe für den IV (Initialisierungs-Vektor) zurück.

MCRYPT_RIJNDAEL_256 = Diese Konstante legt den Modus und Bitstärke für die Verschlüsselung fest. RIJNDAEL ist AES (benannt nach Joan Daemen und Vincent Rijmen; den Erfindern).

mcrypt_create_iv = Erzeugt den den IV.

MCRYPT_MODE_CBC = Beschreibt den Modus der Shift-Operationsfolgen. Aufgrund der mathematischen Möglichkeiten kann ein Algorithmus auf mehrere Weisen implementiert werden. Ein Ausgangsmodus mancher Algorithmen ist aber die Blockchiffrierung. Bei AES ist diese zwingend. (CBC = Cipher Block Chaining).

PHP Quellcode:
$decrypted = rtrim($decrypted, "\0\4");

Diese Zeile wird vielleicht aufgefallen sein. Mann muss Null-Zeichen am Ende der Daten entfernen. Der Grund ist folgender:

Da AES Blockchiffrierung nutzt, muss ein Block immer die gleiche Größe haben. Meine Daten hatten dies nicht. Die Funktion füllt daher die Daten auf, bis die erforderliche Länge erreicht ist. Diese Zeichen können beim Entschlüsseln nicht automatisch entfernt werden, da die Datenlänge nicht mitgespeichert wird und somit nicht bekannt ist (Ist auch gut so).

Um mcrypt Verwenden zu können, muss PHP mit der Option --with-mcrypt[=DIR] --disable-posix-threads kompiliert werden (Unix). Unter Windows kann die Erweiterung durch eine Extension eingebunden werden.

Auch hier gibt es wieder eine Vielzahl an Methoden. Darunter AES, (3)DES, Blowfish, Serpent uvm. auszuwählen.


Asymmetrische Schlüssel

Hier wird die Verwendung des Begriffs "Symmetrische Schlüssel" aus dem vorigen Absatz deutlich: Man wendet hier, statt einem (symmetrischen) Schlüssel, zwei unterschiedliche Schlüssel an.

Der Sinn ist folgender: Benutzer A erstellt einen geheimen Text und sendet diesen an Benutzer B. Mit diesem Text sendet A seinen öffentlichen Schlüssel. Diesen Schlüssel kann nun B (und jeder andere) nehmen und verschlüsselte Daten an A zurücksenden. B sendet auch seinen öffentlichen Schlüssel.

A kann die Daten, die mit dem öffentlichen Schlüssel von A erstellt worden sind, mit dem privaten Schlüssel von A wieder entschlüsseln. A benutzt nun den öffentlichen Schlüssel von B um eine neue Nachricht an B zu erstellen.

Daraus folgt für A und B:
  • eigene öffentliche Schlüssel werden dem Empfänger übergeben, damit dieser eine Nachricht schreiben kann.
  • eigene private Schlüssel werden genutzt, um die verschlüsselte Nachricht, die mit eigenem öffentlichen Schlüssel erstellt worden ist, wieder zu entschlüsseln.

Der allgemeine Schlüsselaustausch ist keine neue Technologie, wurde aber mit RSA (benannt nach Ronald L. Rivest, Adi Shamir und Leonard Adleman) marktreif gemacht.

Man benutzt RSA für Email-Validierungen, Zertifikate und verschiedene Protokolle (https, ssh, tls...). Allerdings selten für ganze Sitzungen. Häufig beschränkt man sich auf die Schlüsselweitergabe eines symmetrischen Schlüssels für die weitere Sitzung, da das Ver- und Entschlüsseln zu viel Zeit in Anspruch nehmen würde.

Der verwendete Algorithmus von RSA ist heute immer noch RC4 ((Rivest)Ron's Code 4). Er wurde bereits 1987 entwickelt. Allerdings wird meist eine modifzierte Version eingesetzt, die eine längere Schlüsselgröße besitzt.

Um die Indentität von Schlüssen zu gewährleisten kann man Zertifikate beziehen. Die Schlüssel und andere Informationen werden dann gehashed und im Zertifikat festgehalten. Zertifikate sind jedoch umstritten, da die Valdierung eines Benutzers zu lasch gehandhabt wird und ein Zertifikat relativ leicht zu erhalten ist bzw entsprechende Einträge in einem Zertifikat vor Ausgabe nicht oder nur stichprobenartig geprüft werden. Einträge in einem Zertifikat sind meist Name, Domain, Organisation, Land und andere Informationen.

Durch OpenSSL ist es möglich eigene Zertifkate zu erstellen, die aber nicht validiert werden müssen. Da die Validierung Geld kostet und kaum Nutzen bringt, verzichten viele Anbieter auf diese. Hierdurch wird nun der Benutzer, der von seinem Browser aufgefordert wird, das Zertifikat genauer zu untersuchen "belästigt", wodurch dieser fahrlässig wird und die Webseite für vertrauenswürdig hält, auch wenn diese als nicht vertrauenswürdig eingestuft ist. Der Benutzer sieht nun dieses für ihn unverständliche Problem mit dem Zertifikaten an meheren Seiten und könnte somit auch einer kompromittieren Webseite schlussendlich vertrauen. Auf dieses Problem versucht man in neueren Browsern durch farblich Hervorhebung von Elementen aufmerksam zu machen, auch wenn es wohl nicht viel bringt.

Auch hierfür bietet PHP keine Standardmethode. Möchte man einen Schlüsselautsch initiieren kann man sich aber auf die Erweiterung openSSL beziehen und hierfür folgende Methoden nutzen:

openssl_private_decrypt
openssl_private_encrypt
openssl_public_decrypt
openssl_public_encrypt


Um openSSL zu benutzen, muss PHP mit --with-openssl kompiliert werden.



Salting

Wie bereits bei Hashes angesprochen, gibt es Mittel und Wege Kollisonen - zwar nicht zu verhindern - aber unkenntlich zu machen. Eine Methode hierzu ist die Ausgangsdaten zu salzen. Darunter versteht man nun konkret eine zufällige Datenfolge zu den Ausgangsdaten hinzuzufügen, um einen anderen Hashwert zu erhalten. Salting ist nicht auf Hash-Funktionen begrenzt und wird häufig eingesetzt um einen Schlüssel zu verändern, um diesen sicherer zu machen.

Da man das Salz braucht, um einen Hash wieder erzeugen zu können, bzw einen Schlüssel wieder zu erzeugen, sollte man das Salz ebenfalls sicher aufbewahren.


Initialisierungs-Vektor (IV)

Auch dieser erfüllt eine ähnliche Funktion wie das Salting. Er wird bei Verschlüsselungsmethoden angewandt, bei denen eine Block-Chiffrierung zum Einsatz kommt. Der Vektor ist eine Reihe von Zufallszeichen, die im Algorithmus mit XOR-Operationen verknüpft werden, um Klartext-Angriffe zu verhindern. Die Länge des Vektors ist abhängig von der verwendeten Methode.


Angriffe


(Symmetrisch) Klartext-Angriff:

Da es als sicher gilt nur einen Schlüssel zu verwenden, müssen sogenannte Klartext-Blöcke vermieden werden. Ein Klartext-Block ist eine Zeichenfolge die im Umfeld bekannt ist, wie zB ein Anfang einer Anrede eines Briefes. Ein Angreifer kann aus mehreren Übertragungen Schlüsse ziehen, welcher Schlüssel verwendet worden sein kann, da die XOR-Verküpfungen auf einer statischen Tabelle beruhen (der S-Box) und somit nachvollzierbar wären, da der 1. Teil des Geheimtextes immer gleich wäre. Durch den Initialisierungsvektor wird der erste Klartext nicht mit der S-Box verküpft sondern durch XOR einer Bitoperation mit dem IV ausgesetzt und somit können neue Zeichen erzeugt werden. Der nachfolgende Block, der wieder mit der S-Box verknüpft wird, gilt als sicher, da bei Block-Chiffrierung der vorhergehende Block als Verknüpfungsbasis herangezogen wird und somit unterschiedliche Daten entstehen.


Brute-Force

Man versucht hier einfach durch "herumprobieren" an das richtige Passwort bzw. Schlüssel zu kommen. Der Erfolg einer Methode hängt von sehr viel Zeit und Rechenpower ab..


Rainbow-Tables

Diese Methode ist für schwach gewählte Passwörter sowie ohne Salz gefährlich. Hierbei wird der Hash in einer Tabelle gesucht, die aus bekannten Passwörtern neue Hashes erstellt vergleicht und bei Kollisionen aus den gefunden Daten widerrum neue Hashes erzeugt, die gleich der Eingabelänge sind. Der genaue Vorgang ist etwas komplex.


Preimage-Angriff

Diese Methode ähnelt der Brute-Force Methode. Der Unterschied liegt darin, nicht den Ursprungstext herauszufinden sondern ein Pendant, welches den gleichen Hashwert erzeugt. Auch diese Methode stellt ein Problem für Passwörter ohne Salz da, da der Angreifer mit einem gefunden Gegenstück das Orginal-Passwort nicht kennen muss. Hat er zusätzlich eine Tabelle mit anderen Passwörtern, die den gleichen Hash erzeugen, könnte er auf ein schlecht gewähltes Passwort stoßen.


Kollisionen

Man versucht hier unter dem Wissen des Algorithmus, Datenblöcke so abzuändern, dass unter bestimmten Vorraussetzungen Kollisionen entstehen. Eine Kollision tritt auf, wenn die Daten A und B den gleichen Hash erzeugt. Man versucht nun Bytefolgen aufgrund der Analyse vorherzusagen. Wenn eine Methode viele Kollisionen erzeugt, soll es möglich sein aus bestimmen Byte-Folgen gleiche Hash-Folgen zu generieren. Somit ließe sich für eine bestimme Byte-Folge eine eindeutige Annahme zu einer von vielen möglichen Dateninterpretationen machen. Die Methode wäre nicht mehr sicher, da nun eine Byte-Folge bekannt wäre, die daraus resultiert, dass die Ursprungszeichenfolge das Zeichen beinhaltet, bzw das Zeichen an einer bestimmten Stelle steht.


Links


http://upload.wikimedia.org/wikipedi...rtificates.svg
http://de.wikipedia.org/wiki/Kryptographie
http://de.wikipedia.org/wiki/Brute_force
http://de.wikipedia.org/wiki/Preimage-Angriff
http://de.wikipedia.org/wiki/Hash
http://de.wikipedia.org/wiki/Kryptoanalyse


Mitwirkende: frameone
Erstellt von frameone, 30.11.2008 am 11:31
Zuletzt bearbeitet von frameone, 01.12.2008 am 09:12
0 Kommentare , 4670 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:48 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC