通过实体框架

时间:2015-06-13 13:29:09

标签: c# sql-server entity-framework cryptography multiline

我在C#中使用实体框架4(是的,我知道我应该升级,但除了这一点之外)。

我有70,000个私有RSA密钥存储在数据库中 格式如下: 注意 - 这是演示密钥

-----BEGIN RSA PRIVATE KEY-----
MIICXQIDEMODEMODEMODEMODEMOEbGslt0N21onxRjBUwXFKI7CN6clxPAS+nEUK
BZAEiJUDJLqcGa37EZv40UQnmGKpLZO3ypee9qvKRVC4Q3Oi3S+Ukfet7eJYvCwr
WlneDOqvzyDz8cwlLcE2YhOnCMLYJ3v3YSt0n10oryaKyADDbCd5PmBbUwIEB7CO
+QKBgCtLDEMODEMODEMODEMODEMOnNVbWYfVLhFJpdS1+5dTZbkOg6zaP+A/VKf1w
3psFl7VfbggqiEvAi+4hTULVZu0W0wqPQUkw+rGzVT8Fg1uwBrzUKScJbscuRE/J
1I6iizZ0sudjUynn+EORc12p1NRslf2BUW3nFIognt849r9JAkEA1V+5aGmJLZPP
xZ/ETst7tb1WMeOvNxu+s/h2kcW6+WCvlUErYiB2/E/LkTbYGXu5/OHIMDgbQbB+
28Bu7lYmUwJBAM12343234235AEIDmvGJChsPOaqwnClV/fSEx/6E8DXMhDHTENA
STt+v4k1rlkSlM2aliZ8kz2u8K45SepsVwECQQCmECecqVtfuIvC+8EKvlM536OT
XrLIeDOkRak8yRqQFEZzAlOXkOtKIxHBJuVT39sPK+xzU30FwRdLE858eBphAkB+
LExh7ejTrxN3dHr1mDhJWoLzm59dzgwfmuEznnH+OmMZSAY21IouIAXjnKfXeCLo
fRvUv5EuQkvGUJi1/25JAkAXZy7yjsJxaNBGB9TxakoHHnI2yWI/R9yewhzLorNo
Oj49W6l9uaWaNxxmCrNZRIZoDEMODEMODEMODEMODEMO
-----END RSA PRIVATE KEY-----

注意:由于某种原因,END RSA行在Stack Overflow上没有正确格式化。

但是,当我尝试通过实体框架选择密钥时,我只得到以下内容: -----开始RSA私钥-----

我认为这可能是SQL Server(在我的情况下是2008)在新行字符处终止字符串(' \ n') 所以我写了一个存储过程来尝试替换服务器端,然后返回到调用应用程序。

结束了类似的事情

Declare @str as nvarchar(max)
Declare @strReplaced as nvarchar(max)
set @str = (select PrivateKey from PrivateKeys where Id = @ID)
set @strReplaced = (select (REPLACE(@str, CHAR(10), '<<newline>>')))
select @strReplaced

在sql server(存储过程)上运行时 - 它为我提供了具有相应&lt;&gt;的私钥。替代品 但是,当我通过以下C#代码执行存储过程时,它仍然在键的第一行终止结果。

var str = o.ExecuteStoreQuery<string>("Execute dbo.GetPrivateKey " + Id.ToString());
Console.WriteLine(str.ToList()[0]);

有人可以提出一个解决方案,允许我的C#代码访问整个RSA密钥吗?

在SQL Server Management Studio中执行我的存储过程时:我明白了 -----BEGIN RSA PRIVATE KEY-----<<newline>>MIICXwIBAAKBgQDuCFrUx55g9yqezNvzSpX0YegUDnrp0IP7jsMab0NVqAgl/azO<<newline>>qbp5SNe10mAYJNDsxBS0AHYSOrAHApgKPgWTKOE5gFUKxaB1eJgIDEMODEMODEMODEMO<<newline>>0PU0Kma2/8Znv23JFUDrO3Sk8Ft++aT8crCs45ygnJVNSdgsU0MDEMODEMODEMODEMO<<newline>>awKBgAXv6PqRNvFuEg5Pt+0IjwTMEHLqPBPEh5k2eS1aRYKyl/T40fe5SaXiMxWb<<newline>>f8SUoLXDPdOdkXqBqZfOs94hjtk6mRDZuBN9MWL7F4D+b6/n4s+YDEMODEMODEMODEMO<<newline>>kEr7DrtF/n/kDrH/Pty6pyHCfGLVLMtG6cFYIPncyYzViLTDAkEA+riR/e+elYVe<<newline>>bc+KPq9NlSXAFz21R00puCUJhrVBNcVZnKw2hV8D9Ie4b+WMaPcGh/7gHAiUC84o<<newline>>JpLA8EjGPQJBAPMLZGRwcvNiUW7gl2EBIq33gDZvefzQC4kr5J2SFLaA4lX/wKMJ<<newline>>ymHJdjQlmo5nKd7qdmg0DwbUSOjCcux/RpkCQQDXde/XX9kIxD9NQ2wV0DhQ4LFU<<newline>>J/OXlxZ2yD+Tnr7lFFN/QghU8Vuc0G4eRPR2kg5X6FBya3nQ5miDgl8j76pDAkEA<<newline>>pud2zrTMxBul8BDP4+gqll18jcRt0sV7fERvaMT+0gL/M2QamRevgd22ipKbBAUV<<newline>>P4f1Jtj6aFqVQ9n8RewtuwJBAL4iLMt/GWg71PBQhPlZlkDlmDGoDF1Ou6MYlONv<<newline>>z24JA/EMdx3Jx1/WG7xyzqmEJcVGk/8O/NWtP5DXQEFBLnw=<<newline>>-----END RSA PRIVATE KEY-----<<newline>>

