Заказ Стрибог на Java


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

Итак, если вкратце, то суть задачи такова. Необходим не навороченный, обычный менеджер паролей. Форма 1: Открыть базу данных или создать новую. Форма 2: (Работа с базой данных) добавить, изменить, удалить объекты бд, содержащие адрес сайта, логин, пароль, комментарий + генерация паролей. Базу данных необходимо сохранять в отдельный файл и защитить, используя шифрование. Самое главное - необходимо шифрование не AES 256, а с использованием алгоритма ГОСТ Р 34.11-2012 "Стрибог".

Схема решения такой курсовой довольно проста. Берем какую-нибудь СУБД; в данном случае лучше проще, SQLite, к примеру. Подключаем её к какой-нибудь IDE, к NetBeans, опять же, к примеру. Далее создаем подключения, создаем файл базы, таблицы, зависимости.

Можно для отладки использовать DB Browser for SQLite – очень удобно формировать первоначально структуру, потом этим будет заниматься наша программа, но первоначально наглядно проще дб браузер.

В общем, это все понятно, несложно. Трудоемко, да. Даже если не вручную создавать формы, обработчики и тд – все равно уйдет немало времени, но в принципе все это чисто технические сложности и ничего для меня интересного нет. А вот шифрование заинтересовало.

Начнем с того, что здесь, видимо, не совсем корректно сформулирована задача. Во-первых, Стрибог – это алгоритм хэширования, а не шифрования. Иными словами, зашифрованное с помощью такого алгоритма не расшифровать. Использоваться он в данном случае может как «скрыватель» паролей, например.

То есть заносить в базу данных не пароль, а его «стрибогский» хэш. Зачем же, спросите вы, тогда заносить, если мы извлечь не сможем? А нам и не надо: просто будем сравнивать затем для входа хэш введенного и хранящегося в базе данных пароля.

На само деле это довольно распространенная практика. Очень часто для данных целей используют, к примеру, MD5 или SHA-224. В высокоуровневых языках программирования данные функции хэширования уже реализованы, так что работа с ними очень проста. Почитать об этом можно здесь.

Но вот для алгоритма ГОСТ Р 34.11-2012 "Стрибог" такой встроенной библиотеки ни в C#, ни в Java нет. А у нас есть. Пример использования (основной класс демо-программы):

import java.security.*;
import java.util.logging.*;

public class Striborg {

private static final String[] hashNames = {"Stribog256", "Stribog512"};
private static final String[] LongHashNames = {"Stribog256", "Stribog512"};

public static void main(String[] argv) throws NoSuchAlgorithmException, NoSuchProviderException {
static  String str = "upread.ru";
      byte[] message;        
        try {
            message = str.getBytes();
             System.out.println(str);
        } catch (Exception ex) {
            Logger.getLogger(Striborg.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        if (Security.getProvider("JStribog") == null) {
            Security.addProvider(new StribogProvider());
        }        
        for (String hashName : hashNames) {
            MessageDigest md = MessageDigest.getInstance(hashName);
            byte[] digest = md.digest(message);
            printHex(digest);
        }
        
     String str2 = "upread.ru - блог читающего программиста";
     byte[] message2 = str2.getBytes();
        for (String hashName : LongHashNames) {
            MessageDigest md = MessageDigest.getInstance(hashName);
            byte[] digest = md.digest(reverse(message2));
            printHex(digest);
        }
              
    }

    private static void printHex(byte[] digest) {
        for (byte b : digest) {
            int iv = (int) b & 0xFF;
            if (iv < 0x10) {
                System.out.print('0');
            }
            System.out.print(Integer.toHexString(iv).toUpperCase());
        }
        System.out.println();
    }   
}
Массив LongHashNames нужен, если необходимо хэшировать длинные строки или большие потоки данных.

Остальных классов (Stribog256.java, Stribog512.java и т.д.) тут нет. Если вам требуется помощь по программированию, то вы всегда можете связаться со мной по любым контактам. За небольшую плату я вам с удовольствием помогу.

Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, java, хэширование




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



Алгоритм Стайна
Java: наибольшее число, оканчивающееся на 0
Урок 11. Операторы сравнения в C#