2011-07-07 44 views
2

我正在开发一个Web应用程序,将用户重定向到外部Web应用程序。我想加密重定向网址,以便用户不能直接修改网址。外部供应商希望使用三重DES。这里是我的问题:加密重定向到外部网站的URL

  1. 我认为外界的Web应用程序的开发者,我将不得不交换某种“秘密钥匙”这样我们就可以解密和加密的URL,是一个正确的吗?

  2. 这是“秘密钥匙”某种文件或我们可能最初通过电子邮件交换的一些字符序列?

  3. 这是否重要,我正在用Java编写我的Web应用程序,外部供应商在.NET中编写他们的Web应用程序?

+0

它不完全清楚你正在试图在这里实现*。你可以更具体一点,也许有一个例子。这可能是你对加密重定向URL的假设可能不是答案。例如,如果您只是试图防止篡改,那么包含数字签名可能会更好。 – Qwerky

+1

基本上,用户将在我的网站上注册一个在线课程,然后当用户参加课程时,将被重定向到其他网站。另一个站点需要知道用户正在尝试和用户正在尝试的在线课程。这是应该加密的。一旦其他站点知道用户是谁,它将再次检查用户是否被允许通过Web服务来访问该课程。最重要的是我不希望用户搞乱网址并手动更改用户或课程。 – Avanst

+0

添加了有关数字签名URL参数的答案。 – Qwerky

回答

3

听起来像你需要签署请求参数,而不是加密它们。你可以尝试这样的事情;

1)使用数字签名创建要保护的数据字符串,例如,如果您的URL是;

http://www.example.com/doCourse?userid=123&courseid=abc

,你想保护你创建一个字符串的用户名和courseid参数;

courseid = ABC &的userid = 123

注意,在这些情况下是正常的创建具有按字母顺序的参数的字符串。

2)使用带有加密散列函数(如SHA-1)的Message Authentication Code来生成字符串的散列。

这样做;

Key key = ..... //You need to agree a key with the other party. 
String string = ..... //The data you want to sign eg "courseid=abc&userid=123" 
Mac mac = Mac.getInstance("HMAC-SHA1"); 
mac.init(key); 
byte[] result = mac.doFinal(string.getBytes("UTF-8"); 

MAC基本上使用一个秘密密钥(您事先与另一方一致)来生成数据的散列。

3)Base64编码,然后URLEncode将结果包含在重定向中作为参数(称之为“签名”)。

4)另一方执行与您相同的操作,它们生成字符串,使用MAC创建哈希,base64编码和URL编码。接下来,他们将请求中的签名与他们生成的签名进行比较。如果它是相同的,那么参数没有被篡改。如果散列不同,那么用户必须修改它们。

您可能还需要包含一个cryptographic nonce以防止replay attacks的请求。如果使用随机数,请确保在用于生成签名的字符串中包含随机数参数和值(确保用户不能篡改随机数)。

优势在加密

  • URL不以在Web应用程序支持这一费用obscufated。
  • 安全性可以通过Web应用程序前面的简单过滤器来实现,该应用程序只检查签名。
  • 您可以判断用户是否修改了数据,这不能仅通过加密来保证。使用TDES时,用户可能会改变密文,并意外地创建一个有效但不同的明文。
+0

由于外部供应商询问使用3DES,我认为它应该包含在答案中... – woliveirajr

+1

@woliveirajr我的建议是推回到另一方,询问是否可以选择对URL进行签名。在第三方请求类似的东西(加密url params)之前,我一直处于这种情况,但他们不理解他们试图解决的问题。一旦我指出了陷阱并建议签署请求,他们非常乐意玩。故事的道德:挑战虚假要求,如果您认为存在问题,请不要盲目接受。 – Qwerky

+0

是的,这是一个很好的方法,并且有助于避免有那么多虚弱的网站和系统在那里...我同意你的观点(但是我今天没有投票表决你的答案,我明天会回来) – woliveirajr

2

你在正确的您将需要交换一些关键的,它可以通过电子邮件或你信任的任何其他方法进行交换,而且它只是一个字符序列。只要你使用相同的加密算法,不管你使用什么编程语言。

你所描述的听起来可能不是特别安全,但也许你只是在防范非常偶然的攻击感兴趣?如果您希望获得更高的安全性,以便谁能够访问最终到达网址,您需要在提供该网址的服务器上提供某种形式的身份验证,而不是依赖不知道网址的用户 - 发现浏览器将我带到的位置非常琐碎。如果普通用户身份验证不适合您的应用程序,那么您可以考虑在查询中包含临时身份验证数据(当然,只要服务器能够验证它)。

1

1)是的。您需要提供编码/解码的密钥。 2)它可以是一个字符序列。实际上,您可以使用.NET在测试应用程序中测试强度,并以这种方式将字符串生成为字符串。 3)是的。我已经编写了一个接口,其中来自.NET的Triple-Des加密在Java中被解密。 Triple-Des算法在语言之间是相同的,只要密钥是相同的,解密/加密将表现相同。

您还想创建一个可以共享的初始化向量。

2

回答:

1 - 是的,你会交换一些密钥。既然他问你这种加密,我会请他提供密钥;

2 - 是的,无论如何,他可以为您提供关键的安全性,无论是电子邮件还是其他任何方式;

3 - 使用哪种语言并不重要。

对于我所能理解的,系统上的用户将点击一个按钮并发送到另一个站点。这个网站会有一个地址和一些参数,对吗?像http://some.address.com/some.page&param1=x&param2=2

所以你会加密的地址就像http://some.address.com/2183u49823423hj23h,就是这样吗?

因此,请谨慎加密参数,而不是整个地址(否则您的系统将无法知道去哪里)。

如果您应该以某种方式对加密信息进行编码,请查看或与其他网站开发人员交谈。 Sometinmes加密生成大量字符,有些可能在互联网和网站地址中使用很难/无聊。例如,询问他在base64中的编码。

+1

是的,是的:) – Avanst

+0

@Avanst:所以,我认为就是这样。可能还有其他一些方法,但是由于您正在处理其他网站,它告诉您要做什么,如何通过链接进行访问,我认为这就是您应该做的/知道的。祝你好运! :) – woliveirajr

0

从我对你使用了错误的方法观点:

你为什么不干脆建立一个Servlet与一个HTTP 302和要重定向到URL的反应?

没有用户能够更改URL,因为它是您正在使用的servlet的一部分。

如果您想稍后更改URL,也可以从Java属性加载URL,以便服务器管理员能够更改URL。

保持简单,愚蠢,没有任何加密也是安全的。