我有一个带有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);
}
}
答案 0 :(得分:0)
首先,将密码以纯文本格式存储在数据库中是一个糟糕的主意。也就是说,数据库中的二进制数据列为十六进制(以16为基数)。
在您的示例中,要转换
0x507572706C6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
在C#中Purple
,您可以这样写:
Encoding.UTF8.GetString(yourByteArrayVariable).TrimEnd(\'0')
TrimEnd
是必需的,因为您的列是固定宽度的二进制而不是varbinary。结果,它用空字符(0
)正确填充,应从结果字符串中删除。