Хеширование Данных

Печать (Ctrl+P)

Возможность расчета хеш-суммы по добавленным данным на платформе 1С предприятие 8 появилась при выходе редакции 8.3.1 в
мае 2013 года. Объект  доступен только на сервере и создается  таким образом :

ХешированиеДанных  = Новый ХешированиеДанных (ХешФункция) ;
ХешированиеДанных.Добавить(Данные );
ХешСумма = ХешированиеДанных.ХешСумма;

Объект  ХешированиеДанных реализует инкрементальный расчет хеш-суммы по добавленным данным. Способ расчета и тип вычисляемого значения определяются типом хеш-функции.
Системное перечисление Хешфункция  обязателен и  имеет следующие значения:

  • CRC32   – Циклический избыточный код http://wiki-org.ru/wiki/CRC#CRC-32
  • MD5 – (англ. Message Digest 5) — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института (Massachusetts Institute of Technology, MIT) в 1991 году. Предназначен для создания «отпечатков» или «дайджестов» сообщений произвольной длины и последующей проверки их подлинности. Является улучшенной в плане безопасности версией MD4. http://wiki-org.ru/wiki/MD5
  • SHA1 – алгоритм криптографического хеширования .
    Принципы, положенные в основу SHA-1, аналогичны тем, которые использовались при проектировании MD4
  • SHA256 – семейство криптографических алгоритмов — однонаправленных хеш-функций, включающее в себя алгоритмы SHA-224, SHA-256, SHA-384, SHA-512…

Возможность вычисления значения хеш-функции по алгоритмам MD5 и CRC32 с помощью объекта ХешированиеДанных появилось на платформе 1С:Предприятие 8.3.1 . Затем,  в редакции 8.3.3 был расширен набор поддерживаемых хеш-функций и добавили  возможность вычисления  хеш – функций SHA1 и SHA256.

Можно также добавить имя файла с двоичными данными , а также текстовые данные:

ХешированиеДанных = ДобавитьФайл("С:/MyFile.txt") ; 
ХешированиеДанных = Добавить("Hello Word!") ;

Следующий программный код выводит значение
ХешСумма  строки “Hello Woord!” при разных способах расчета

ХешированиеДанных  = Новый ХешированиеДанных (ХешФункция.CRC32) ;
ХешированиеДанных.Добавить("Hello Word!" );
Сообщить(ХешированиеДанных.ХешСумма);
ХешированиеДанных = Новый ХешированиеДанных (ХешФункция.MD5) ;
ХешированиеДанных.Добавить("Hello Word!");
Сообщить(ХешированиеДанных.ХешСумма);
ХешированиеДанных = Новый ХешированиеДанных (ХешФункция.SHA1) ;
ХешированиеДанных.Добавить("Hello Word!" );
Сообщить(ХешированиеДанных.ХешСумма);
ХешированиеДанных = Новый ХешированиеДанных (ХешФункция.SHA256) ;
ХешированиеДанных.Добавить("Hello Word!" );
Сообщить(ХешированиеДанных.ХешСумма);
Значение хеш-суммы строки
“Hello Word!” при разных способах расчетах

Примеры использования
ХешированиеДанных в БСП 2.4

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

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

1.Вычисление контрольной суммы для произвольных данных по указанному алгоритму.

Параметры:
Данные – Произвольный – любое сериализуемое значение.
Алгоритм – ХешФункция – алгоритм расчета контрольной суммы. По умолчанию, MD5
Возвращаемое значение:
Строка – контрольная сумма строкой без пробелов, 32 байта.

Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) Экспорт

	Если Алгоритм = Неопределено Тогда
		Алгоритм = ХешФункция.MD5;
	КонецЕсли;
	
	ХешированиеДанных = Новый ХешированиеДанных(Алгоритм);
	Если ТипЗнч(Данные) <> Тип("Строка") И ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
		Данные = ЗначениеВСтрокуXML(Данные);
	КонецЕсли;
	ХешированиеДанных.Добавить(Данные);
	Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
	
	Возврат Результат;
