c# - SQL 对称 key 并从 C# 打开它

我正在尝试通过对称 key 加密 SQL Server 中的数据。当用户通过 Web 表单提交数据时,我希望使用我保存在 SQL Server 中的对称 key 对数据进行加密。我试图找出如何做到这一点。目前,我运行以下命令:

USE myDb
GO

OPEN SYMMETRIC KEY myKey
DECRYPTION BY CERTIFICATE myCert
GO

INSERT INTO [myDb].[dbo].[passData]
           ([userid]
           ,[passName]
           ,[passLogin1]
           ,[passLogin2]
           ,[passPass1]
           ,[passPass2]
           ,[passWebsite]
           ,[passNote])
     VALUES
           ('1'
           ,'test_2'
           ,ENCRYPTBYKEY(KEY_GUID('myKey'),'somedata1')
           ,NULL
           ,ENCRYPTBYKEY(KEY_GUID('myKey'),'somedata2')
           ,NULL
           ,NULL
           ,NULL)
GO

这很好用 - 但是,当我尝试从我的 Web.Config 文件打开 key 时,出现错误。

C#代码:

    private void openKey(Dictionary<String, String> inputStrings)
    {
        try
        {
            SqlCommand seeqlCmd = new SqlCommand();
            String sqlInfo = ConfigurationManager.AppSettings.Get("OpenKey");
            seeqlCmd.CommandText = sqlInfo;
            seeqlCmd.CommandType = CommandType.Text;
            seeqlCmd.Connection = __SQLConn;

            seeqlCmd.ExecuteNonQuery();
            submitDataToDb(inputStrings);
            __SQLConn.Close();
        }
        catch (SqlException err)
        {
            // show error commands here
        }
    }

    private void submitDataToDb(Dictionary<String, String> sqlString)
    {
        try
        {
            SqlCommand sqlCmd = new SqlCommand();
            String confSet = ConfigurationManager.AppSettings.Get("DepositPasswordData");
            sqlCmd.CommandText = String.Format(confSet, sqlString["userID"], sqlString["passName"], sqlString["loginOne"], sqlString["loginTwo"], sqlString["passOne"], sqlString["passTwo"], sqlString["webSite"], sqlString["passNote"]);
            sqlCmd.CommandType = CommandType.Text;
            sqlCmd.Connection = __SQLConn;

            sqlCmd.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            // show error commands here
        }
    }

Web.Config 文件

<add key="OpenKey" value="OPEN SYMMETRIC KEY myKey DECRYPTION BY CERTIFICATE myCert"/>
<add key="DepositPasswordData" value="INSERT INTO Passwords.dbo.userPassData{0} userid, passName, passLogin1, passLogin2, passPass1, passPass2, passWebsite, passNote) VALUES ('{0}', '{1}', 'ENCRYPTBYKEY(KEY_GUID('myKey '),'{2}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{3}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{4}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{5}')', '{6}', '{7}')" />

try/catch 语句错误:

Error Number: 102, Error Message: Incorrect syntax near 'myKey'. in: -2146232060 and System.Data.SqlClient.SqlErrorCollection

问题/问题:

  • 为什么我会收到错误消息?
  • 访问 key 或加密数据是否有不同的方式?

另外:我尝试将 key 名称从“myKey”更改为“myKeya”或类似的名称,但我收到此错误:

Error Number: 15151, Error Message: Cannot find the symmetric key 'myKeya', because it does not exist or you do not have permission. in: -2146232060 and System.Data.SqlClient.SqlErrorCollection

当然,我使用的词与“myKey”不同,但我检查了我使用的词是否是任何类型的关键字,并且在 google、bing 和 msdn 的任何搜索中都没有出现。 .所以我想我在那里很安全。这也给我提供了线索,因为数据库实际上正在接收请求,但它想要一些不同的方式的 key 。嗯....

最佳答案

也许你应该转义或删除网络配置中的分号?只是一个想法,未经测试。

https://stackoverflow.com/questions/1813352/

相关文章:

junit - 从 JSP 运行 JUnit 集成测试?

tsql - 如何使用 Sql Server 中的 INFORMATION_SCHEMA 或 sys

uml - 从现有的 javadoc 生成类图

wordpress - 修改 WordPress 插件标记

java - JNDI 在不检索所有数据的情况下获取 LDAP 搜索的大小

.net - 从 .NET 网络应用程序访问 WIA/TWAIN

visual-studio - 用于测试 IDE 配色方案的代码示例

linq-to-sql - IQueryable 什么时候执行查询?

installation - 删除我安装在错误位置的 RubyGem 的 .gem 目录是否安全?

apache-flex - 为什么我的 svn ant 任务失败了?