【问题标题】:Encrypting URL of redirect to an outside website加密重定向到外部网站的 URL
【发布时间】:2015-04-22 14:07:31
【问题描述】:

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

  1. 我假设外部 Web 应用程序的开发人员和我必须交换某种“密钥”,以便我们可以解密和加密 URL,这是正确的吗?

  2. 这个“密钥”是某种文件还是我们最初可以通过电子邮件交换的某种字符序列?

  3. 我用 Java 编写我的网络应用程序而外部供应商用 .NET 编写他们的网络应用程序有关系吗?

【问题讨论】:

  • 这里不完全清楚您要实现什么。你能说得更具体一点,也许举个例子。您对重定向 URL 进行加密的假设可能不是答案。例如,如果您只是想防止篡改,最好包含数字签名。
  • 基本上用户会在我的网站上注册在线课程,然后当用户参加课程时,将被重定向到另一个网站。另一个站点需要知道用户是谁以及用户尝试参加的在线课程。这就是应该加密的内容。一旦其他站点知道用户是谁,它将再次检查是否允许用户通过网络服务参加该课程。最主要的是我不希望用户弄乱 url 并手动更改用户或课程。
  • 添加了关于对 URL 参数进行数字签名的答案。

标签: java url encryption


【解决方案1】:

听起来您需要对请求参数进行签名,而不是对其进行加密。你可以试试这样的;

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

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

并且你想保护你创建字符串的userid和courseid参数;

courseid=abc&userid=123

请注意,在这种情况下,通常按字母顺序创建带有参数的字符串。

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

这样做;

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。如果使用 nonce,请确保在用于生成签名的字符串中包含 nonce 参数和值(确保用户无法篡改 nonce)。

相对于加密的优势

  • 不以在网络应用程序中支持这一点为代价来掩盖 URL。
  • 安全性可以通过在 Web 应用程序前面仅检查签名的简单过滤器来实现。
  • 可以判断用户是否修改了数据,仅靠加密无法保证。使用 TDES,用户可能会更改密文并意外创建有效但不同的明文。

【讨论】:

  • 既然外部厂商要求使用3DES,我认为应该将其包含在答案中...
  • @woliveirajr 我的建议是回击对方并询问是否可以选择签署 URL。在第 3 方请求类似的东西(加密 url 参数)之前,我一直处于这种情况,但他们不明白他们试图解决的问题。一旦我指出了陷阱并建议签署请求,他们就非常乐意配合。故事寓意:挑战虚假要求,如果您认为有问题,请不要盲目接受。
  • 是的,这是一个好方法,并且有助于避免有这么多薄弱的网站和系统......我同意你的看法(但我今天没有投票支持你的答案,我明天再来)
  • @Qwerky 我明白你在说什么,你关于用户修改加密 url 并且仍然有效的观点绝对值得考虑。
【解决方案2】:

您是正确的,因为您需要交换一些密钥,并且可以通过电子邮件或您信任的任何其他方法进行交换,并且它只是一个字符序列。只要您使用相同的加密算法,您使用的编程语言就无关紧要。

您所描述的内容听起来可能不是特别安全,但也许您只对防范非常随意的攻击感兴趣?如果您希望对谁可以到达最终 URL 有更好的安全性,您需要在提供该 URL 的服务器上提供某种形式的身份验证,而不是依赖不知道该 URL 的用户——发现我的浏览器将我带到了哪里是非常简单的.如果普通用户身份验证不适合您的应用程序,您可以考虑在查询中包含临时身份验证数据(当然,只要服务器能够验证它)。

【讨论】:

    【解决方案3】:

    答案:

    1 - 是的,您将交换一些密钥。既然他问你这个加密,我就让他提供密钥;

    2 - 是的,无论您认为它是安全的,他都可以为您提供密钥,无论是电子邮件还是任何其他方式;

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

    据我所知,您系统上的用户将单击一个按钮并被发送到另一个站点。这个站点会有一个地址和一些参数,对吗?喜欢http://some.address.com/some.page&param1=x&param2=2

    所以你会把地址加密成http://some.address.com/2183u49823423hj23h,就这样?

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

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

    【讨论】:

    • @Avanst:所以,我想就是这样。可能还有其他一些方法,但是由于您正在与其他站点打交道,这会告诉您该做什么,如何通过链接访问,我认为这就是您应该做/知道的全部。祝你好运! :)
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      从我的角度来看,您使用了错误的方法:

      您为什么不简单地设置一个响应 HTTP 302 和您要重定向到的 URL 的 Servlet?

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

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

      保持简单和愚蠢,并且在没有任何加密的情况下也很安全。

      【讨论】:

        猜你喜欢
        • 2015-10-04
        • 2021-09-10
        • 1970-01-01
        • 2017-04-13
        • 2020-05-13
        • 2012-06-11
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        相关资源
        最近更新 更多