Шифрование текста, хеш сумма


Этот пример показывает, что использование шифрования и получение хеш суммы очень просто.
В обработке реализовано шифрование по алгоритму AES и получение хеш суммы MD5.
Все делается динамически, без использования файлов.

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

 А что делать, если есть данные, которые разработчик не должен видеть, но у него должен быть полный доступ к системе?
 Может показаться, что это парадокс, но есть решение!
 
Шифрование данных!

 Я просто продемонстрировал, как можно использовать то, что у нас есть под рукой, Вы можете сами выбрать желаемый алгоритм, документация по ссылке: https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.aspx 

Обработкой пользоваться очень просто.

Надо:

Для шифрования

    1. Заполнить «Открытый текст» для шифрования
    2. Заполнить ключ пароль для шифрования
    3. Нажать на кнопку «Шифровать»

    В результате в поле «Закрытый текст» мы получим зашифрованную строку.

    P.S. т.к результатом шифрования является массив чисел для отображения в текстовом виде, я использую функцию
          «ЗначениеВСтрокуВнутр».
            В принципе, можно хранить или в хранилище значений, или написать свой какой-то алгоритм хранения массива. 

 Для расшифрования

    1. Заполняем закрытый текст
    2.
 Заполнить ключ пароль для расшифровки
    3. Нажимаем кнопку «Расшифровать» 


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

