如何向 gRPC C++ 添加自定义加密?

Posted

技术标签:

【中文标题】如何向 gRPC C++ 添加自定义加密?【英文标题】:How to add custom encryption to gRPC C++? 【发布时间】:2021-02-18 16:56:49 【问题描述】:

我正在尝试在 gRPC C++ 客户端中添加自定义加密。

在 Python 等某些端口中,有用于 unary_unary 调用的序列化程序参数。

我看到some issue 说它可以通过使用自定义Codec 来存档,但这在 C++ 中是不可能的。

那么我是否有机会使用 gRPC C++ API 添加自定义加密?

【问题讨论】:

【参考方案1】:

在这里发布我的部分解决方案。我可以加密请求有效负载,但无法解密响应正文。 我创建了一个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)
    );

【讨论】:

以上是关于如何向 gRPC C++ 添加自定义加密?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MSBuild 构建 gRPC dotnet 核心项目时如何包含自定义目录

如何向 UIActivityViewController 添加自定义按钮?

如何向 SFSafariViewController 添加自定义活动?

如何向qtreeview 自定义model 添加新行

C++ 笔记——字符串自定义加密处理

C++ 笔记——字符串自定义加密处理