C#版本的备案接口pwdHash生成代码,已经测试通过。为了方便查看,代码放到类里面去了,关键的代码就是Hex2Bin函数和EncodeBase64,EncodeBase64直接接受的就是Hex2Bin生成的字节数组
using System;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Text;
/// <summary>
/// PWDHASH 的摘要说明
/// </summary>
public class PWDHASH
{
//测试函数
public string Test()
{
string Password = "123";
//用户口令
string RandStr = GetRandomString(20);
//获取长度为20的随机字符串,即传递给省系统的randVal参数
return pwdHash(Password, RandStr);
//获取Hash,即传递给省系统的pwdHash参数
}
//生成Hash的函数,参数为用户口令和随机字符
public string pwdHash(
string PassWord, string RndStr)
{
return EncodeBase64(Hex2Bin(MD5(PassWord + RndStr)));
}
//MD5,参数为字符串
public string MD5(string str)
{
return MD5(str, 32);
}
//MD5重载
public string MD5(string str, int code)
{
if (code == 16)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);
}
else
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
}
}
//16进制字符串转字节数组,参数为md5后的字符串
public byte[] Hex2Bin(string str)
{
byte[] byt = new byte[16];
int k = 0;
for (int i = 0; i < 31; i++)
{
if (i % 2 == 0)
{
string HexCode = str.Substring(i, 2);
byt[k] = (byte)Convert.ToInt16(HexCode, 16); k++;
}
i++;
}
return byt;
}
//base64编码,参数是字节数组
public string EncodeBase64(byte[] bytes)
{
return Convert.ToBase64String(bytes).ToString();
}
//获取len长度的随机字符串
public string GetRandomString(int len)
{
string Seed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789";
string ReturnStr = "";
Random Rnd = new Random();
for (int i = 1; i <= len; i++)
{
ReturnStr += Seed.Substring(Rnd.Next(62), 1);
}
return ReturnStr;
}
}