在 WebService 用 SoapHeader 傳遞認證資訊並用 DESCryptoServiceProvider 加解密

四月 2, 2009

本文介紹:在 WebService 用 SoapHeader 傳遞認證資訊並用 DESCryptoServiceProvider 加解密。

SoapHeader 變數圖解:
SoapHeader 變數圖解


程式碼

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
}

 

檔案下載:

參考資料:

Comments are closed.