如何在JavaScript中加密字符串并在C#中解密该字符串

17

我之前看过这个问题,不过那些情况通常是希望在公共网站上加密某些东西(通常是URL),而回答大多数都是“不要这么做!”。然而,在我的情况下,JavaScript将存储在非公开的内部系统中,所以我认为我有更多的自由度。一个类似问题的例子是:如何在JavaScript中加密URL并在C#中解密,而答案实际上并没有回答这个问题。

我的“JavaScript”实际上是“SuiteScript”,它被定义为“SuiteScript是基于JavaScript的API,使开发人员能够扩展NetSuite”,其中NetSuite是一种托管的CRM软件包,因此用于加密字符串的任何编码都会对外隐藏,只有我的公司员工可以访问(因此被认为是安全隐藏的)。

我的目标是:

  1. 生成一个查询字符串(例如,userid=guidValue&firstName=stringValue&company=stringValue&...),
  2. 使用安全方法(如AES256、RSA或者其他人可以建议的安全方法)进行加密,
  3. 调用基于C#的网站上的一个网页,将这个字符串作为URL传递进去(例如,mysite.com/mypage.aspx?encStr=encryptedString),
  4. 让C#页面对其进行解密,将名称/值对分开并进行处理。

我已经在谷歌和Stack Overflow上搜索过了,但没有找到任何提供清晰指导的加密方法可以被两种技术使用。有人有这样的指导吗?


2
你试图保护信息免受谁的侵害?如果是内部系统,每个人不都应该被隐式信任吗?如果不是这样,那么它非公开的事实根本没有任何区别。你无法在Web浏览器客户端加密而不发送所有必要的代码来破解安全性。 - Pointy
2
如果您通过 SSL 进行表单提交,则不需要加密消息。为此进行显式加密将是过度杀伤力。 - Phil
HTTPS不是一个选项,因为我无法控制托管的NetSuite服务器。当字符串发送到我的基于C#的网站时,我需要保护信息免受窥探。我不需要发送所需的代码来解决安全欺骗问题。我认为,如果JavaScript中使用了“密钥”,并且该“密钥”在C#中可用(而无需发送),则可以进行解密。 - QMKevin
请确认一下,您的接收网站是否托管在NetSuite服务器上? - Phil
不,接收网站托管在其他地方。我明白你的意思,但在这种情况下HTTPS仍然不是一个选项。 - QMKevin
1个回答

19

对称加密

最简单的方法是使用库,例如Stanford Javascript Crypto Library来实现标准(在本例中为AES),并在C#中使用相同的密码(通过AesManagedAesCryptoServiceProvider)。

您将获得对称密码,但是只需设置一个参数(密钥)即可使两个库正常工作。

非对称加密

您也可以使用非对称(公钥)密码。攻击者获取javascript代码后可以向服务器发送伪造请求,但无法截取其他请求。

javascript中有RSA的实现RSACryptoServiceProvider类提供了.Net支持。

Code project中提供了完整的示例,包括支持填充的RSA javascript lib路径(在使用.Net实现时是必需的)。

注意

这两种方法本身都容易受到重放攻击(攻击者截取一个字符串并稍后将其发送回服务器--有可能多次)。


我会看一下,但是这里需要调查的内容比我预期的要多。 - QMKevin
我肯定会使用非对称密码。使用对称密码需要将密钥发送给客户端,这意味着“窥探者”可能会拦截该密钥并轻松解密来回的所有流量(从而失去了目的)。 - The Moof
这很有道理,听起来像是我想做的事情...但是怎么做呢?我真的在寻找一些指导,而不是进一步调查的途径。并不是因为我懒,而是因为我发现这非常难以理解,而且我通过实践学习效果更好(即我更喜欢“给我一条鱼”而不是“教我如何钓鱼”,尤其是当时间限制生效时,它们是)。 - QMKevin
我添加了一个链接到一个代码项目,其中包含示例代码来完成此操作(它的示例有点复杂,但在C#和javascript之间使用了RSA密码)。 - Julien Roncaglia
太棒了,谢谢!我会审查这个代码项目并回复你。 - QMKevin
更新一下:我的项目经理要求我调查在这个项目中使用OAuth,我在这里得到了帮助和答案:http://stackoverflow.com/questions/6933003/should-i-be-using-oauth-to-pass-data-across-servers-from-javascript-to-c。使用oauth.net上找到的JavaScript和C#代码,我成功地实现了安全传输数据。 - QMKevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接