C# 尝试将Base64字符串作为字节传递
请帮忙。我需要向Web服务传递3个值:C# 尝试将Base64字符串作为字节传递,c#,C#,请帮忙。我需要向Web服务传递3个值: RptDate(字符串) UserID(字符串) PassHash(base64Binary) 这个PassHash就是问题所在,因为PassHash应该是连接在一起的用户名和密码(UserIDPassword),然后计算这个值的二进制MD5哈希,然后将此散列值转换为Base64解码字符串。下面我的C#代码显示了到目前为止的示例 protected void btnSubmit_Click(object sender, EventArgs e) {
RptDate(字符串)
UserID(字符串)
PassHash(base64Binary)
PassHash
就是问题所在,因为PassHash应该是连接在一起的用户名和密码(UserIDPassword
),然后计算这个值的二进制MD5哈希,然后将此散列值转换为Base64解码字符串。下面我的C#代码显示了到目前为止的示例
protected void btnSubmit_Click(object sender, EventArgs e) {
string UnameVal = "BSimpson";
string PwordVal = "Springfield";
string ReportDate = "2015-12-25";
string source = string.Concat(UnameVal, PwordVal);
string hashed = getMd5Hash2(source);
byte[] ph1 = System.Text.Encoding.UTF8.GetBytes(hashed);
//Build Hyperlink...
var sb = new StringBuilder();
sb.AppendFormat("https://ExampleService/GetRptLength?ReportDate={0}&UserID={1}&PassHash={2}", ReportDate, UnameVal, ph1);
HyperLink1.Visible = true;
HyperLink1.NavigateUrl = sb.ToString();
}
static string getMd5Hash2(string input) {
// Create a new instance of the MD5CryptoServiceProvider object.
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
// Convert the input string to a byte array and compute the hash.
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
// Create a new Stringbuilder to collect the bytes
// and create a string.
StringBuilder sBuilder = new StringBuilder();
// Loop through each byte of the hashed data
// and format each one as a hexadecimal string.
for (int i = 0; i < data.Length; i++) {
sBuilder.Append(data[i].ToString("x2"));
}
// Return the hexadecimal string.
return sBuilder.ToString();
}
protectedvoid btnSubmit\u单击(对象发送方,事件参数e){
字符串UnameVal=“BSimpson”;
字符串PwordVal=“Springfield”;
字符串ReportDate=“2015-12-25”;
字符串源=string.Concat(UnameVal,PwordVal);
字符串哈希=getMd5Hash2(源);
byte[]ph1=System.Text.Encoding.UTF8.GetBytes(散列);
//建立超链接。。。
var sb=新的StringBuilder();
某人附言格式(“https://ExampleService/GetRptLength?ReportDate={0}&UserID={1}&PassHash={2}”,报告日期,UnameVal,ph1);
HyperLink1.Visible=true;
HyperLink1.NavigateUrl=sb.ToString();
}
静态字符串getMd5Hash2(字符串输入){
//创建MD5CryptoServiceProvider对象的新实例。
MD5CryptoServiceProvider md5Hasher=新的MD5CryptoServiceProvider();
//将输入字符串转换为字节数组并计算哈希。
byte[]data=md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
//创建新的Stringbuilder以收集字节
//并创建一个字符串。
StringBuilder sBuilder=新StringBuilder();
//循环遍历散列数据的每个字节
//并将每个字符串格式化为十六进制字符串。
for(int i=0;i
下面是构建超链接的示例
当我提交此链接时,它表明我有一个“无效密码哈希值”。不是应该为
PassHash
设置一个值,而不仅仅是System.Byte[]
?我做错了什么?您需要将字节数组转换为base64字符串,因为字节数组的.ToString()
方法不会给出有效的表示形式
您可以通过以下方式执行此操作:
var passwordHashInBase64 = System.Convert.ToBase64String(ph1);
然后只需将密码hashinbase64
传递给字符串生成器,而不是ph1
编辑:
更仔细地看一下您的代码,您似乎在这里迈出了额外的一步。在getMd5Hash2函数中,在此行之后:
byte[]data=md5Hasher.ComputeHash(Encoding.Default.GetBytes(input))代码>
加
返回系统.Convert.tobase64字符串(数据)代码>
并删除stringbuilder/十六进制表示形式
然后,在提交事件中,不必担心从散列中获取字节,只需将该字符串作为散列值传入即可
sb.AppendFormat(“https://ExampleService/GetRptLength?ReportDate={0}&UserID={1}&PassHash={2}”,ReportDate,UnameVal,hash)代码>谢谢你的回复,威廉。但是,当我尝试您的解决方案时,出现了以下错误,因为服务正在查找字节[]形式的“PassHash”:“ExampleService/GetRptLength(string,string,Byte[])的最佳重载方法有一些无效参数”现在如何将“hash”值作为字节[]发送?您控制端点了吗?您应该将PassHash的预期值更改为字符串,然后可以使用System.Convert.FromBase64String从中获取字节。否,我不控制端点。然而,我确实从webservice的作者那里发现,我需要将数据散列为SHA256,而不是MD5。这是我的最新消息code://-----For SHA256哈希-------------------------------------------字符串哈希=Base64SHA256(源);字节[]ph1=Convert.FromBase64String(散列)//将参数传递给GetReportLength Web服务int a=RptLnth.GetReportLength(ReportDate,uneval,ph1);Label5.Text=“Rpt长度为”+a.ToString()。。。但它仍然不起作用。。。!