我需要加密数据库中的某些字段,因此,我需要对进入数据库的数据进行加密,然后在显示时对其进行解密。我已经设置了加密方法和解密方法,并且我在这方面工作了,例如,一个动作:
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))
对此进行了测试它返回真值。
这里有什么解决方案?是否有更优雅的方法来解决这个问题?
答案 0 :(得分:5)
在那种情况下,我可能会这样做:
[WhateverYourDataLayerNeeds("Property")]
public string EncryptedProperty {get;set;}
public string DecryptedProperty
{
get { return DecryptString(EncryptedProperty); }
set { EncryptedProperty = EncryptString(value); }
}
然后数据库层仅与第一个对话,并且没有混淆。
答案 1 :(得分:1)
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);
}