2017-07-14 127 views
0

我创建了一个做所有的加密和使用始终加密解密值的客户端应用程序客户端应用程序插入到表通过存储过程。使用始终处于加密AzureKey跳马

我已经使用Azure密钥库来存储我的密钥。我已经按照this。它对我来说很好,硬编码查询(INSERT INTO ....)

但是,当我尝试使用存储过程,它没有工作。我已经提到了这个Stack Post。但解决方案/回答并没有解决我的问题,很遗憾。所以我决定开一个新的问题。

这是我的C#代码

SqlCommand cmd = _sqlconn.CreateCommand(); 

// Use parameterized SQL to insert the data 
cmd.CommandText = @"INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (@SSN, @FirstName, @LastName, @BirthDate);"; 

SqlParameter paramSSN = cmd.CreateParameter(); 
paramSSN.ParameterName = @"@SSN"; 
paramSSN.SqlDbType = SqlDbType.Char; 
paramSSN.DbType = DbType.AnsiStringFixedLength; 
paramSSN.Direction = ParameterDirection.Input; 
paramSSN.Value = ssn; 
paramSSN.Size = 11; 
cmd.Parameters.Add(paramSSN); 

SqlParameter paramFirstName = cmd.CreateParameter(); 
paramFirstName.ParameterName = @"@FirstName"; 
paramFirstName.DbType = DbType.String; 
paramFirstName.Direction = ParameterDirection.Input; 
paramFirstName.Value = firstName; 
paramFirstName.Size = 50; 
cmd.Parameters.Add(paramFirstName); 

SqlParameter paramLastName = cmd.CreateParameter(); 
paramLastName.ParameterName = @"@LastName"; 
paramLastName.DbType = DbType.String; 
paramLastName.Direction = ParameterDirection.Input; 
paramLastName.Value = lastName; 
paramLastName.Size = 50; 
cmd.Parameters.Add(paramLastName); 

SqlParameter paramBirthdate = cmd.CreateParameter(); 
paramBirthdate.ParameterName = @"@BirthDate"; 
paramBirthdate.SqlDbType = SqlDbType.Date; 
paramBirthdate.Direction = ParameterDirection.Input; 
paramBirthdate.Value = birthdate; 
cmd.Parameters.Add(paramBirthdate); 

cmd.ExecuteNonQuery(); 

当我改变一点点使用存储过程。它引发等

附加信息错误:操作数类型冲突:char是与(将encryption_type = 'DETERMINISTIC',encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name = 'CEK_Auto1',column_encryption_key_database_name =“TESTDB加密VARCHAR(20)不相容“)COLLATION_NAME = 'SQL_Latin1_General_CP1_CI_AS'

string execute = @"[dbo].[insertsp]"; 

SqlCommand cmd = new SqlCommand(execute, _sqlconn); 
cmd.CommandType = CommandType.StoredProcedure; 

    SqlParameter paramSSN = cmd.CreateParameter(); 
    paramSSN.ParameterName = @"@SSN"; 
    paramSSN.SqlDbType = SqlDbType.Char; 
    paramSSN.DbType = DbType.AnsiStringFixedLength; 
    paramSSN.Direction = ParameterDirection.Input; 
    paramSSN.Value = ssn; 
    paramSSN.Size = 11; 
    cmd.Parameters.Add(paramSSN); 

    SqlParameter paramFirstName = cmd.CreateParameter(); 
    paramFirstName.ParameterName = @"@FirstName"; 
    paramFirstName.DbType = DbType.String; 
    paramFirstName.Direction = ParameterDirection.Input; 
    paramFirstName.Value = firstName; 
    paramFirstName.Size = 50; 
    cmd.Parameters.Add(paramFirstName); 

    SqlParameter paramLastName = cmd.CreateParameter(); 
    paramLastName.ParameterName = @"@LastName"; 
    paramLastName.DbType = DbType.String; 
    paramLastName.Direction = ParameterDirection.Input; 
    paramLastName.Value = lastName; 
    paramLastName.Size = 50; 
    cmd.Parameters.Add(paramLastName); 

    SqlParameter paramBirthdate = cmd.CreateParameter(); 
    paramBirthdate.ParameterName = @"@BirthDate"; 
    paramBirthdate.SqlDbType = SqlDbType.Date; 
    paramBirthdate.Direction = ParameterDirection.Input; 
    paramBirthdate.Value = birthdate; 
    cmd.Parameters.Add(paramBirthdate); 

    cmd.ExecuteNonQuery(); 

这是我的架构后启用加密

CREATE TABLE [dbo].[patients] 
(
    [ssn] [varchar](20) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL, 
    [FirstName] [varchar](50) NULL, 
    [LastName] [varchar](50) NULL, 
    [BirthDate] [datetime] NULL 
) 

(PS:我已经在我的连接字符串中启用了列加密设置=已启用。也尝试与EXEC sys.sp_refresh_parameter_encryption @name = '[dbo].[sp]' - 既不适用于我)

回答

1

只是一个大小写敏感的问题(@ssn和@SSN)。

请不要忘记,

SQL是不区分大小写

C#是区分大小写的