使用实体框架核心进行数据保护

时间:2019-06-11 04:19:41

标签: asp.net-core-webapi asp.net-core-2.2 ef-core-2.2

因此,我已经按照Microsoft的官方指南(https://docs.microsoft.com/el-gr/aspnet/core/security/data-protection/implementation/key-storage-providers?view=aspnetcore-2.2&tabs=visual-studio)使用Entity Framework Core加密数据并将其存储在数据库中,但是我无法使其在多台计算机上都能正常工作。因此,我使用Entity Framework Core实施是因为该指南中指出:“使用此软件包,可以在Web应用程序的多个实例之间共享密钥。”从已部署的版本(例如xyz.com)使用该应用程序时,该应用程序可以完美运行,但不会让我受到本地主机的干扰。之后,当我的虚拟机已用完并且我要添加另一个虚拟机时,会不会有问题?如果是这样,如何使它在已部署的站点和不同的计算机上都能工作?没有教程可以实现,我到处搜索过。非常感谢。

services.AddDataProtection()
                .UseCryptographicAlgorithms(
                    new AuthenticatedEncryptorConfiguration()
                    {
                        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
                        ValidationAlgorithm = ValidationAlgorithm.HMACSHA256,

                    }
                ).PersistKeysToDbContext<DataContext>();

更新12-6-2019

因此,我遵循了Microsoft的文档(https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-encryption-at-rest?view=aspnetcore-2.2) 它指出:

“如果该应用程序分布在多台计算机上,则可以方便地在计算机之间分发共享的X.509证书,并将托管的应用程序配置为使用该证书对静态密钥进行加密”

我使用本教程生成了x.509证书:

https://www.youtube.com/watch?v=1xtBkukWiek

我更新的代码:

        services.AddDataProtection()
                .UseCryptographicAlgorithms(
                    new AuthenticatedEncryptorConfiguration()
                    {
                        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
                        ValidationAlgorithm = ValidationAlgorithm.HMACSHA256,

                    }
                )
                // )
                .ProtectKeysWithCertificate(new X509Certificate2("wibit-test-cert.pfx", "password"))
                .PersistKeysToDbContext<DataContext>();

在本地计算机上测试时,它可以正常工作,但是在部署它时,出现此错误:

错误:“系统找不到指定的文件”

我尝试了几种修复它的方法,包括_hostingEnvironment.ContentRootPath或WebRootPath。这两种方式以及我在更新的代码中使用的方式都可以在我的计算机上使用,而不能在已部署的应用程序中使用。

有任何线索吗?

1 个答案:

答案 0 :(得分:0)

我终于解决了! 问题是我没有设置应用程序名称:

.SetApplicationName("myapp")

然后我将证书的路径更改为此:

.ProtectKeysWithCertificate(new X509Certificate2(Path.Combine(_hostingEnvironment.ContentRootPath,"wibit-test-cert.pfx"), "password"))

这也可能是一个权限问题,因为当我在A2Hosting中托管应用程序时,找不到指定的文件(wibit-test-cert.pfx),但是当我在GCP Cloud中部署时,它就起作用了!

现在我可以使用具有不同应用程序的同一数据库来加密和解密数据。

所以我的最终代码是这样:

services.AddDataProtection()
  .UseCryptographicAlgorithms(
      new AuthenticatedEncryptorConfiguration()
         {
             EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
             ValidationAlgorithm = ValidationAlgorithm.HMACSHA256,

          }
       )
       .SetApplicationName("myapp")
       .ProtectKeysWithCertificate(new X509Certificate2(Path.Combine(_hostingEnvironment.ContentRootPath,"wibit-test-cert.pfx"), "password"))
       .PersistKeysToDbContext<DataContext>();