【发布时间】:2012-01-29 12:30:46
【问题描述】:
我的组织已决定对我们数据库中的某些数据进行加密,我被赋予了实施加密的任务。我需要能够加密数据,将加密版本存储在我们数据库的 VARCHAR 字段中,然后检索它并将其解密回正常状态。
从表面上看,这似乎是一项简单的任务。有多种方法可以实现加密。我之前使用过的一种是基于this StackOverflow question 中的 AES 加密代码。
在这种情况下更难的是,我需要编写代码来加密/解密访问我们数据库的各种应用程序中的数据,其中一些应用程序是使用不同的技术开发的。我们有使用 Coldfusion 5、Classic ASP 和 ASP.NET 2.0 编写的应用程序。我需要能够使用 Coldfusion 代码加密数据并将其存储在数据库中,然后在 ASP.NET 中将其读取并解密回其原始形式。或者在 Classic ASP 中加密它并在 Coldfusion 中解密。或这些平台的任何其他组合。
事实证明,这比我预期的要难。即使给定相同的数据和相同的共享密钥,声称使用相同算法的不同类/对象/函数/库似乎也会产生不同的结果。过去,我们使用 CAPICOM 在 Coldfusion 和 Classic ASP 之间提供加密互操作性。但是我在尝试让它在 ASP.NET 中工作时遇到了麻烦。我读过this article about how to get CAPICOM to work in .NET,但这些建议对我没有用。我什至无法生成互操作类或导入对 COM 对象的引用而不会出错。此外,我们的一些生产服务器的操作系统似乎与 CAPICOM 不兼容,因此无论如何这可能是一条死胡同。
对于我如何实现加密,让 3 个平台中的任何一个都可以解密其他平台加密的内容,同时仍然使用相当强大的算法,是否有人有任何建议?
2011-12-29 编辑:
正如下面的 cmets 所述,我目前希望找到一个 ASP.NET 解决方案,它与我们现有的一些使用 CAPICOM 的 Coldfusion/ASP Classic 代码兼容。这样做的原因是,我们的团队负责人不希望我为我们当前的目的在我们的代码中引入一种新的加密方法,除非我还修改了使用加密的旧应用程序以用于不同的目的以使用相同的方法。他想为这两个目的使用相同的加密方法。由于修改我们的旧应用程序以使用新的加密方法不仅意味着更改代码,还意味着跟踪旧应用程序加密的所有数据,解密并使用新方法重新加密,所以我犹豫不决除非我必须这样做,否则这条路线。希望我能找到一种方法让 ASP.NET 读取现有的加密数据。
来自我们其他 Coldfusion 和 ASP Classic 应用程序的加密数据是使用 CAPICOM COM 对象编码的。据我所知,这些设置普遍是 AES 加密、最大密钥大小(我相信在 AES 中是 256 位)。
应@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>
【问题讨论】:
-
请注意您的标签选择。
asp标签被证明是模棱两可的,并被清理以支持asp-classic。您在 Stack Overflow 上的唯一问题会被标记为asp,这应该会引起很大的危险。 -
@Joel 我很抱歉。没注意,以后会仔细看的。
-
您使用的是什么数据库产品?
-
@Joshua - 哦,我没有意识到你使用的是 CF 的 CAPICOM,而不是内置的加密函数。根据我所读到的,CAPICOM 的做法与此断开的链接中描述的有所不同:jensign.com/JavaScience/dotnet/DeriveBytes。您可以使用wayback machine 查看它。您对互操作程序集有什么问题,因为这似乎是最简单的方法?
标签: asp.net encryption asp-classic coldfusion