You are not logged in.

This articles has been requested to be deleted.

Saturday, September 12th 2009, 12:07pm

Tags

Mcrypt, modul, Sessionsicherheit, sicherheit, verschlüsseln, verschlüsselung

Abstract

In diesem Artikel stelle ich kurz das umfangreiche MCrypt-Modul zur Verschlüsselung von sensiblen Daten (wie z.B. Passwörtern in Cookies) vor.

Article

1. Hintergrund


In der Zeit des modernen Webs wird Sicherheit immer wichtiger. Immer mehr Programme und Websiten versuchen, durch die Cookies im Browser an sensible Daten ihres Besitzers zu gelangen. Noch Fataler als bei Passwörtern wird es, wenn Kontodaten oder -verbindungen abgespeichert werden- da muss schnell die Polizei eingeschaltet werden.

Doch je besser die Diebe werden, desto weiter entwickelt sich auch die Software, sich vor diesen Kriminellen zu schützen. Immer kompliziertere Verschlüsselungsverfahren mit eigenen Keys machen das Ausspionieren von Daten immer schwerer- eines dieser Verschlüsselungsmodule nennt sich MCrypt.

2. Einsatz


Da dies ein Zusatzmodul zu PHP ist und bei den meisten nicht von Beginn an integriert ist, muss es noch im nachhinein installiert werden. Da es dazu eine gute, Deutschsprachige Anleitung auf PHP.net gibt, werde ich zur Installation hier nichts mehr beitragen.

2.1. Neues Modul initialisieren


Zur initialisierung dieses Moduls gibt es in PHP die Funktion mcrypt_module_open:

PHP Quellcode

1
$mcrypt = mcrypt_module_open('blowfish', '', 'cfb', '');

Quoted

Im ersten Parameter wird der Name des verwendeten Algorithmus eingefügt.
Beispiel:
mcrypt_module_open('blowfish', '', 'cfb', '');

Quoted

Im zweiten Parameter wird der Pfad zur MCrypt-Installation eingegeben (üblicherweise /usr/local/lib/lib/mcrypt). Wird dieser Parameter nicht übergeben, so wird automatisch nach der Installation gesucht/die Einstellungen aus der php.ini übernommen.

Quoted

Im dritten Parameter wird der verwendete Modus angegeben.
Beispiel:
mcrypt_module_open('blowfish', '', 'cfb', '');

Quoted

Im dritten Parameter wird ebenfalls der Pfad zur MCrypt-Installation angegeben. Wird dieser Parameter leer gelassen, so wird ebenfalls nach dem Installationspfad gesucht.

2.2. Text verschlüsseln


Zur Verschlüsselung eines Textes werden nach der Initialisierung die Funktionen mcrypt_create_iv, mcrypt_enc_get_iv_size, mcrypt_generic_init[i][i][i], [/i][/i]mcrypt_generic [/i] und mcrypt_generic_deinit benötigt.
Beispiel für eine Verschlüsselung:

PHP Quellcode

1
2
3
4
5
6
7
8
9
$key = 'Dies ist ein Key, mit dem der Text verschluesselt wird.';
$text = 'Dies ist der zu verschluesselnde Text.';
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($mcrypt), MCRYPT_RAND);
mcrypt_generic_init($mcrypt, $key, $iv);
$crypted = mcrypt_generic($mcrypt, $text);
mcrypt_generic_deinit($mcrypt);
 
echo $crypted;
//Ausgabe bei der hier verwendeten Verschlüsselung: 0Ωģӭ`ì@6J 'º]Ã‰çØ©ì}m,bRÖ¶—jЙ¢(+

Mit jeder Anfrage wird der verschlüsselte Text ein anderer, da durch MCRYPT_RAND (Erklärung weiter hinten) zu dem Schlüssel ($key) ein Zufallswert hinzugefügt wird.

2.2.1. mcrypt_create_iv

PHP Quellcode

1
mcrypt_create_iv($size, $source = MCRYPT_DEV_RANDOM);

Quoted

Im ersten Parameter wird die Größe des MCrypts angegeben. Dieser kann optimalerweise mit mcrypt_get_iv_size($mcrypt); angegeben werden.

Quoted

Der zweite Parameter ist optional. Hier wird ein Quellverzeichniss angegeben, wobei von mir ausdrücklich empfohlen wird, MCRYPT_RAND anzugeben, da die anderen möglichen Angaben (MCRYPT_DEV_RANDOM, MCRYPT_DEV_URANDOM) nicht von Windows-Servern unterstützt werden.
2.2.2. mcrypt_get_iv_size

Diese Funktion gibt die Größe von $mcrypt zurück.

PHP Quellcode

1
mcrypt_get_iv_size($mcrypt);


2.2.3. mcypt_generic_init

