加密&在RavenDB中解密索引字段

时间:2012-02-10 19:09:16

标签: c# reflection ravendb

我的应用程序要求我们需要加密索引字段。现在,加密/解密在应用程序级别处理。我想将加密过程从应用程序层移开,因此我不必手动加密模型或查询中的数据。

我想用属性修饰模型,以确定该字段是否应加密。我正在寻找使用IDocumentConversionListener来处理与文档之间的转换。这是处理这个问题的最佳地点吗?如果是这样,我如何仅加密/解密复杂模型中具有属性的字段?以下是具有两个需要加密的字段的模型示例。

    public class User
    {
        public string Id { get; set; }
        [EncryptAttribute]
        public string Name { get; set; }
        public Contact PhoneNumber { get; set; }
        public class Contact
        {
            public string Type { get; set; }
            [EncryptAttribute]
            public string Value { get; set; }
        }
    }

public class SecureFieldListener : IDocumentConversionListener
{
   public void EntityToDocument(object entity, RavenJObject document, RavenJObject metadata)
   {

   }
   public void DocumentToEntity(object entity, RavenJObject document, RavenJObject metadata)
   {

   }
}

1 个答案:

答案 0 :(得分:2)

关于如何存储加密的文档,请查看此处:http://daniellang.net/document-level-encryption-in-ravendb/

在高级别(高于lucene)加密索引有很多严重的问题,我很确定你不想这样做。范围查询不起作用,订单会被破坏,全文搜索不可能等等。

请注意,默认情况下,raven会在没有字段存储的情况下在lucene中存储字段。这意味着,虽然您可以在查询中使用它们,但您实际上无法将其值作为搜索结果检索回来。但是,据我所知,在非常安全的环境中,这可能还不够,因为有可能以某种方式提取它们

因此,如果您确实需要如此高的安全性,我建议您选择以下选项之一:

  • 不要使用索引
  • 在文件系统级别加密ravens服务器中的索引文件夹(例如,使用TrueCrypt)
  • 扩展RavenDB,以便它使用您自己的lucene FSDirectory实现,该实现对所有磁盘I / O使用对称算法