Обработка предназначена для шифрование строковых полей - паролей пользователей или других строковых значений через строковый ключ методом XOR.
Разработка и тестирование было на платформе 1С 8.3.16. Подходит под любую конфигурацию.
Это не готовое решение, а только механизм шифрование. Для его внедрения в вашу базу нужно будет перенести основные процедуры в вашу конфигурацию и подключить их.
Они представлены в виде обработки с простым интерфейсом.
За основание взято шифрования на JAVA
public static byte[] encode(String pText, String pKey) { byte[] txt = pText.getBytes(); byte[] key = pKey.getBytes(); byte[] res = new byte[pText.length()]; for (int i = 0; i < txt.length; i++) { res[i] = (byte) (txt[i] ^ key[i % key.length]); } return res; }
///////////////////////////////////////////
Аналог функции на 1С
&НаСервере
Функция xor_encode(pText,pKey)
СистемнаяИнформация = Новый СистемнаяИнформация;
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения,"8.3.9.0") > 0 Тогда
_txt = getBytes(pText);
_key = getBytes(pKey);
Иначе
_txt = Преобразовать64(Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(pText)));
_key = Преобразовать64(Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(pKey)));
КонецЕсли;
_res = Новый Массив(); //СтрДлина(pText));
Для i = 0 по _txt.Count() - 1 Цикл
_res.add(BitwiseXor(_txt[i] , _key[(i % _key.Count())]));
КонецЦикла;
//Строка64ИзБайтов = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Преобразовать64(,_res)),"windows-1252");
Строка64ИзБайтов = getStringBase64(_res);
Возврат Строка64ИзБайтов;
КонецФункции
дешифрование на java
public static String decode(byte[] pText, String pKey) { byte[] res = new byte[pText.length]; byte[] key = pKey.getBytes(); for (int i = 0; i < pText.length; i++) { res[i] = (byte) (pText[i] ^ key[i % key.length]); } return new String(res); }
Аналог на 1С
&НаСервере
Функция xor_decode(pText,pKey)
СистемнаяИнформация = Новый СистемнаяИнформация;
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения,"8.3.9.0") > 0 Тогда
_key = getBytes(pKey);
Иначе
_key = Преобразовать64(Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(pKey)));
КонецЕсли;
_res = Новый Массив(pText.Count());
Для i = 0 по pText.Count() - 1 Цикл
_res[i] = BitwiseXor(pText[i] , _key[(i % _key.Count())]);
КонецЦикла;
//Строка64ИзБайтов = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Преобразовать64(,_res)));
Строка64ИзБайтов = getString(_res);
Возврат Строка64ИзБайтов;
КонецФункции
Все дополнительные процедуры в обработке. Работает на 8.3.15.
&НаСервере
Функция getBytes(pText)
BytesArray = New Array();
BinaryStrem = GetBinaryDataFromString(pText).OpenStreamForRead();
DataReader = New DataReader(BinaryStrem, TextEncoding.UTF8, ByteOrder.BigEndian);
DataBuffer = DataReader.ReadIntoBinaryDataBuffer();
//пройдемся по каждому байту буфера
For Each Byte in DataBuffer Do
BytesArray.Add(Byte);
EndDo;
Return BytesArray;
КонецФункции
&НаСервере
Функция getBytesFromStr64(base64)
bindata = Base64Значение(base64);
HexСтрока = ПолучитьHexСтрокуИзДвоичныхДанных(bindata);
BinaryStrem = ПолучитьДвоичныеДанныеИзHexСтроки(HexСтрока).ОткрытьПотокДляЧтения();
BytesArray = New Array();
DataReader = New DataReader(BinaryStrem, TextEncoding.UTF8, ByteOrder.BigEndian);
DataBuffer = DataReader.ReadIntoBinaryDataBuffer();
//пройдемся по каждому байту буфера
For Each Byte in DataBuffer Do
BytesArray.Add(Byte);
EndDo;
Return BytesArray;
КонецФункции
&НаСервере
Функция getString(BytesArray)
DataBuffer = Новый БуферДвоичныхДанных(BytesArray.Количество(),ByteOrder.BigEndian);
For Byte = 0 по BytesArray.Количество() -1 Do
DataBuffer.Установить(Byte,BytesArray[Byte]);
EndDo;
Return ПолучитьСтрокуИзБуфераДвоичныхДанных(DataBuffer,TextEncoding.UTF8);
КонецФункции
&НаСервере
Функция getStringBase64(BytesArray)
DataBuffer = Новый БуферДвоичныхДанных(BytesArray.Количество(),ByteOrder.BigEndian);
For Byte = 0 по BytesArray.Количество() -1 Do
DataBuffer.Установить(Byte,BytesArray[Byte]);
EndDo;
Return Base64Строка(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(DataBuffer));
КонецФункции
Есть аналоги процедуры для 8.2.