Diese Funktion muss aufgerufen werden, bevor der Text verschlüsselt werden kann.

PHP Quellcode

1
mcrypt_generic_init($mcrypt, $key, $iv);

Quoted

$mcrypt: Der MCrypt-Handler (Rückgabewert der Funktion mcrypt_module_open()).

Quoted

$key: Ein beliebiger Schlüssel, mit dem der Text verschlüsselt werden soll.

Quoted

$iv: Das initialation vector- Objekt (Rückgabewert der Funktion mcrypt_create_iv()).
2.2.4. mcrypt_generic

Verschlüsselt den angegebenen Text.

PHP Quellcode

1
$crypted = mcrypt_generic($mcrypt, $text);

Quoted

$mcrypt: Der MCrypt-Handler (Rückgabewert der Funktion mcrypt_module_open()).

Quoted

$text: Der zu verschlüsselnde Text (z.B. ein Passwort).
2.2.5. mcrypt_generic_deinit

Diese Funktion beendet den Verschlüsselungsvorgang.

PHP Quellcode

1
mcrypt_generic_deinit($mcrypt);

Quoted

$mcrypt: Der MCrypt-Handler (Rückgabewert der Funktion mcrypt_module_open()).

3. McryptUtil-Klasse


Für mein Framework habe ich eine eigene McryptUtil-Klasse definiert, die den Einsatz von Mcrypt erleichtert und den Code auf bis zu 3 Zeilen minimiert.

3.1. McryptUtil::open()


Diese Funktion öffnet ein neues Mcrypt-Modul.
Verwendungsweise:

PHP Quellcode

1
McryptUtil::open($algorithmus = 'blowfish', $mode = 'cfb');

Quoted

$algorithm: Der zu verwendende Verschlüsselungs-Algorithmus.

Quoted

$mode: Der zu verwendende Verschlüsselungsmodus.

3.2. McryptUtil::encrypt()


Diese Funktion verschlüsselt einen Text.
Verwendungsweise:

PHP Quellcode

1
$crypted = McryptUtil::encrypt($text, $key);

Quoted

$text: Der zu verschlüsselnde Text.

Quoted

$key: Der bei der Verschlüsselung verwendete Schlüssel.

Quoted

Rückgabewert: Der verschlüsselte Text.

3.3. McryptUtil::decrypt()


Entschlüsselt einen verschlüsselten Text.
Verwendungsweise:

PHP Quellcode

1
$encrypted = McryptUtil::decrypt($crypted, $key);

Quoted

$crypted: Der verschlüsselte Text.


Quoted

$key: Der bei der Verschlüsselung verwendete Schlüssel.



Quoted

Rückgabewert: Der entschlüsselte Text.

4. Beispiele


4.1. Ohne McryptUtil

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$text = 'Dieser Text soll verschlüsselt werden!';
$key = 'Dies ist der Schlüssel, der bei der Verschlüsselung verwendet werden soll!';
$mcrypt = mcrypt_module_open('blowfish', '', 'cfb', '');
$ivsize = mcrypt_get_iv_size($mcrypt);
 
//Verschlüsselung
$iv = mcrypt_create_iv($ivsize, MCRYPT_RAND);
mcrypt_generic_init($mcrypt, $key, $iv);
$crypted = mcrypt_generic($mcrypt, $text);
mcrypt_generic_deinit($mcrypt);
 
echo $iv.$crypted; //Unidentifizierbare Anreihung von Sonderzeichen
 
//Entschlüsselung
$iv = substr($crypted, 0, $ivsize);
$crypted = substr($crypted, $ivsize);
mcrypt_generic_init($mcrypt, $key, $iv);
$encrypted = mdecrypt_generic($mcrypt, $crypted);
mcrypt_generic_deinit($mcrypt);
 
echo $encrypted; //"Dieser Text soll verschlüsselt werden!"


4.2. Mit McryptUtil


PHP Quellcode

1
2
3
4
5
6
7
8
$text = 'Dieser Text soll verschlüsselt werden!';
$key = 'Dies ist der Schlüssel, der bei der Verschlüsselung verwendet werden soll!';
McryptUtil::open();
$crypted = McryptUtil::encrypt($text, $key);
echo $crypted; //Unidentifizierbare Anreihung von Sonderzeichen
 
$encrypted = McryptUtil::decrypt($crypted, $key);
echo $encrypted; //"Dieser Text soll verschlüsselt werden!"



5. Meine Verschlüsselung funktioniert nicht!


  • Ist Mcrypt installiert?
  • Ist der Key bei der Entschlüsselung identisch mit dem Key bei der Verschlüsselung?
SargTeX has attached the following file:
  • McryptUtil.zip (681 Byte - 73 times downloaded - latest: Feb 3rd 2012, 3:24pm)

Lexikon 4.1.3, developed by www.viecode.com