Dapper.NET에서 varbinary 매개 변수 사용

.net c# dapper sql-server

문제

Dapper.NET과 함께 varbinary 매개 변수를 사용하려고합니다.

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);
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow