我正在开发一个将用户重定向到外部Web应用程序的Web应用程序。我想加密重定向网址,以便用户无法直接修改网址。外部供应商想要使用三重DES。这是我的问题:
我假设外部Web应用程序的开发人员和我将不得不交换某种“密钥”,以便我们可以解密和加密URL,这是正确的吗?
这个“秘密密钥”是某种文件还是我们最初可能通过电子邮件交换的一些字符序列?
我用Java编写Web应用程序并且外部供应商用.NET编写Web应用程序是否重要?
答案 0 :(得分:3)
听起来您需要签署请求参数,而不是加密它们。你可以尝试这样的事情;
1)使用数字签名创建要保护的数据字符串,例如,如果您的网址是;
并且您希望保护创建字符串的userid和courseid参数;
courseid = ABC&安培;用户ID = 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并将其作为参数包含在重定向中(称之为'signature')。
4)另一方执行与您相同的操作,生成字符串,使用MAC创建哈希,base64编码和URL编码。接下来,他们将请求中的签名与他们生成的签名进行比较。如果它是相同的那么参数没有被篡改。如果哈希值不同,则用户必须修改它们。
您可能还希望在cryptographic nonce中添加阻止replay attacks的请求。如果使用随机数,请确保在用于生成签名的字符串中包含nonce参数和值(确保用户无法篡改nonce)。
优于加密的优势
答案 1 :(得分:2)
你是正确的,因为你需要交换一些密钥,并且可以通过电子邮件或任何其他你信任的方法进行交换,而且它只是一系列字符。只要您使用相同的加密算法,您使用的是哪种编程语言都无关紧要。
您所描述的内容听起来可能不是特别安全,但也许您只对防范非常偶然的攻击感兴趣?如果您希望更好地了解谁可以访问最终URL,您需要在提供该URL的服务器上提供某种形式的身份验证,而不是依赖于不知道URL的用户 - 发现我的浏览器带我到哪里是非常微不足道的。如果普通用户身份验证不适合您的应用程序,您可以考虑在查询中包含时态身份验证数据(当然,只要服务器能够验证它)。
答案 2 :(得分:2)
数目:
1 - 是的,你会换一些钥匙。因为他问你这个加密,我会请他提供密钥;
2 - 是的,无论如何,无论如何,无论是电子邮件还是其他任何方式,他都可以为您提供密钥;
3 - 使用哪种语言并不重要。
根据我的理解,您系统上的用户将点击按钮并发送到其他网站。这个网站会有一个地址和一些参数,这是对的吗?比如http://some.address.com/some.page¶m1=x¶m2=2
所以你会加密地址就像http://some.address.com/2183u49823423hj23h
,就是这样吗?
因此,要小心加密参数,而不是整个地址(或者你的系统无法知道去哪里)。
如果您应该以某种方式编码加密信息,请查看或与其他网站开发人员交谈。 Sometinmes加密会生成大量字符,有些可能很难/无聊,无法在互联网和网站地址中使用。例如,问他关于base64中的编码。
答案 3 :(得分:1)
1)是的。您需要提供编码/解码的密钥。 2)它可以是一系列字符。您实际上可以使用.NET来测试测试应用程序中的强度,并以此方式生成密钥作为字符串。 3)是的。我编写了一个接口,用.NET解密.NET中的Triple-Des加密。 Triple-Des的算法在语言之间是相同的,因此只要密钥相同,解密/加密就会表现相同。
您还需要创建一个可以共享的初始化向量。
答案 4 :(得分:0)
从我的观点来看,你使用了错误的方法:
为什么不简单地设置一个使用HTTP 302响应的Servlet以及要重定向到的URL?
没有用户可以更改URL,因为它是您正在使用的servlet的一部分。
如果您想稍后更改网址,您还可以从Java属性加载网址,以便服务器管理员可以更改网址。
保持简单和愚蠢,并且在没有任何加密的情况下也是安全的。