URL 标识符的加密算法

Encryption algorithm for URL Identifiers

我正在开发一个 Spring Web 应用程序,遇到需要在 URI 中传递标识符的场景(通过 HTTPS 获取),例如:https://www.targetdomain.com/services?id=123。这个 URI 出现在最终用户浏览器上,我担心的是,任何人都可以篡改这个 link 在我的数据库中作为 table.[=14 之一的主键的标识符“123” =]

解决此问题的一种方法是将其保存在用户会话 (HTTPSession) 中,另一种方法是对其进行加密并将其作为 https://www.targetdomain.com/services?id=jk3434jj123jkh23jh213h 放入浏览器中。一旦最终用户点击 link,我就可以在服务器端对其进行解密以检索标识符。

我是加密新手,我想知道什么suitable加密算法,我应该在浏览器上打印之前使用加密这个标识符,这样我就可以在服务器上检索它

我遇到了一些 post(例如 - ),其中使用 "AES/CBC/PKCS5Padding" 作为密码提供了工作代码。对于这个用例,这看起来是一个好的解决方案吗?

最安全的解决方案是按照您的描述管理会话中的参数(如果可以的话)。这样,所有内容都在服务器上,并且可以防止攻击者访问浏览器中的用户会话(但不能访问服务器)。如果你能做到这一点,那可能是对的。

但是,有时您需要通过浏览器。对于您发送到浏览器的任何内容,您可能有两个不同的要求:

  1. 您可能希望用户无法阅读它,解决方案是加密。如果是 id,这可能不太相关,但您的 id 也可能在某种程度上很敏感,只有您自己知道。

  2. 您可能希望用户无法修改它们,为此您需要消息身份验证。这需要服务器上的秘密,用于为您的参数生成身份验证代码,在收到它们后可以验证(再次使用秘密)。

请注意,这是两个不同的东西,加密的消息不一定经过身份验证,经过身份验证的消息也不会加密。

所以如果你只关心消息认证,你可以添加一个认证码作为一个单独的参数,用例如生成。 HMAC,然后在取回参数后进行检查。

或者根据您的要求,您可以选择经过身份验证的加密 (AEAD),它将两种功能合二为一。这样的算法是例如。 GCM 模式下的 AES。 (你问题中提到的AES-CBC不是AES的认证模式。)

请注意,您还必须考虑重放攻击。如果您只对参数本身进行身份验证或加密,则用户可以在其他会话中观察到此类加密参数,并在他自己的会话中重放这些参数。一个标准的解决方案是包括一个时间戳,这样这些安全参数也是有时间限制的,即使在您的特定场景中这可能还不够。例如,如果访问控制基于这样一个经过身份验证的参数,则另一个用户会话中观察到的经过身份验证的、有时限的参数可能会用于访问当前用户会话中的数据(尽管这将更难实际利用)。

或者您仍然可以通过会话完成...:)