如何解决如何向 gRPC C++ 添加自定义加密?
在一些像 Python 这样的端口中,有用于 unary_unary
调用的序列化器参数。
我看到 some issue 说它可以通过使用自定义 Codec
进行归档,但这在 C++ 中是不可能的。
那么我可以使用 gRPC C++ API 添加自定义加密吗?
解决方法
在这里发布我的部分解决方案。我可以加密请求有效负载,但无法解密响应正文。
我创建了一个 Inceptor
并钩住了所有方法。
class TestInterceptor: public grpc::experimental::Interceptor {
void Intercept(grpc::experimental::InterceptorBatchMethods* methods) override {
const uint8_t aes_key[] = "0123456789123456";
const uint8_t aes_iv[] = "0123456789123456";
if (methods->QueryInterceptionHookPoint(grpc::experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)) {
auto s1 = methods->GetSerializedSendMessage();
std::vector<grpc::Slice> v;
s1->Dump(&v);
size_t l = 0;
for (const auto& s: v) {
l += s.size();
}
ustring buf;
buf.resize(l);
size_t ptr = 0;
for (const auto& s: v) {
memcpy(buf.data() + ptr,s.begin(),s.size());
ptr += s.size();
}
// encrypt
ustring crypted = Crypto::aes_encrypt(buf,aes_key,aes_iv);
grpc::Slice new_slice(crypted.data(),crypted.size());
grpc::ByteBuffer s2(&new_slice,1);
s1->Swap(&s2);
}
if (methods->QueryInterceptionHookPoint(grpc::experimental::InterceptionHookPoints::PRE_RECV_MESSAGE)) {
char* s2 = (char *) methods->GetRecvMessage();
}
methods->Proceed();
}
};
class TestInterceptorFactory: public grpc::experimental::ClientInterceptorFactoryInterface {
grpc::experimental::Interceptor* CreateClientInterceptor(grpc::experimental::ClientRpcInfo* info) override {
auto *m = info->method();
return new TestInterceptor();
}
};
对于通道创建,只需传递拦截器即可。
std::unique_ptr<grpc::experimental::ClientInterceptorFactoryInterface> fac_ptr = std::make_unique<TestInterceptorFactory>();
std::vector<std::unique_ptr<grpc::experimental::ClientInterceptorFactoryInterface>> vec = {};
vec.push_back(std::move(fac_ptr));
m_channel = grpc::experimental::CreateCustomChannelWithInterceptors(
"example.com",channel_credentials,channel_arguments,std::move(vec)
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。