使用Entity Framework存储和检索加密数据未达预期
可能导致加密未生效的原因及解决方案
1. AES密钥与IV长度不符合规范
你当前使用的密钥和IV解码后长度仅为7字节,而AES算法有严格的长度要求:
- 密钥长度必须是16(AES-128)、24(AES-192)或32(AES-256)字节
- IV长度必须为16字节
长度不匹配会导致加密逻辑无法正常工作,甚至静默失败。
修复方案:
生成符合规范的密钥和IV(生产环境需安全存储,避免硬编码):
// 示例:生成AES-256密钥和IV var aes = Aes.Create(); aes.KeySize = 256; var encryptionKeyBytes = aes.Key; var encryptionIvBytes = aes.IV; // 将字节转为Base64字符串保存,使用时再解码
2. 加密配置类未被正确应用
你的Encrptconfig类(注意拼写错误,建议修正为EncryptConfig)需要被显式添加到ModelBuilder中,否则属性加密规则不会生效。检查基类BaseDbContext的OnModelCreating方法是否自动加载了该配置,若没有则手动添加:
修复方案:
在ApplicationDbContext的OnModelCreating中补充配置应用逻辑:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.UseEncryption(_provider); // 显式应用加密属性配置 modelBuilder.ApplyConfiguration(new Encrptconfig()); base.OnModelCreating(modelBuilder); }
3. OnModelCreating执行顺序冲突
如果base.OnModelCreating(modelBuilder)中包含覆盖配置的逻辑,可能会冲掉你设置的加密规则。需确保自定义加密配置的执行顺序优先于基类的覆盖逻辑:
修复方案:
调整执行顺序,优先应用自定义配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.UseEncryption(_provider); modelBuilder.ApplyConfiguration(new Encrptconfig()); }
4. 加密库兼容性问题
你使用的IsEncrypted扩展方法来自SoftFluent.ComponentModel.DataAnnotations,需确认该库与当前EF版本、AesProvider实现是否兼容。版本不匹配可能导致加密注解无法被EF识别。
修复方案:
- 核对库的官方文档,确认其支持的EF版本
- 确保
UseEncryption传入的_provider与IsEncrypted注解依赖的加密逻辑一致
5. 类名拼写错误导致配置失效
配置类名Encrptconfig缺少字母y,若在应用配置时写错类名,会直接导致配置不生效。建议修正类名为EncryptConfig,避免拼写失误。
内容的提问来源于stack exchange,提问作者Bharati Hattikal
相关产品推荐
相关产品推荐

