c# - 在 Dapper.NET 中使用 varbinary 参数

标签 c# .net sql-server dapper

我正在尝试将 varbinary 参数与 Dapper.NET 一起使用,如下所示

string secret = "secret";

// from SELECT ENCRYPTBYPASSPHRASE('secret', N'xx') >>;
string ciphertext = "0x01000000393FE233AE939CA815AB744DDC39667860B3B630C82F36F7"; 
using (var conn = new SqlConnection(...))
{
    var result = conn.ExecuteScalar(@"SELECT CONVERT(NVARCHAR(4000), DECRYPTBYPASSPHRASE(@secret, @ciphertext)) as decrypted", 
        new
        {
            secret,
            ciphertext = Encoding.Unicode.GetBytes(ciphertext)
        });
}

但是结果是null。但如果我直接运行 SQL,它会返回一个有效结果,例如。

SELECT CONVERT(NVARCHAR(40), DECRYPTBYPASSPHRASE('secret',  0x01000000393FE233AE939CA815AB744DDC39667860B3B630C82F36F7))

返回xx,即加密后的文本。

知道我做错了什么吗?

最佳答案

只是为了有人觉得有用,以下工作(感谢@Rob 上面的评论)

public string Encrypt(string secret, string unprotectedText)
{
    using (var conn = new SqlConnection(...))
    {
        var x = conn.ExecuteScalar(@"SELECT ENCRYPTBYPASSPHRASE(@secret, @text)",
            new { secret, text });

        return ByteArrayToString((byte[])x);
    }
}

public string Decrypt(string secret, string ciphertext)
{
    using (var conn = new SqlConnection(...))
    {
        return conn.ExecuteScalar(@"SELECT CONVERT(NVARCHAR(4000), DECRYPTBYPASSPHRASE(@secret, @ciphertext))", 
            new { secret, ciphertext = StringToByteArray(ciphertext) }).ToString();
    }
}

hexstring-to-bytes 和 bytes-to-hexstring 函数是

public static byte[] StringToByteArray(string hex)
{
    int startIndex = 0;
    if (hex.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase))
        startIndex = 2;

    return Enumerable.Range(startIndex, hex.Length - startIndex)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

public static string ByteArrayToString(byte[] arr)
{
    return "0x" + BitConverter.ToString(arr).Replace("-", String.Empty);
}

关于c# - 在 Dapper.NET 中使用 varbinary 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39843866/

相关文章:

c# - 如何在Xaml中为使用mvvm代码创建的窗口添加样式?

c# - ASP.NET WebAPI 创建一级 JSON

c# - 如何通过ID来操作itemtemplate中的item

c# - Application.CurrentCulture 和 Thread.CurrentCulture 之间的区别

c# - Foreach 在 xslt 中带有嵌套字典

sql-server - 如何在 Visual Studio 数据库项目中处理用户和登录?

c# - 使用反射从静态类内部的静态类中获取所有字段

c# - JavaScriptCompressor、CssCompressor 和多线程

sql-server - 如何将图像插入到 SQL Server 数据库表中

c# - 使用 sp_executesql 运行时相同的 SQL 查询很快,如果在查询分析器中作为动态查询执行则非常慢,为什么?