我通过下面的链接在应用程序中实现了带有实体框架的始终加密概念。
https://blogs.msdn.microsoft.com/sqlsecurity/2015/08/27/using-always-encrypted-with-entity-framework-6/
这是我当前应用程序的migrations文件夹下initialSchema.cs文件中的Up()迁移方法。
public override void Up()
{
CreateTable(
"dbo.PersonalInfoTables",
c => new
{
ID = c.Int(nullable: false, identity: true),
Firstname= c.String(),
LastName= c.String(),
Address= c.String(),
SSN = c.String(),
})
.PrimaryKey(t => t.ID);
}
之后,我对SSN文件进行了注释,并添加了以下用于加密SSN列的SQL语句。
//manually add the encrypted columns
Sql("ALTER TABLE [dbo].[PersonalInfoTables] ADD [SSN] [nvarchar](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH(ENCRYPTION_TYPE = DETERMINISTIC, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = CEK_Auto1) NOT NULL");
然后在Package Manger控制台中运行更新数据库命令。
只有当加密列的CEK密钥已经可用时,上述代码才能工作。但是,当我在删除现有的本地数据库后再次运行我的应用程序时,它会出现异常,比如CEK密钥不可用,也没有应用迁移。
在添加ALTER SQL语句并删除本地数据库后,如何解决上述问题?
上面的问题只解决了,再次更改了Up()迁移代码,但我不希望出现这种情况。
请参阅本文的代码优先-迁移部分,您需要在实体框架之外创建数据库列主密钥、列加密密钥、架构等(例如使用SQL Server Management Studio)。有关这方面的更多信息可以在这里找到