我正在使用Spring Web应用程序,并且遇到了一种情况,该情况要求在URI中传递标识符(通过HTTPS进行获取),例如:https://www.targetdomain.com/services?id=123。该URI出现在最终用户浏览器上,我担心的是,任何人都可以篡改该标识符“ 123”,该标识符在我的数据库中作为表之一的主键链接。
解决此问题的一种方法可能是将其保存在用户会话(HTTPSession)中,另一种可能是对其进行加密并将其作为https://www.targetdomain.com/services?id=jk3434jj123jkh23jh213h扔到浏览器中。最终用户单击链接后,我可以在服务器端解密该链接以检索标识符。
我是加密技术的新手,我想知道什么合适的加密算法,在浏览器上打印该标识符之前,应该使用该算法来加密该标识符,以便可以在服务器上检索它
我遇到了一些帖子(例如-encrypt and encode URL parameters spring mvc),其中使用“ AES / CBC / PKCS5Padding”作为密码来显示工作代码。对于这个用例,这看起来是一个好的解决方案吗?
最安全的解决方案是按照您所描述的在会话中管理参数,如果可以的话。这样,所有内容都在服务器上,并且受到保护,防止攻击者可以访问浏览器中的用户会话(但不能访问服务器)。如果您可以这样做,那可能是对的。
但是,有时您需要通过浏览器。对于发送到浏览器的任何内容,您可能有两个不同的要求:
您可能希望用户无法读取它,而解决方案就是加密。如果是ID,则可能不那么相关,但是您的ID可能也会以某种方式敏感,只有您能知道。
您可能希望用户不能修改它们,为此,您需要消息身份验证。
请注意,这是两件分开的事情,加密的消息不一定经过身份验证,并且经过身份验证的消息未加密。
因此,如果您只关心消息身份验证,则可以将身份验证代码作为单独的参数添加,例如,使用生成。 HMAC,然后在返回参数后检查。
或者根据您的要求,您可以选择一种经过身份验证的加密(AEAD),它可以同时提供两种功能。这样的算法是例如。 AES在GCM模式下。
请注意,您还必须考虑重播攻击。如果仅对参数本身进行身份验证或加密,则用户可以在其他会话中观察此类加密的参数,例如,并在自己的会话中重播这些参数。一种对此的标准解决方案是还包括时间戳记,以使此类安全参数也具有时间限制。
或者您仍然可以在整个会话中完成它...:)