【问题标题】:Getter/setter for two way encrypted property in a model模型中双向加密属性的获取器/设置器
【发布时间】:2014-06-27 13:18:01
【问题描述】:

我需要对数据库中的某些字段进行加密,所以,我需要对进入数据库的数据进行加密,然后在显示时解密。我已经设置了我的加密方法和解密方法,并且我让它像这样在一个动作中工作:

model.EncryptedProperty = Encrypt(viewModel.Property);
viewModel.Property = Decrypt(EncryptedProperty);

这很好,但我的问题是其他开发人员在使用该属性时需要记住加密/解密该属性。这对于项目的新人来说可能是个问题,因为它要求他们事先知道该属性被加密。我试图通过像这样在模型上加密/解密来改进加密:

private string _property;
public string Property
{
    get { return DecryptString(_property); }
    set { _property = EncryptString(value); }
}

但是,这似乎不起作用,当我在视图中查看此属性时,它看起来好像已经加密了数据库中的加密数据(我已经使用 DecryptString(DecriptString(_property)) 对此进行了测试,它返回 true价值。

这里的解决方案是什么?有没有更优雅的方法来解决这个问题?

【问题讨论】:

    标签: c# encryption cryptography


    【解决方案1】:

    在那种情况下,我可能会这样做:

    [WhateverYourDataLayerNeeds("Property")]
    public string EncryptedProperty {get;set;}
    
    public string DecryptedProperty
    {
        get { return DecryptString(EncryptedProperty); }
        set { EncryptedProperty = EncryptString(value); }
    }
    

    然后数据库层和第一个对话,没有混淆。

    【讨论】:

    • 所以在这种情况下,没有办法将EncryptedProperty 与输入model. 的人混淆?
    • @jumpingcode 好,你可以加[Obsolete("seriously, just don't")]... 或[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]...
    • 很好的例子。帮了我很多忙。
    【解决方案2】:

    Marc Gravell's 答案绝对是与问题匹配的答案,但如果有人来自 Entity Framework 代码优先方法,这就是我最终为混淆其他开发人员的加密属性所做的:

    public class Model 
    {
        // Other properties
    
        private string EncryptedProperty { get; set; }
        [NotMapped]
        public string Property
        {
            get { return Decrypt(EncryptedProperty); }
            return { EncryptedProperty = Encrypt(value); }
        }
    
        public class ModelConfiguration : EntityTypeConfiguration<Model>
        {
            public ModelConfiguration() 
            {
                Property(p => p.EncryptedProperty);
            }
        }
    }
    

    然后在我的ApplicationDbContext

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         modelBuilder.Configurations.Add(new Model.ModelConfiguration);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2014-03-11
      • 2015-06-23
      相关资源
      最近更新 更多