如何在保持搜索/过滤器未加密的同时加密OData的输出结果?

时间:2017-02-08 10:54:14

标签: encryption serialization asp.net-web-api odata asp.net-web-api-odata

我有一个连接到加密数据源的Web API OData控制器。我希望将数据作为加密方式发送回客户端,但不希望从客户端获取搜索/过滤功能。需要客户端可以查询数据,就像它是未加密的数据一样。我的意思是客户端不要加密搜索条件然后传递给odata。

我发现没有比类​​型序列化器更好的方法来做到这一点。我试图自定义它并加密那个地方的数据。它适用于某些情况但不适用于所有情况。当odata直接在浏览器中调用时(不在客户端应用程序中),它不起作用。当客户决定只获取特定字段时,它不再起作用。

当从odata获取加密数据时,客户端将解密数据。

我的问题是注入加密机制的正确位置?有没有更好的解决方案?

以下显示了我目前正在做的事情。我也问了类似的问题hereherehereherehere,但确实得到了我的问题的答案。

enter image description here

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望返回具有加密解密属性的模型,具体取决于您的ODATA模型的属性,具体取决于客户端请求设置。因此输出可能如下所示:

{
    "Name" : "clearText"
    ,
    "Value" : "cryptText"
}

不是在序列化程序级别重新加密数据,而是在ODATA控制器调用的业务逻辑中实际执行该操作(或者如果你没有分离业务逻辑,则在控制器本身中执行)。

这种方法的好处是您仍然拥有所有信息(查询,完整模型),而加密传出序列化程序中的数据也会导致将加密/解密密钥分成不同的位置。

如果您的流程类似于此

CryptEntity cryptEntity = db.Set<T>.FirstOrDefault(e => e.Id == key);
ClearEntity clearEntity = cryptEntity.Decrypt();
// perform search depending on query settings
cryptEntity = clearEntity.Encrypt();

您可以使用AutoMapper执行转换并为其提供特定的构造函数或类型转换器,而不是在实体上使用(扩展)方法并进一步从ODATA逻辑和实体中抽象出业务逻辑:

var cryptEntity = Mapper.Map<CryptEntity>(clearEntity);

如果这不能解答您的问题或没有完全解决您的问题,请详细说明并举例说明。