КонецФункции

2.Работа со строкой произвольной длины

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

Параметры:
Строка – Строка – исходная строка произвольной длины.
Максимальная Длина – Число – требуемое максимальное количество символов в строке ( минимальное значение: 32)
Возвращаемое значение: Строка – строка, не превышающая максимальную длину.

Функция СократитьСтрокуКонтрольнойСуммой(Строка, МаксимальнаяДлина) Экспорт
ОбщегоНазначенияКлиентСервер.Проверить(МаксимальнаяДлина >= 32, НСтр("ru = 'Параметр МаксимальнаяДлина не может быть меньше 32'"),
"ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой");

Результат = Строка;
Если СтрДлина(Строка) > МаксимальнаяДлина Тогда
Результат = Лев(Строка, МаксимальнаяДлина - 32);
ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
ХешированиеДанных.Добавить(Сред(Строка, МаксимальнаяДлина - 32 + 1));
Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
КонецЕсли;
Возврат Результат;
КонецФункции

3.Разделить файл на части , поместить части во временный каталог.

Параметры:
ИмяФайла – Строка – имя файла, который требуется разделить на части.
РазмерЧастиВМегабайтах – Число – размер одной части файла в мегабайтах.
Возвращаемое значение:
Массив – полученные части файла, структура с ключами:
* Хранение – Строка – положение файла на сервере,
* ХешСумма – Число – значение хеш-суммы, полученное функцией CRC32.

Функция РазделитьФайлНаЧасти(ИмяФайла, ЭтоВебКлиент, РазмерЧастиВМегабайтах = 0)
Результат = Новый Массив;
// Размер части в байтах. По умолчанию по 100 Мб.
РазмерЧасти = ?(РазмерЧастиВМегабайтах <= 0, 100, РазмерЧастиВМегабайтах) * 1024 * 1024;

// Определение необходимости разделения файла.
Если ЭтоВебКлиент Тогда
    // Веб-клиент не поддерживает объединение файлов.
    Разделять = Ложь;
Иначе
    // Проверка размера файла.
    РазделяемыйФайл = Новый Файл(ИмяФайла);
    Разделять = РазделяемыйФайл.Размер() > РазмерЧасти;
КонецЕсли;
Если Разделять Тогда
    Попытка
        // Создание временного каталога для хранения частей файла, чтобы в случае неудачи при разделении удалить весь каталог.
        // Имена созданных файлов в случае неудачи неизвестны.
        ВременныйКаталог = ПолучитьИмяВременногоФайла();
        СоздатьКаталог(ВременныйКаталог);
        // Разделение файла на части.
        ИменаЧастей = РазделитьФайл(ИмяФайла, РазмерЧасти, ВременныйКаталог);
        Для каждого ИмяЧасти Из ИменаЧастей Цикл
            // Для каждого имени файла сохраняется хеш, чтобы не было возможности получить другой файл.
            // Клиент при запросе части файла должен запросить имя файла и указать хеш.
            ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.CRC32);
            ХешированиеДанных.ДобавитьФайл(ИмяЧасти);

            Результат.Добавить(Новый ФиксированнаяСтруктура("Хранение, ХешСумма", ИмяЧасти, ХешированиеДанных.ХешСумма));

        КонецЦикла;

    Исключение // По каким-то причинам файл разделить не удалось.

        // Удаление временного каталога с созданными частями файла.
        ВыгрузкаЗагрузкаДанныхСлужебный.УдалитьВременныйФайл(ВременныйКаталог);

        // Разделить не удалось, отдать сам файл.
        Разделять = Ложь;

    КонецПопытки;

КонецЕсли;

// Разделять не требуется или не получилось разделить, отдать сам файл.
Если НЕ Разделять Тогда

    Результат = Новый ДвоичныеДанные(ИмяФайла);

КонецЕсли;

Возврат Результат;
КонецФункции

Previous Article
Next Article

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.