在 WebService 用 SoapHeader 傳遞認證資訊並用 DESCryptoServiceProvider 加解密
四月 2, 2009
本文介紹:在 WebService 用 SoapHeader 傳遞認證資訊並用 DESCryptoServiceProvider 加解密。
程式碼
SoapHeader
public class UserHeader : System.Web.Services.Protocols.SoapHeader
{
public UserHeader() {}
public string Username { get { return m_Username; } set { m_Username = value; } }
private string m_Username;
public string Password { get { return m_Password; } set { m_Password = value; } }
private string m_Password;
}
WebService
// using System.Web.Services.Protocols;
public UserHeader m_userHeader = null;
public UserHeader UserHeader
{
get { return m_userHeader; }
set { m_userHeader = value; }
}
[SoapHeader("UserHeader", Direction = SoapHeaderDirection.InOut)]
[WebMethod]
public string ReturnLoginUser()
{
string msg = "err";
if (m_userHeader != null)
{
string name = Decrypt(m_userHeader.Username, m_Key, m_IV);
string pwd = Decrypt(m_userHeader.Password, m_Key, m_IV);
msg = name + "|" + pwd;
} // if
return msg;
}
Client
static void Main(string[] args)
{
Service ws = new Service();
string key="", iv="";
ws.GetKeyAndIv(ref key, ref iv);
UserHeader uh = new UserHeader();
uh.Username = Encrypt("中文(abc)", key, iv);
uh.Password = Encrypt("1234-ABC", key, iv);
ws.UserHeaderValue = uh;
Console.WriteLine("Return:{0}", ws.ReturnLoginUser());
Console.ReadKey();
}
加密
/// <summary>
/// DEC 加密法
/// </summary>
/// <param name="txt">加密文本</param>
/// <param name="sKey">加密金鑰</param>
/// <param name="sIV">初始化向量</param>
/// <returns></returns>
public static string Encrypt(string txt, string key, string iv)
{
System.Text.StringBuilder ret = new System.Text.StringBuilder();
using (System.Security.Cryptography.DESCryptoServiceProvider des = new System.Security.Cryptography.DESCryptoServiceProvider())
{
byte[] data = System.Text.Encoding.Default.GetBytes(txt);
des.Key = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
des.IV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
using (System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write))
{
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
} // using
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
} // foreach
} // using
} // using
return ret.ToString();
}
解密
/// <summary>
/// DEC 解密法
/// </summary>
/// <param name="txt">解密的字串</param>
/// <param name="sKey">加密金鑰</param>
/// <param name="sIV">初始化向量</param>
/// <returns></returns>
public static string Decrypt(string txt, string key, string iv)
{
using (System.Security.Cryptography.DESCryptoServiceProvider des = new System.Security.Cryptography.DESCryptoServiceProvider())
{
byte[] data = new byte[txt.Length / 2];
for (int x = 0; x < txt.Length / 2; x++)
{
int i = (Convert.ToInt32(txt.Substring(x * 2, 2), 16));
data[x] = (byte)i;
} // for
des.Key = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
des.IV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);
using (System.IO.MemoryStream ms =
new System.IO.MemoryStream())
{
using (System.Security.Cryptography.CryptoStream cs =new System.Security.Cryptography.CryptoStream(ms, des.CreateDecryptor(),System.Security.Cryptography.CryptoStreamMode.Write))
{
try
{
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
return System.Text.Encoding.Default.GetString(ms.ToArray());
} // try
catch
{
return "";
} // catch
} // using
} // using
} // using
}
檔案下載:
參考資料:
- [MSDN] SoapHeader 類別 (System.Web.Services.Protocols)
- [MSDN] DESCryptoServiceProvider 類別 (System.Security.Cryptography)
- [ASP.NET]為WebService多加上認證(SoapHeader) – Dotjum的分享空間- 點部落
- C# 加密(Encrypt) 解密(Decrypt) 使用DESCryptoServiceProvider – Phoenix.net 迷之殿- 點部落
- webservice 用戶驗證 加密 – Hetter – 博客園
- asp.net 2.0中傻瓜式使用soap header – jackyrong – 博客園