通过C#代码执行存储过程时: `string sConnectionString =&#34; InsertConnectionStringHere&#34 ;;                                 使用(var conn = new System.Data.SqlClient.SqlConnection(sConnectionString))                             using(var command = new System.Data.SqlClient.SqlCommand(&#34; GetPrivateKey&#34;,conn)                             {                                 CommandType = CommandType.StoredProcedure

                        })
                        {
                            conn.Open();
                            command.Parameters.Add(new System.Data.SqlClient.SqlParameter("@DomainID", vTransaction.Domain.Id));
                            var vReader = command.ExecuteReader();
                            vReader.Read();
                            var vResult = vReader.GetValue(0);
                            Console.WriteLine(vResult);
                            conn.Close();
                        }`

它给了我----- BEGIN RSA私钥----- 无论原因是什么,它都会影响SQL的低级别。因此它会影响直接原始SQL和基于它的实体框架。

编辑 - 仔细观察,我正在使用SQL Server Express - 它是否有可能影响返回字符串的限制?

EDIT ---- 我修改了存储过程以将文本字段转换为二进制数据,然后将其发送给调用者。 通过此代码 select CONVERT(VARBINARY(max), @str )

它适用于SQL Server,但是当通过C#代码远程调用时,它只获得62个字节的数据,当转换为字符串时 - 再次,这些字节构造了&#39; ----- BEGIN RSA私钥-----&#39;

我不知所措......

1 个答案:

答案 0 :(得分:0)

使用正则表达式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string key =
                "-----BEGIN RSA PRIVATE KEY-----\n" +
                "MIICXQIDEMODEMODEMODEMODEMOEbGslt0N21onxRjBUwXFKI7CN6clxPAS+nEUK\n" +
                "BZAEiJUDJLqcGa37EZv40UQnmGKpLZO3ypee9qvKRVC4Q3Oi3S+Ukfet7eJYvCwr\n" +
                "WlneDOqvzyDz8cwlLcE2YhOnCMLYJ3v3YSt0n10oryaKyADDbCd5PmBbUwIEB7CO\n" +
                "+QKBgCtLDEMODEMODEMODEMODEMOnNVbWYfVLhFJpdS1+5dTZbkOg6zaP+A/VKf1w\n" +
                "3psFl7VfbggqiEvAi+4hTULVZu0W0wqPQUkw+rGzVT8Fg1uwBrzUKScJbscuRE/J\n" +
                "1I6iizZ0sudjUynn+EORc12p1NRslf2BUW3nFIognt849r9JAkEA1V+5aGmJLZPP\n" +
                "xZ/ETst7tb1WMeOvNxu+s/h2kcW6+WCvlUErYiB2/E/LkTbYGXu5/OHIMDgbQbB+\n" +
                "28Bu7lYmUwJBAM12343234235AEIDmvGJChsPOaqwnClV/fSEx/6E8DXMhDHTENA\n" +
                "STt+v4k1rlkSlM2aliZ8kz2u8K45SepsVwECQQCmECecqVtfuIvC+8EKvlM536OT\n" +
                "XrLIeDOkRak8yRqQFEZzAlOXkOtKIxHBJuVT39sPK+xzU30FwRdLE858eBphAkB+\n" +
                "LExh7ejTrxN3dHr1mDhJWoLzm59dzgwfmuEznnH+OmMZSAY21IouIAXjnKfXeCLo\n" +
                "fRvUv5EuQkvGUJi1/25JAkAXZy7yjsJxaNBGB9TxakoHHnI2yWI/R9yewhzLorNo\n" +
                "Oj49W6l9uaWaNxxmCrNZRIZoDEMODEMODEMODEMODEMO\n" +
                "-----END RSA PRIVATE KEY-----\n";

            Regex expr = new Regex("-.*$", RegexOptions.Multiline);
            key = expr.Replace(key, "").Trim();

        }
    }
}
​