Как реализовать надежное, обратимое шифрование, взаимодействующее между ASP.NET 2.0, Coldfusion 5 и Classic ASP?

Моя организация решила зашифровать определенные данные в нашей базе данных, и мне поручили внедрить шифрование. Мне нужно иметь возможность зашифровать данные, сохранить зашифрованную версию в поле 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, но предложения мне не помогли. Я даже не могу сгенерировать класс interop или импортировать ссылку на COM-объект без получения ошибки. Кроме того, некоторые из наших производственных серверов имеют операционные системы, не совместимые с CAPICOM, так что это может быть тупиком в любом случае.

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

Edit 2011-12-29:

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

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

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


    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();

6
задан Community 23 May 2017 в 12:24
поделиться