Баран С.М., Алибиев Д.Б.

Карагандинский государственный университет им.Е.А.Букетова, Казахстан

ШИФРОВАНИЕ ХРАНИЛИЩА БАЗЫ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕКИ MCRYPT

Информационная безопасность, как и защита информации, задача комплексная, направленная на обеспечение безопасности, реализуемая внедрением системы безопасности. Проблема защиты информации является многоплановой и комплексной и охватывает ряд важных задач. Проблемы информационной безопасности постоянно усугубляются процессами проникновения во все сферы общества технических средств обработки и передачи данных и, прежде всего, вычислительных систем.

На сегодняшний день сформулировано три базовых принципа, которые должна обеспечивать информационная безопасность:

·                    целостность данных — защита от сбоев, ведущих к потере информации, а также зашита от неавторизованного создания или уничтожения данных;

·                    конфиденциальность информации;

·                    доступность информации для всех авторизованных пользователей.

При разработке компьютерных систем, выход из строя или ошибки в работе которых могут привести к тяжелым последствиям, вопросы компьютерной безопасности становятся первоочередными.

Шифрование хранилища базы данных

SSL/SSH защищает данные, которыми обмениваются клиент и сервер, но не защищает сами данные, хранимые в базе данных. SSL - протокол шифрования на уровне сеанса передачи данных.

В случае, если взломщик получил непосредственный доступ к БД (в обход веб-сервера), он может извлечь интересующие данные или нарушить их целостность, если информация не защищена на уровне самой БД. Шифрование данных - хороший способ предотвратить такую ситуацию, но лишь незначительное количество БД предоставляют такую возможность.

Наиболее простое решение этой проблемы - установить вначале обыкновенный программный пакет для шифрования данных, а затем использовать его в ваших PHP-скриптах. PHP может вам помочь с этой задачей с помощью таких расширений как Mcrypt и Mhash, реализующих довольно большое число алгоритмов шифрования. При таком подходе скрипт вначале шифрует сохраняемые данные, а затем дешифрует их при запросе. Ниже приведены примеры того, как работает шифрование данных в PHP-скриптах.

В случае работы со скрытыми служебными данными, если не требуется их нешифрованное представление (т.е. его не нужно показывать), то, как следствие, можно использовать хэширование. Хорошо известный пример хэширования - хранение криптографического хэша от пароля в БД, вместо хранения оригинального значения.

Пример 1 Использование хешированных паролей

<?php
// 
сохранение хэшированного пароля
$query  = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
      pg_escape_string($username), crypt($password, '$2a$07$usesomesillystringforsalt$'));
$result = pg_query($connection, $query);

// 
проверка введенного пользователем пароля на корректность
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
       pg_escape_string($username), crypt($password, '$2a$07$usesomesillystringforsalt$'));
$result = pg_query($connection, $query);

if (pg_num_rows($result) > 0) {
    echo '
Добро пожаловать, $username!';
} else {
    echo '
Авторизация не удалась, $username.';
}
?>

Библиотека шифрования Mcrypt

Библиотека Мcrypt поддерживает широкий набор алгоритмов шифрования , таких как DES, TripleDES, Blowfish, 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 и режимов шифровки GOST в CBC, OFB, CFB и ECB.

В отличии от функции crypt(), функции библиотеки Mcrypt можно использовать для шифрования и дешифрования вышеприведёнными шифрами. Библиотека libmcrypt-2.2.x, имеет четыре важные функции mcrypt (mcrypt_cfb(), mcrypt_cbc(), mcrypt_ecb() и mcrypt_ofb()), которые могут оперировать в двух режимах, которые называются MCRYPT_ENCRYPT и MCRYPT_DECRYPT, соответственно.

Пример 2. Шифровка input-значения шифром TripleDES под 2.2.x в режиме ECB

<?php
$key = "this is a secret key";
$input = "Let us meet at 9 o'clock at the secret place.";

$encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
?>

При работе с библиотеками libmcrypt 2.4.x или 2.5.x, эти функции также будут доступны, но рекомендуется использовать продвинутые функции.

Пример 3. Шифровка input-значения шифром TripleDES под 2.4.x и выше в режиме ECB

<?php
    $key = "this is a secret key";
    $input = "Let us meet at 9 o'clock at the secret place.";

    $td = mcrypt_module_open('tripledes', '', 'ecb', '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $encrypted_data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
?>

Тестирование алгоритмов шифрования библиотеки Mcrypt в PHP

Для тестирования был написан скрипт, который генерирует набор данных и шифрует их разными алгоритмами.

Листинг скрипта генерации набора данных и шифрования

<?php

// Тестируем шифрование

echo '<pre>';

$repeat = 1000; // Количество повторений, если сильно долго или сильно быстро выполняется

$passphrase = 'My password';

$list =  array

(   0 => 'cast-128',

    1 => 'gost',

    2 => 'rijndael-128',

    3 => 'twofish',

    4 => 'cast-256',

    5 => 'loki97',

    6 => 'rijndael-192',

    7 => 'saferplus',

    9 => 'blowfish-compat',

    10 => 'des',

    11 => 'rijndael-256',

    12 => 'serpent',

    13 => 'xtea',

    14 => 'blowfish',

    16 => 'rc2',

    17 => 'tripledes',);

$data = '';

for ($i = 0; $i < 1000;$i++){ // генерируем  случайную последовательность

            $data .= md5(microtime() . rand(), 1);

}

$times = array();

foreach($list AS $alg){

            $td = mcrypt_module_open($alg, '', 'cbc', '');

            $iv = substr(md5('iv'.$passphrase, 1) . md5('iv'.$passphrase, 1), 0, mcrypt_enc_get_iv_size($td));

            $key = substr(md5('pass1'.$passphrase, 1) . md5('pass2'.$passphrase, 1), 0, mcrypt_enc_get_key_size($td));

            mcrypt_generic_init($td, $key, $iv);

           

            $t = microtime(1);

            for($i=0; $i < $repeat;$i++){

                        mcrypt_generic($td, $data);

            }

            $times[$alg] = round(microtime(1) - $t, 4);

            mcrypt_module_close($td);

}

asort($times);

print_r($times);

?>

Тестирование проводилось на 3 серверах:

1.     VPS (Linux, PHP 5.2.17)

2.     Dedic (FreeBSD, PHP 5.2.14)

3.     Local (Win 7, PHP 5.3.6)

При тестировании был выбран режим MCRYPT_CBC, как наиболее подходящий для шифрования файлов. На всех серверах использовался Mcrypt 2.5.8.

Тестирование проводилось по 10 раз, 3 лучших результата усреднялись.

 

Результаты тестирования скорости шифрования

Литература:

1.     Handbook of Applied Cryptography by A. Menezes, P. van Oorschot and S. Vanstone. 1997 by CRC Press, Inc.

2.     Applied Cryptography by Schneier (ISBN 0-471-11709-9).

3.     http://www.php.ru/manual/ref.mcrypt.html -функции Mcrypt