一个对请求进行AES加密的代理(以防止搜刮者轻易获取我们的数据)

254 阅读3分钟

rproxy

一个对请求进行AES加密的代理,以防止搜刮者轻易访问我们的数据。

代理背后的中心思想是,它将请求转发到底层API,对响应进行加密并通过WASM处理解密。为什么是WASM?因为没有人知道如何解密二进制,以了解我们到底在做什么--如果他们知道,他们就应该访问数据。

我如何使用它?

  1. 首先,你需要建立解密的虚拟机
$ make build-asma shared-key="15365230-aa22-4f5f-aa46-f86076a0b6b2"

密钥15365230-aa22-4f5f-aa46-f86076a0b6b2 ,将是 共享在虚拟机和代理之间。它将被用来加密所有的数据,而且应该保密。🤫

  1. 配置代理。打开 config.toml并找出对你有好处的方法。它是有记录的。
  2. 运行代理!
$ go run main.go

它将在:25259 。你可以继续使用httpie或cURL-whatever向它发出请求。但你也可以尝试python3 -m http.server ,并打开我们放在一起的index.html ,其中显示了如何使用虚拟机来解密代理的响应。这里有你需要的一切:

import init, { proxy, build_info } from "./dist/asma/main.js";
(async () => {
  // Initialize the decryption VM
  await init();
  // Prints build information. This is useful to put in Sentry metadata and stuff like that...
  console.log(build_info());

  // This is normally the value of the `Authorization` header that you send to the server
  // to authorize the clients, if you don't want to pass it to the proxy and only keep
  // the `Shared Key`, it's fine. Otherwise, it adds another layer of security by encrypting
  // responses individually with everyone's token.
  const authorization = "";
  const response = await fetch("http://localhost:25256/https://httpbin.org/json");
  // Grab everything that came back from the proxy response as a bytes array
  const bytes = await response.arrayBuffer();
  // ...and send it to the VM for decryption
  console.log(await proxy(new Uint8Array(bytes), authorization));
})();

投标

如果你能直接在API上加密,为什么还要放一个代理?

这倒是真的。你可以。但你应该问自己以下问题:

  1. 你是否愿意在你的存储库中进行PR并直接部署该解决方案?
  2. 你是否愿意牺牲使用常规API的DX,来处理是否应该加密响应的标志?
  3. 你想把响应加密逻辑延续到你现有的遗留/已经工作的东西上吗?

如果是这样......那么你就可以走了。否则,请不要担心在你现有的API前面有一个代理。

但是延迟怎么办?

好吧,通过使用这个解决方案,我们增加了一个额外的网络跳跃和所有的底层代理逻辑,然而,我们需要合理地思考--我的API暴露在搜刮者面前与额外的2ms 延迟相比是否值得?问问自己这个问题并做出决定。

我的卖点是,我们已经一直在做性能不好的代码,我们并不担心这个问题。但当涉及到一个简单的HTTP请求代理到一个加密代理时,我们会 "抱怨 "一下2ms ,它的延迟 可以导致请求的总时间增加?

我怎么知道它是2ms ?好吧,想象一个标准的网络图--你已经把你的API暴露在网络上了,所以这就是你目前的延迟。通过添加一个代理,你把你现有的API通过内部网络调用,因此,利用所有的安全和千兆以太网板的优势。来吧,这已经解决了。讨论结束了。

为什么是WASM?这不是太现代了吗?

到处都已经支持了。去他妈的IE。我的数据成本远远高于 小于10使用该浏览器的用户,甚至没有给我带来任何钱--让我们面对现实,玩玩诚实。

通过WASM实现的原因是,我们会隐藏所有的加密逻辑,所以你不能在Chrome浏览器上著名的 "网络标签 "中,点击 "启动器",轻松地找出我的解码逻辑并抓取密码。