heute werde ich euch einen kurzen Einblick in die EinWeg und ZweiWegVerschlüsselung via PHP zeigen. Dies wird vorallem für das Verschlüsseln von Passwörtern oder sensiblen Dateien benutzt. ( Richtet sich an diejenigen, die sich schon etwas damit auskennen )
Die Ein-Weg-Verschlüsslung hat einen deutlichen Vorteil für die Anwender einer Webapplikation,
da NIEMAND , auch nicht der Datenbankadmnistrator
des Betreibers jemals das unverschlüsselte Passwort zu Gesicht bekommt. ( Wird soweit ich weiss, bei der Datenbank
von Metin2 verwendet
( Passwort ist verschlüsslet in der Datenbank).
WICHTIG ! Es ist nicht möglich bzw nur sehr schwer wieder zu entschlüsseln!
Beispiel für die Login überprüfung eines per Ein-Weg verschlüsselten Passwords...
Hierbei hilft es dem Angreifer ( wenn er euer PW will) also nichts, den verschlüsselten Wert aus der Datenbank zu kennen. Benutz der das Passwort nbeim Login so wird dieser Wert durch das System abermals verschlüsselt.
Zurzeit ist der wohl am meisten benutze EinWegAlgorithmus der MD5 ( Ein Hashing Algorithmus).
Anwendung in PHP
Mit der Zwei-Weg-Verschlüsselung werden Daten verschlüsselt, die man über das Internet verschicken will, die hinterher aber auch wieder lesbar sein sollen. Hierfür wird meistens mcrypt verwendet ( ein Modul für PHP )
Als Schlüssel $schluessel dient eine von euch gewählte Zeichenkette. Hier gilt allerdings vorsicht, nur ihr und diejenige Person, die die Datei wieder entschlüsseln soll, sollten auch die Zeichenkette kenne. Die zu verschlüsselten Daten werden in $zeichenkette angegeben.
As $modus kann man einen der folgenen Konstanten wählen:
PHP Code:
MCRYPT_MODE_ECB (>>electronic codebook<<): vornehmlich für kurze Zeichenketten
MCRYPT_MODE_CBC (>>cipher block chaining<<): für Dateiverschlüsselung
MCRYPT_MODE_CFB (>>cipher feedback<<): für Byteströme , mit Verschlüsselung einzelner Bytes
MCRYPT_MODE_NOFB (>>output feedback<<): ähnlich wie >>cipher feedback<<
MCRYPT_MODE_STREAM: für dedizierte Bytesromalgorithmen
Für $initialisierung muss man sich einen binären String vorstellen, der für den Verschlüsselungsalgorithmus wie ein Startpunkt wirkt, damit er weiß , mit welcher Zeichenkette er die Arbeit aufnehmen soll.
Je nach Kombination von Algorithmus und Modus hat der Initialisierungsvektor eine eigene Form bzw. Länge. Diese findest du mit dem Befehl
PHP Code:
int mcrypt_get_iv_size(string $algorithmus,string $modus)
heraus. Der resultierende Wert lässt sich dann nutzen, um eine spezifischen Vektor mittels
PHP Code:
string mcrypt_create_iv(int $laenge, int $quelle)
zu erstellen. Als Quelle solltest du aus Kmpatibilitätsgürnden den in PHP eingebauten Zufalsgenerator einsetzen. Um dies anzuzeigen, dient die Konstante
PHP Code:
MCRYPT_RAND
. Alternativ gibt es die Funktionen
PHP Code:
MCRYPT_DEV_RANDOM und MCRYPT_DEV_URANDOM
, die jedoch nur unter Linux existieren.
Beipsiel für eine einfache Zeichenkette "unleserlich machen"
PHP Code:
<?php
$zeichenkette = "Hier ist ein Satz mit einem kleinen Geheimnis: 1";
Heraus kommt eine Verschlüsselte Zeichenkette $verschluesselt, die sich gefahrlos verschicken lässt. Jede person, die diese Nachricht abfäng und nicht im Besitz des Schlüssels und des INitialisierungsvektors ist, kann mi tdem Inhalt nichts anfangen . Den INitialisierungsvektor kann man getrost der Nachricht beifügen, denn der Empfänger benötigt ihn zur Entschlüsselung über
Man sollte vielleicht noch erwähnen, dass die Einwegverschlüsselung mittels md5 auch nicht das Gelbe vom Ei ist...
Denn egal wie lang die zu verschlüsselnde Zeichenkette/Datei ist, der Hash hat immer dieselbe Länge, woraus folgt, dass (unendlich) viele Wege zum selben Hash führen.
So kann ein Scriptkiddie durchaus mal Glück haben und nach kürzester Zeit ein Passwort gefunden haben, dass zwar nicht das eigentliche ist, aber dennoch funktioniert.
Und dann gibt es noch solche Seiten wie , die eben darauf spekulieren, dass es nur eine bestimmte Anzahl an Hashwerten gibt ...