Как я могу реализовать надежное, обратимое шифрование, которое взаимодействует между ASP.NET 2.0, Coldfusion 5 и Classic ASP? - PullRequest
6 голосов
/ 29 декабря 2011

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

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

Что в этом случае затрудняет то, что мне нужно написать код для шифрования / дешифрованияданные в различных приложениях, которые обращаются к нашей базе данных, некоторые из которых разработаны с использованием различных технологий.У нас есть приложения, написанные на Coldfusion 5, на Classic ASP и на ASP.NET 2.0.Мне нужно иметь возможность зашифровать данные и сохранить их в базе данных с помощью кода Coldfusion, а затем прочитать и расшифровать их в исходном виде в ASP.NET.Или зашифруйте его в Classic ASP и расшифруйте в Coldfusion.Или любая другая комбинация этих платформ.

Это оказалось сложнее, чем я ожидал.Разные классы / объекты / функции / библиотеки, которые утверждают, что используют одни и те же алгоритмы, по-видимому, дают разные результаты, даже если даны одни и те же данные и один и тот же общий секрет.В прошлом мы использовали CAPICOM для обеспечения взаимодействия шифрования между Coldfusion и Classic ASP.Но я столкнулся с проблемой, пытаясь заставить это работать в ASP.NET.Я прочитал эту статью о том, как заставить CAPICOM работать в .NET , но эти предложения не сработали для меня.Я даже не могу создать класс взаимодействия или импортировать ссылку на COM-объект без ошибки.Кроме того, некоторые из наших производственных серверов имеют операционные системы, которые, по-видимому, не совместимы с CAPICOM, так что в любом случае это может быть тупик.

Есть ли у кого-нибудь какие-либо предложения относительно того, как я могу реализовать шифрование в такой ситуации?каким образом любая из 3 платформ может расшифровать то, что зашифровали другие, при этом используя достаточно сильный алгоритм?

Редактировать 2011-12-29:

КакКак отмечается в комментариях ниже, в настоящее время я надеюсь найти решение ASP.NET, которое совместимо с некоторыми из наших существующих кодов Coldfusion / ASP Classic, использующих CAPICOM.Причина этого в том, что наш руководитель группы не хочет, чтобы я ввел новый метод шифрования в наш код для нашей текущей цели, если только я не пересмотрю наши старые приложения, использующие шифрование для другой цели, чтобы использовать тот же метод.Он хочет использовать один и тот же метод шифрования для обеих целей.Поскольку пересмотр старых приложений для использования нового метода шифрования означает не только изменение кода, но и отслеживание всех данных, зашифрованных старыми приложениями, их расшифровку и повторное шифрование с использованием нового метода, поэтому я не решаюсьэтот маршрут, если я не должен.Надеюсь, я найду способ заставить ASP.NET читать существующие зашифрованные данные.

Зашифрованные данные из других наших приложений Coldfusion и ASP Classic были закодированы с использованием COM-объекта CAPICOM.Насколько я могу судить, в качестве универсальных настроек использовалось шифрование AES, максимальный размер ключа (который, как мне кажется, 256-битный в AES).

По запросу @Leigh приведен упрощенный пример того, как наши существующиеПриложения CF используют CAPICOM:

<cfscript>
    encryptObject = CreateObject("com","CAPICOM.EncryptedData");
    encryptObject.Algorithm.Name = 4; // 4 is AES
    encryptObject.Algorithm.KeyLength = 0; // 0 is MAX, I believe 256-bit in the case of AES
    encryptObject.SetSecret(sharedSecret);
    encryptObject.Content = stringToEncrypt;

    encryptedData = localScope.encryptObject.Encrypt();
</cfscript>

Ответы [ 4 ]

6 голосов
/ 29 декабря 2011

Поскольку у вас есть общая платформа базы данных между всеми системами, я бы оставил там ваше шифрование / дешифрование. Вот статья о специфичном для столбцов шифровании в SQL 2005:

http://msdn.microsoft.com/en-us/library/ms179331(v=sql.90).aspx

2 голосов
/ 29 декабря 2011

Я просто сделал похожую вещь (шифрование между классическим ASP и ASP .NET, игнорируя Coldfusion), и я тоже несколько раз сталкивался с CAPICOM, но после долгих поисков и поисков (я нашел) я нашел COM AES / Rijndaelбиблиотека, которую я в итоге использовал, Hyeongryeol.Security.Cryptography (по какой-то причине загрузка называется .wma - это zip-файл, поэтому откройте его вручную с помощью 7-Zip или любого другого файла).

Шифрование / дешифрование в .NET использует класс RijndaelManaged (пример в загрузке).

В общем, начать работу очень просто.Просто зарегистрируйте COM DLL (для Classic ASP), и это должно быть хорошо.Вот отрывок из нашего build.bat, который гарантирует (надеется), что он зарегистрирован:

echo Registering HyeongryeolStringEncrypter.dll
copy Libraries\Hyeongryeol.Security.Cryptography\ASP\HyeongryeolStringEncrypter.dll %system32%\HyeongryeolStringEncrypter.dll
regsvr32 /s %system32%\HyeongryeolStringEncrypter.dll

Просто убедитесь, что вы используете одну и ту же клавишу / IV с обеих сторон.

1 голос
/ 03 июня 2013

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

  1. У нас есть существующий сайт CF, и мыпереработав его с использованием ASP.NET и поставщика членства.
  2. Мы хотели сохранить пароли от существующих CF, но перенести их в таблицу aspnet_membership и хэшировать их.
  3. Мы также хотели иметь возможность изменитьпароль от любой системы, так как они будут работать одновременно не более 3 месяцев.
  4. Это означает, что мы хотим иметь возможность обновлять таблицу aspnet_membership из CF и также выполнять аутентификацию на этой таблице.

Приведенный ниже код позволяет нам хэшировать пароль от CF и сопоставлять его с таблицей aspnet_membership.Если Base64Hash совпадает с паролем в таблице, то пользователь может быть аутентифицирован.Теперь мы можем зашифровать пароль, если пользователь захочет сменить пароль со стороны CF и все еще пройти проверку на стороне ASP.NET.

Обновление ( Исправлена ​​проблема с конкатенацией)

<cfscript>
    thePassword = "originalPassword";
    base64Salt = "JZjdzUXREM0A7DPI3FV3iQ==";

    // extract bytes of the salt and password
    saltBytes = binaryDecode(base64Salt, "base64");
    passBytes = charsetDecode(thePassword, "UTF-16LE" );

    // next combine the bytes. note, the returned arrays are immutable, 
    // so we cannot use the standard CF tricks to merge them    
    ArrayUtils = createObject("java", "org.apache.commons.lang.ArrayUtils");
    dataBytes = ArrayUtils.addAll( saltBytes, passBytes );

    // hash binary using java
    MessageDigest = createObject("java", "java.security.MessageDigest").getInstance("SHA-1");
    MessageDigest.update(dataBytes);    
    theBase64Hash = binaryEncode(MessageDigest.digest(), "base64");

    WriteOutput("<br />theBase64Hash= "& theBase64Hash &"<br/>");
</cfscript>
0 голосов
/ 29 декабря 2011

Шифрование - это просто изменение ваших данных, чтобы они не читались человеком, а затем измените их обратно, используя обратную исходную формулу.

Я лично буду придерживаться AES, и вы сможете получить AES для этих платформ.

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

Может быть так же просто, как добавить серию битов к информации на основе некоторого ключа.

...