使用自定义属性通过DataProtectionProvider实现加密ValueConverter

时间:2019-03-26 19:48:09

标签: asp.net-core entity-framework-core

我尝试首先使用Entity Framework Core代码实施加密。我想使用自定义属性来定义哪些字段需要加密/解密。尝试将DataProtectionProvider注入转换器并在转换器表达式内部进行“保护” /“取消保护”时,我遇到了问题。我还想在OnModelCreating内部对转换器的调用中定义保护提供程序的目的。

如何将IDataProtectionProvider的实例注入到加密值转换器中,并根据OnModelCreating中的实体名称设置用途?

我将此link用于实现。

这里是我想使用DI而不是直接实例化依赖项的ValueConverter

public class EncryptedConverter : ValueConverter<string, string>
    {
        private static IDataProtector dataProtectorProvider = 
            DataProtectionProvider.Create("appName").CreateProtector("purpose");
        public EncryptedConverter(ConverterMappingHints mappingHints = default)
        : base(EncryptExpr, DecryptExpr, mappingHints)
        {
        }

        static Expression<Func<string, string>> DecryptExpr = 
            x => new string(dataProtectorProvider.Unprotect(x));
        static Expression<Func<string, string>> EncryptExpr = 
            x => new string(dataProtectorProvider.Protect(x));
    }

任何帮助将不胜感激!我是.NET Core的新手,如果我在这里缺少明显的东西,请原谅我:)

2 个答案:

答案 0 :(得分:1)

请参见latest post,了解您所使用的实现中紧随其后的主题

基本上,您必须使用包装类,然后在扩展转换器类中创建一个使用IDataProtectionProvider的构造函数,并在扩展转换器类中调用将其与包装类包装在一起的另一个构造函数。然后,此构造函数可以访问包装类表达式以调用基本ValueConverter构造函数。

agent {
        docker { 
            image 'node:12'
            args "-v /etc/passwd:/etc/passwd"
            reuseNode true
        }

}

}

答案 1 :(得分:0)

您可以检出我的EntityFramework.Core.DataEncryption库的代码,它提供了[Encrypted]属性,该属性使用内置或自定义的加密提供程序仅加密string字段。实际上,仅开发了AesProvider

您的一小部分加密可与我的库一起使用:

首先,声明一个实体,并使用string属性标记一个[Encrypted]属性。

public class UserEntity
{
    public int Id { get; set; }

    [Encrypted]
    public string Username { get; set; }

    [Encrypted]
    public string Password { get; set; }

    public int Age { get; set; }
}

然后,更新您的DbContext并创建一个新的IEncryptionProvider对象,并将其传递给UseEncryption()的{​​{1}}扩展方法,如下所述:

ModelBuilder

现在,当您插入数据时,您将在数据库中看到以下内容: encryption


所有工作都在public class DatabaseContext : DbContext { // Get key and IV from a Base64String or any other ways. // You can generate a key and IV using "AesProvider.GenerateKey()" private readonly byte[] _encryptionKey = ...; private readonly byte[] _encryptionIV = ...; private readonly IEncryptionProvider _provider; public DbSet<UserEntity> Users { get; set; } public DatabaseContext(DbContextOptions options) : base(options) { this._provider = new AesProvider(this._encryptionKey, this._encryptionIV); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.UseEncryption(this._provider); } } 扩展方法中进行,如here所述。 您首先需要加载具有ModelBuilder属性的实体的每个属性,然后使用[Encrypted]方法设置指定的转换器。

希望有帮助。