2017-07-14 5 views
0

常に暗号化を使用してすべての暗号化と復号化の値を行うクライアントアプリケーションが作成されました。常に暗号化されたAzureKeyボールトを使用してクライアントアプリケーションからストアドプロシージャ経由でテーブルに挿入

私はキーを保管するためにAzure Key Vaultを使用しました。私は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)。

C#は大文字と小文字が区別され

SQLは、大文字と小文字を区別ではないことを忘れないようにしてください

関連する問題