.
3ss.cn

编写 Nginx 模块进行 RSA 加解密之改进模块,支持参数

接下来,我们来进行一个最常规的功能支持,让模块能够接受请求参数,并根据参数的变化,动态计算结果。

...
/* allocate a buffer for your response body */
b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
if (b == NULL)
{
    return NGX_HTTP_INTERNAL_SERVER_ERROR;
}

ngx_str_t var_user = ngx_string("arg_user");
ngx_uint_t key_user = ngx_hash_key(var_user.data, var_user.len);
ngx_http_variable_value_t *val_user = ngx_http_get_variable(r, &var_user, key_user);

if (val_user != NULL && val_user->not_found != 1)
{

    char *tpl;
    asprintf(&tpl, "{\"name\":\"%s\"}", (char *)val_user->data);

    will_encrypt_string.data = (u_char *)tpl;
    will_encrypt_string.len = strlen(tpl);
    free(tpl);
}
else
{
    char *preset_words = "hi";
    will_encrypt_string.data = (u_char *)preset_words;
    will_encrypt_string.len = strlen(preset_words);
}

unsigned char *test_data = (unsigned char *)will_encrypt_string.data;
int data_len = will_encrypt_string.len;

...

上面的代码展示了如何读取 GET 请求中的 user 参数,并将参数安全的拼合到字符串模版中,进行计算。相信即使你不熟悉 C 语言,参考上面的代码也可以快速进行调整,将计算逻辑调整到符合你预期的方式。
如果你希望模块能够非编译环境快速复用,可以参考其他的 Nginx 插件源代码,“实现 Nginx 读取静态文件”的功能,将编译至模块中的证书剥离出来。不过,如果你有 CI 环境,能够方便的持续获取最新的构建结果,将证书编译至模块中,可以获得更高的绝对性能。
其他
关于 Nginx 模块的开发,我个人建议阅读 Nginx 官方开发文档 和 Nginx 源代码,相比较国内外陈旧的文档,可以节约不少时间。
如果你对于加密内容的长度有特殊要求,需要加密特别长的内容,我建议你阅读这篇文章,考虑使用 EVP 函数替换文中的函数执行加密过程:Simple Public Key Encryption with RSA and OpenSSL。

赞(0)
未经允许不得转载:互联学术 » 编写 Nginx 模块进行 RSA 加解密之改进模块,支持参数

评论 抢沙发