Хеширование Данных
Возможность расчета хеш-суммы по добавленным данным на платформе 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!" );
Сообщить(ХешированиеДанных.ХешСумма);
Примеры использования
ХешированиеДанных в БСП 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); ХешированиеДанных.ДобавитьФайл(ИмяЧасти); Результат.Добавить(Новый ФиксированнаяСтруктура("Хранение, ХешСумма", ИмяЧасти, ХешированиеДанных.ХешСумма)); КонецЦикла; Исключение // По каким-то причинам файл разделить не удалось. // Удаление временного каталога с созданными частями файла. ВыгрузкаЗагрузкаДанныхСлужебный.УдалитьВременныйФайл(ВременныйКаталог); // Разделить не удалось, отдать сам файл. Разделять = Ложь; КонецПопытки; КонецЕсли; // Разделять не требуется или не получилось разделить, отдать сам файл. Если НЕ Разделять Тогда Результат = Новый ДвоичныеДанные(ИмяФайла); КонецЕсли; Возврат Результат; КонецФункции