将二进制(64)SQL Server数据解析为C#中的纯文本

时间:2018-11-20 01:06:02

标签: c# json api

我有一个带有binary(64)列的SQL Server数据库,其中包含一个密码。我正在使用C#ASP.NET API查询数据,并将数据作为字符串返回给我的C#代码。

在SQL Server中,密码为

0x507572706C6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

在我的C#中,密码为字符串

UHVycGxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==

明文密码为:Purple

我眼前的问题是如何使用C#来“解析”返回的字符串并将其转换为可读格式?

我尝试了以下语法,但出现错误……将散列密码“解析”为纯文本的正确方法是什么?

  

找不到任何可识别的数字

public class SQLData
{
    public string pass { get; set; }
}

public static string BinaryToString(string data)
{
    List<Byte> byteList = new List<Byte>();

    for (int i = 0; i < data.Length; i += 8)
    {
        byteList.Add(Convert.ToByte(data.Substring(i, 8), 2));
    }
    return Encoding.ASCII.GetString(byteList.ToArray());
}
 private void btnPullData_Click(object sender, EventArgs e)
 {
    string URI = "http://192.168.5.200:8888/api/Xamarin?email=jose%40gmail.com;

    using (var webClient = new System.Net.WebClient())
    {
        var json = webClient.DownloadString(URI);

        var message = JsonConvert.DeserializeObject<SQLData>(json);

        string clearpass = BinaryToString(message.pass);
        MessageBox.Show(clearpass);
    }

}

1 个答案:

答案 0 :(得分:0)

首先,将密码以纯文本格式存储在数据库中是一个糟糕的主意。也就是说,数据库中的二进制数据列为十六进制(以16为基数)。

在您的示例中,要转换

0x507572706C6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

在C#中Purple,您可以这样写:

Encoding.UTF8.GetString(yourByteArrayVariable).TrimEnd(\'0')

TrimEnd是必需的,因为您的列是固定宽度的二进制而不是varbinary。结果,它用空字符(0)正确填充,应从结果字符串中删除。