22 Comments

  1. nihfalck

    скачать пока не могу, к сожалению. поэтому спрошу — как .Net — класс System.Security.Cryptography.AesManaged затащили в 1С? или обошлись RijndaelManaged?

    Reply
  2. MherArsh

    (1) nihfalck, испоьлзовал класс RijndaelManaged

    Reply
  3. MherArsh

    (1) nihfalck, вопрос в том что для классу System.Security.Cryptography.AesManaged не предоставляется COM интерфейс.

    Список доступных криптографических классов которые доступны можно посмотреть программой oleview.exe от Microsoft.

    Reply
  4. nihfalck

    (3) спасибо. про утилиту oleview.exe не знал — сидел мучился методом тыка.

    Reply
  5. MherArsh

    (4) nihfalck, Пожалуйста 🙂

    Reply
  6. eugeniezheludkov

    жаль что base64, base58, hex не изобрели до сих пор, тоже мучаюсь pgp ключи храню в виде внутреннего формата 1С {#,N,100,….}…

    ПС: в 1С существует несколько способов превратить массив в base64.

    в случае с шифрами есть класс stringbuilder с его appendFormat

     Текст = Новый COMОбъект(«System.Text.UTF8Encoding»);
    КриптоSHA512 = Новый COMОбъект(«System.Security.Cryptography.SHA512Managed»);
    КриптоSHA1 = Новый COMОбъект(«System.Security.Cryptography.SHA1Managed»);
    КриптоSHA256 = Новый COMОбъект(«System.Security.Cryptography.SHA256Managed»);
    КриптоMD5 = Новый  COMОбъект(«System.Security.Cryptography.MD5CryptoServiceProvider»);
    
    оStr = Новый COMОбъект(«System.Text.StringBuilder»);
    Хэш512 = КриптоSHA512.ComputeHash_2(Текст.GetBytes_4(Т)).Выгрузить();
    Хэш1 = КриптоSHA1.ComputeHash_2(Текст.GetBytes_4(Т)).Выгрузить();
    Хэш256 = КриптоSHA256.ComputeHash_2(Текст.GetBytes_4(Т)).Выгрузить();
    Для Каждого стр Из  Хэш1 Цикл
    оStr.AppendFormat(«{0:x02}», стр);
    КонецЦикла;
    Сообщить(  оStr.ToString);

    Показать

    или так еще значениевстрокувнутр(новый хранилищезначений(массив)) так будет запись короче и проще

    Reply
  7. MherArsh

    (6) eugeniezheludkov, Привет! Спасибо, вариант хороший!

    Я с начала тоже думал привести к определенному формату, но в результате возврата мы получаем массив,

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

    внешнего использовать 🙂

    А для base64 есть класс доступный через COM.

    Называется — «FromBase64Transform»

    https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.frombase64transform.aspx

    Reply
  8. dctvghbdtn

    А можно открытый кусочек кода для AES? Как зашифровать и расшифровать строку.

    Reply
  9. MherArsh

    (8) На 1С? или на .Net?

    Reply
  10. dctvghbdtn

    (9) На 1С. 🙂 Не могу скачать обработку, не хватает «кредитов».

    Reply
  11. MherArsh

    (10) ну на 1С такого не могу предложить но могу на C#.

    Reply
  12. dctvghbdtn

    (11) так пример в обработке, которую вы опубликовали http://infostart.ru/public/346065/ 🙂

    Reply
  13. MherArsh

    (12) В винде AES доступен по COM «System.Security.Cryptography.RijndaelManaged».

    Вот примеры использования библиотеки:

    https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx

    https://www.codeproject.com/Tips/704372/How-to-Use-Rijndael-ManagedEncryption-with-Csharp

    А как в 1С сделать вызов функций можно посмотреть в моей обработке.

    Reply
  14. ture

    (0) я тоже md5 считал раньше http://infostart.ru/public/275138/

    но интересней шифрование ГОСТ 28147-89, которого нет в System.Security.Cryptography. Знаешь как?

    Reply
  15. MherArsh

    (12) для MD5 есть «System.Security.Cryptography.MD5CryptoServiceProvider», все таки это нативный интерфейс провайдера через скрипт могут быть разные проблемы, но это к слову.

    Верно, ГОСТ 28147-89 это российский, поэтому наверное нет и до 1989г. алгоритм был закрытым кстати )

    Когда что то не хватает в 1С я пишу invoke метод на C#, регистрирую через regasm и все, функция становится доступной через com.

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

    Вот описание алгоритма и реализация, в конце стати можно скачать исходники.

    https://habrahabr.ru/post/256843/

    Если по invoke-у не разберешься могу найти у себя шаблон.

    Reply
  16. dctvghbdtn

    Объясните пожалуйста почему используется недокументированная функция ComputeHash_2? Может быть так, что завтра ее не будет в методах?

    Reply
  17. MherArsh

    (16)

    ComputeHash_2

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

    Reply
  18. dctvghbdtn

    Про 1С. 🙂 Нашел вот такое в документации:

    Механизм криптографии «1С:Предприятия» не содержит реализации собственно алгоритмов криптографии. Он обеспечивает набор объектов, позволяющих взаимодействовать с внешними модулями криптографии сторонних производителей.

    Для взаимодействия с модулями криптографии в ОС Windows используется Microsoft CryptoAPI.

    Для взаимодействия с модулями криптографии в ОС Linux используется непосредственное взаимодействие с установленными компонентами.

    Reply
  19. MherArsh

    (18) я этот API по моему смотрел, поддержка по моему начинается в поздних версиях 1С и там когда я смотрел была возможность шифрования только по файлам, а мене надо была шифровать и расшифровать таблицы в реальном времени

    Reply
  20. MherArsh

    (18) не забудь поделится примером

    Reply
  21. dctvghbdtn

    По поводу суффикса нашел вот это короткое обсуждение

    http://stackoverflow.com/questions/36384741/cant-use-getbytes-and-computehash-methods-on-vba

    Если так, то наличие суффиксов, это не недокументированная функция, а «способ» перегрузки функций Net при использовании COM

    Reply
  22. dctvghbdtn

    Массив можно хранить так, взято по аналогии из «Библиотека стандартных подсистем»:

    //1
    Результат = СоздатьВекторИнициализации();
    //2 Массив в строку
    Хранилище = Новый ХранилищеЗначения(Результат.Выгрузить(), Новый СжатиеДанных(9));
    Результат = XMLСтрока(Хранилище);
    //3 Из строки в массив
    Хранилище = XMLЗначение(Тип(«ХранилищеЗначения»), Результат);
    Результат = Хранилище.Получить();

    По моему мнению конечно по ресурсам затратно. Что можно еще использовать?

    А использовать ЗначениеИзСтрокиВнутр и ЗначениеВСтрокуВнутр 1С-ники сами не рекомендуют:

    Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется.

    Reply

Leave a Comment

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