我有一个小项目的认证,我需要存储在网站B加密密钥,我从服务器从网站A,但服务器从网站B不应该能够读取它。如果没有浏览器扩展,这是可能的吗?这样的事情将如何实现呢?
我想更广泛的问题是:如何在B网站上存储来自网站A的数据而不将数据发送到服务器B?
如果这还不够:在我到达A网站之前,首先我将被从网站B重定向。在这种情况下,我可以做以下工作:
感觉应该有一个更简单的解决方案。注:我信任网站B的javascript代码,但不信任服务器B上的代码(因为这不会对公众开放)。
发布于 2021-02-20 12:47:40
所以,首先,你的最后一句话是自相矛盾的。如果您不信任站点B的服务器,您不能也不应该信任来自B的任何内容,包括脚本。如果B是恶意的或受损的,当您访问B时,您将得到一个修改后的脚本,该脚本会做一些恶意的事情,或者只会得到一个额外的脚本,该脚本会将恶意行为插入到正常操作中。例如,恶意代码可以在您解密秘密之后轻松地检索它,或者直接检索该秘密及其解密密钥。
尽管如此,如果您有办法确保客户端代码是可信任的--也许页面及其所有脚本都是从浏览器扩展或本地应用程序加载的,而不是从服务器加载的--这是相当容易的。
最简单的方法是使用CORS。B上的脚本将向A发出经过身份验证的跨源请求(使用XHR或Fetch),请求数据。A的服务器将检查用户是否已被授权,并返回适当的数据,以及脚本查看响应所需的Access-Control-Allow-Origin: B和Access-Control-Allow-Credentials: true头。
更复杂的是,您可以使用Window.postMessageAPI接口来完成这个任务。您将为B上的脚本中的窗口消息创建一个侦听器,然后打开一个窗口(如果是,弹出,甚至是单独的选项卡)到A上的一个页面,A上的页面将具有(或检索)该秘密,然后调用postMessage将其发送给B。
在这两种情况下,秘密永远不会真正击中B端的服务器--它完全是客户端的,并且可以存储在本地存储区或B上可能需要的任何东西--但当然,您必须相信B上的代码不会产生相同的来源XHR或提取,从而将秘密发送到服务器(或者类似的不幸的事情)。如前所述,如果不能信任B上的服务器,则不能信任运行在B原点上的任何代码(除非,这些代码都不是来自服务器,您可以确定)。
https://security.stackexchange.com/questions/245090
复制相似问题