rproxy
一个对请求进行AES加密的代理,以防止搜刮者轻易访问我们的数据。
代理背后的中心思想是,它将请求转发到底层API,对响应进行加密并通过WASM处理解密。为什么是WASM?因为没有人知道如何解密二进制,以了解我们到底在做什么--如果他们知道,他们就应该访问数据。
我如何使用它?
- 首先,你需要建立解密的虚拟机
$ make build-asma shared-key="15365230-aa22-4f5f-aa46-f86076a0b6b2"
密钥
15365230-aa22-4f5f-aa46-f86076a0b6b2,将是 共享在虚拟机和代理之间。它将被用来加密所有的数据,而且应该保密。🤫
- 配置代理。打开
config.toml并找出对你有好处的方法。它是有记录的。 - 运行代理!
$ 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上加密,为什么还要放一个代理?
这倒是真的。你可以。但你应该问自己以下问题:
- 你是否愿意在你的存储库中进行PR并直接部署该解决方案?
- 你是否愿意牺牲使用常规API的DX,来处理是否应该加密响应的标志?
- 你想把响应加密逻辑延续到你现有的遗留/已经工作的东西上吗?
如果是这样......那么你就可以走了。否则,请不要担心在你现有的API前面有一个代理。
但是延迟怎么办?
好吧,通过使用这个解决方案,我们增加了一个额外的网络跳跃和所有的底层代理逻辑,然而,我们需要合理地思考--我的API暴露在搜刮者面前与额外的2ms 延迟相比是否值得?问问自己这个问题并做出决定。
我的卖点是,我们已经一直在做性能不好的代码,我们并不担心这个问题。但当涉及到将一个简单的HTTP请求代理到一个加密代理时,我们会 "抱怨 "一下2ms ,它的延迟 可以导致请求的总时间增加?
我怎么知道它是2ms ?好吧,想象一个标准的网络图--你已经把你的API暴露在网络上了,所以这就是你目前的延迟。通过添加一个代理,你把你现有的API通过内部网络调用,因此,利用所有的安全和千兆以太网板的优势。来吧,这已经解决了。讨论结束了。
为什么是WASM?这不是太现代了吗?
到处都已经支持了。去他妈的IE。我的数据成本远远高于 小于10使用该浏览器的用户,甚至没有给我带来任何钱--让我们面对现实,玩玩诚实。
通过WASM实现的原因是,我们会隐藏所有的加密逻辑,所以你不能在Chrome浏览器上著名的 "网络标签 "中,点击 "启动器",轻松地找出我的解码逻辑并抓取密码。