Je suis en train d'utiliser un varbinary
paramètre avec Dapper.NET comme suit
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)
});
}
Cependant, le résultat est null
. Mais il retourne un résultat valide si je lance le SQL directement, par exemple.
SELECT CONVERT(NVARCHAR(40), DECRYPTBYPASSPHRASE('secret', 0x01000000393FE233AE939CA815AB744DDC39667860B3B630C82F36F7))
renvoie xx
qui est le texte crypté.
Une idée de ce que je fais mal?
Juste pour que quelqu'un trouve utile, ce qui suit a fonctionné (Merci @Rob pour les commentaires ci-dessus)
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();
}
}
et les fonctions hexstring-to-bytes et bytes-to-hexstring sont
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);
}