вторник, 29 июня 2010 г.

Освоение криптографии - 2: алгоритм Blowfish

Использование DES-шифрования, описанного в предыдущем посте весьма удобно, но оправдано далеко не всегда. Например, если передаваемые данные нужно защитить "с гарантией" или ключ меняется достаточно редко, использовать алгоритм такой стойкости уже нежелательно. Тем более, что смена алгоритма при нынешнем уровне развития платформ не требует больших усилий. Альтернативой устаревшему уже в начале века DES выбираем Blowfish. Он достаточно быстрый и, также являясь симметричным алгоритмом, не требует принципиальной престройки взаимодействия клиента с сервером.
Для реализации шифрования используем те же библиотеки, что и раньше. В случае flex-части вообще изменится только одна строчка кода:
var cipher:ICipher = Crypto.getCipher("blowfish-ecb", key);
В случае java всё немного сложнее...
Во-первых
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("Blowfish");
уже не сработает. SecretKeyFactory не может порождать ключи такого типа. Это решается достаточно просто, ключи делаем так:
key = new SecretKeySpec(keystr.getBytes(), "Blowfish");
Тут keystr - наш секретный пароль. Остальной код оставляем как в прошлом посте. Компилируем, запускаем, и... получаем Exception: Illegal key size. Очевидный путь наращивания длины ключа тут не поможет. Не в моём случае, по крайней мере. Помогло другое: Скачиваем отсюда так называемые "Unlimited Strength Jurisdiction Policy Files". Это 2 jar-ника, которыми можно заменить аналогичные файлы в java-машине, "ослабив" при этом политику безопасности до нужного нам уровня. Файлы, которые следует заменить в моём случае лежат тут: /usr/lib/jvm/java-6-sun/jre/lib/security. Старые, после окончания экспериментов лучше вернуть на место ;)

Освоение криптографии - 1: алгоритм DES

До сих пор как-то не приходилось серьёзно знакомиться с шифрованием данных. Https защищал мои приложения не только от хакеров, но и от необходимости о них думать :). Но вот возникла задача обеспечить защиту трафика "вручную". На сервере Java, клиент - flex. Первый алгоритм с которым я познакомился (практически случайно) - DES. Алгоритм старый, имеет хорошие реализации практически на всех языках. Криптостойкость не абсолютная, как говорит wikipedia, ломается прямым перебором за 2^55 итераций. Правда для этого нужна пара открытой и закриптованной строк. Впрочем, в нашем случае его криптостойкость достаточна. 
Для серверной части используем классы javax.crypto.*. Код примерно такой:


  1. public class DesCrypter {
  2.  
  3.     Cipher ecipher;
  4.     Cipher dcipher;
  5.  
  6.     /**
  7.      * Конструктор
  8.      * @param key секретный ключ алгоритма DES
  9.      * @throws NoSuchAlgorithmException
  10.      * @throws NoSuchPaddingException
  11.      * @throws InvalidKeyException
  12.      */
  13.     public DesCrypter(String keystr) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException {
  14.         DESKeySpec desKeySpec = new DESKeySpec(keystr.getBytes());
  15.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  16.         SecretKey key = keyFactory.generateSecret(desKeySpec);
  17.         ecipher = Cipher.getInstance("DES");
  18.         dcipher = Cipher.getInstance("DES");
  19.         ecipher.init(Cipher.ENCRYPT_MODE, key);
  20.         dcipher.init(Cipher.DECRYPT_MODE, key);
  21.     }
  22.  
  23.     /**
  24.      * Функция шифровнаия
  25.      * @param str строка открытого текста
  26.      * @return зашифрованная строка в формате Base64
  27.      */
  28.     public String encrypt(String str) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException {
  29.         byte[] utf8 = str.getBytes("UTF8");
  30.         byte[] enc = ecipher.doFinal(utf8);
  31.         return new sun.misc.BASE64Encoder().encode(enc);
  32.     }
  33.  
  34.     /**
  35.      * Функция расшифрования
  36.      * @param str зашифрованная строка в формате Base64
  37.      * @return расшифрованная строка
  38.      */
  39.     public String decrypt(String str) throws IOException, IllegalBlockSizeException, BadPaddingException {
  40.         byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
  41.         byte[] utf8 = dcipher.doFinal(dec);
  42.         return new String(utf8, "UTF8");
  43.     }
  44.  
  45. }

На клиентской стороне используем библиотеку as3crypto. С её помощью делаем реализацию шифрования на ActionScript 3.5:


  1. /**
  2. * @param string Cтрока для зашифровки
  3. * @param passString Пароль
  4. */
  5. public static function encryptString(string:String, passString:String):String {
  6.     var key:ByteArray        = Hex.toArray(Hex.fromString(passString+postfix));
  7.     var plainText:ByteArray    = Hex.toArray(Hex.fromString(string));
  8.     var cipher:ICipher = Crypto.getCipher("simple-des-ecb", key);
  9.     cipher.encrypt(plainText);
  10.     return Base64.encodeByteArray(plainText);
  11. }
  12.  
  13. /**
  14. * @param string Cтрока для расшифровки
  15. * @param passString Пароль
  16. */
  17. public static function decryptString(string:String, passString:String):String {
  18.     var key:ByteArray        = Hex.toArray(Hex.fromString(passString+postfix));
  19.     var plainText:ByteArray    = Hex.toArray(string);
  20.     var cipher:ICipher = Crypto.getCipher("simple-des-ecb", key);
  21.     cipher.decrypt(plainText);
  22.     return(Hex.toString(Hex.fromArray(plainText)));
  23. }

Никаких неожиданностей не было, всё заработало сразу. Единственная особенность: функции шифрования работают с битовыми массивами, а передаём мы строки. При создании строки играет роль (часто губительную) кодировка. Чтобы избежать неприятностей с ней, везде используем Base64-кодирование результата.

воскресенье, 27 июня 2010 г.

SmartGWT + Netbeans

После двухнедельного знакомства с flex я получил массу положительных эмоций, но начальство любит apple а apple не любит flash :). Вывод - надо искать другую платформу для Rich Internet Applications. Сегодня разбираюсь со SmartGWT.
Что понадобится для работы:
  • Netbeans - он у нас уже есть, Tomcat ставится вместе с ним, тут тоже порядок.
  • GWT - Google Web Toolkit. Это фреймворк, который позволяет нам писать клиентский код на java, при компиляции превращая его в javascript.
  • Gwt4nb - плагин к Netbeans, который позволяет создавать шаблоны web-приложений с использованием GWT. Ставится прямо из Netbeans (сервис->плагины->доступные плагины)
  • SmartGWT - библиотека виджетов, расширяющая GWT. 
Как это всё собрать вместе и подключить к проекту? Очень просто.

После установки плагина создаём java web application, на последнем этапе мастера отмечаем фреймворк GWT. Нужно будет указать путь к каталогу, где лежат распакованные файлы фреймворка.
Создастся каркас приложения (такой себе helloworld), в который нужно добавить библиотеку smartgwt.jar из каталога, куда распаковали SmartGWT.
Единственная неочевидность процесса - приложение будет корректно компилироваться только если ручками подправить после этого файл Main.gwt.xml в вашем проекте. Нужно добавить строку
<inherits name="com.smartgwt.SmartGwt" />
в блок module.

суббота, 26 июня 2010 г.

Ubuntu 10.04 на ноутбуке Samsung R58plus

Сегодня решил обновить свою Ubuntu 9.4 до версии 10.04 и столкнулся с проблемой. Посте перезагрузки - чёрный экран. При этом, если выбрать при загрузке предыдущее ядро 2.6.31-21, то загрузка, хоть и с ошибками, проходит. Згрузившись, идём в интернет и читаем. В итоге, проблема решается одной командой в консоли:
echo "options radeon modeset=0" > /etc/modprobe.d/ati.conf
После перезагрузки ядро 22 запускается как часы :)

четверг, 10 июня 2010 г.

Flex-разработка: настройка инструментов под Linux

На днях возникло желание освоить Flex... До сих пор писал интерфейсы для web на HTML+JavaScript (c красивостями jQuery) и как-то справлялся. Но тут вдруг надоело... Да и задачи всё время какие-то "интерфейсные" попадаются. Короче - время пришло. И, поскольку мы стойкие сторонники Open Source, правильный выбор свободных инструментов - задача №1.
Условия из которых исходим: Ubuntu Linux 9.10 и стойкая привязанность к IDE для Java: NetBeans, Eclipse. Не люблю пересаживаться на новые окошки под новую задачу.
Ищем плагины под NetBeans. Первое, что обнадёживает, есть Flexbean. Описание установки и возможностей есть на Хабре. Там сразу напугало упоминание проблем с версиями NetBeans выше 6.5, но совершенно напрасно. Плагин стал на 6.9 совершенно спокойно и начал работать "как родной". Общий алгоритм установки:
  • Скачиваем SDK с сайта Adobe и распаковываем (например во ~/flex).
  • Скачиваем плагин и устанавливаем его в NetBeans.
  • Указываем Flexbean, где лежит Flex SDK (Tools -> Flex Platforms -> Add Platform… -> ~/flex).
Теперь можно создавать новые проекты типа Flex project и Flex application и запускать и компилировать их прямо из Netbeans.
Но это было только начало... Плагин этот не реализует подсветку кода mxml-файлов. Про автокомплит, понятно, речь вообще не идёт. И если в PHP я бы с этим смирился, то изучать новый язык постоянно глядя в справочник... нет уж, увольте. Ищем дальше.
Если не обращать внимание на Windows-решения, осталось не так много вариантов. Flash Builder от Adobe не свободный продукт, но альфа-версии под Linux можно использовать бесплатно. Он скачивается в виде бинарного инсталлятора, содержит в себе SDK и flash player, требует наличия Eclipse, т.к. является его плагином. Проблем в работе версии 3.5 не заметил, но есть особенность: плагин спокойно ставится на все версии Eclipse (заявлена поддержка начиная с 3.3), но работать удалось заставить только с версией 3.3.2. Пришлось откатиться на пару версий назад, что поделаешь...
На этом проблемы не закончилсь. Flash Builder устанавливает player 9 версии для Firefox, в котором есть крайне неприятный баг: кириллица при вводе в текстовые поля отображается в битой кодировке. Этому багу уже не один год, и написаны даже несколько ActionScript - заплаток для его исправления. Я решил проблему, заменив player на версию 10.1 (она пока ещё RC, но уже с бэты работает стабильно). Замена player-а описана тут. Обязательно перед установкой нужно снести старую версию.
Итак на выходе получили: можно удобно писать mxml - разметку и Action Script - классы (правда пока только 3 версии, но этого в принципе хватает для начала). Есть все фичи Eclipse, а чего нет, всегда можно добавить. Есть нормальная среда для тестирования и отладки. Осталось освоить эту технологию. Об этом - в следующих постах.

О чём?

Этот блог о решённых проблемах, найденных выходах и тому подобном. Я по роду деятельности часто изучаю новые технологии, ищу решения для тех или иных задач программирования. Всемирная паутина почти всегда выручает меня, подбрасывая идеи, уроки, готовые исходники. Пора, по-моему вернуть ей часть долга. Может быть в этом блоге кто-то найдёт решение или идею и для себя.
Если материала соберётся достаточно и он будет интересен - перенесу на отдельный сайт, а пока - добро пожаловать :)