自定义身份验证Soap头 进行加密解密

原创 2007年09月27日 14:26:00
首先我们在客户端进行对数据的加密:这里我们使用的是64位DES加密算法。
 
  设置密钥(Key)和初始值(IV)可放在配置文件中:
 
<appSettings>
    
<add key="Key" value="fdautoit"/>
    
<add key="IV" value="FDAUTOIT"/>
  
</appSettings>

*注:上面的值只有8个字节(64位)
在.cs文件中获取“Key”和“IV”
string Key, Iv;

            Key 
= ConfigurationManager.AppSettings["Key"];
            Iv 
= ConfigurationManager.AppSettings["IV"];

定义一个加密方法:
private string Encrypt(string p_strEncrypt)
        {
            
//Set the Key and the InitialVector for Encrypt
            byte[] key = Encoding.UTF8.GetBytes(Key);
            
byte[] iv = Encoding.UTF8.GetBytes(Iv);
            
//Convent the string to byte[] of the Data
            byte[] byteData=Encoding.UTF8.GetBytes(p_strEncrypt);
            
//Set Memory space for save the Data
            MemoryStream memoryData = new MemoryStream();
            
//
            
//DES des = new DESCryptoServiceProvider();
            
//RC2 des = new RC2CryptoServiceProvider();
            
//Rijndael des = new RijndaelManaged();
            TripleDES des = new TripleDESCryptoServiceProvider();
            des.Key 
= key;
            des.IV 
= iv;
            des.Mode 
= CipherMode.CBC;
            
//Create  the Method with the Key and IV 
            ICryptoTransform transform = des.CreateEncryptor();
            
//Create the EnCrypt stream
            CryptoStream cryptostream = new CryptoStream(memoryData, transform, CryptoStreamMode.Write);
            
            
//write into the Memory stream
            try
            {
                cryptostream.Write(byteData, 
0, byteData.Length);
            }
            
catch
            {
                
throw new Exception("Encrypt Data wrong of the write to stream!");
            }
            cryptostream.FlushFinalBlock();
            cryptostream.Close();
            
//return memoryData.ToString();
            return Convert.ToBase64String(memoryData.ToArray());
        }
在这个方法返回的是一个加密后的数据。
private void ValidServiceMethod()
        {
            
//Encrypt the username and password of SoapHeader
            string m_strName = Encrypt("admin",EncryptionAlgorithm.Des);
            
string m_strPwd = Encrypt("admin",EncryptionAlgorithm.Des);
            
//new a  SoapHeader and a WebService
            MySoapHeader myheader = new MySoapHeader ();
            MyService myservice 
= new MyService();
           
myheader.UserName = m_strName;
           
myheader.PassWord = m_strPwd;
            
//Set the SoapHeader validate to Service
            myservice.FDSoapHeaderValue = myheader ;
            
//Call Method of webservice 
           myservice.GetMoney();
        }



  这样就完成了加密的过程(用户名,密码,数据可以以参数的形式传入)
在服务 器端同样设置配置文件。这于客户端的是一模一样的。
<appSettings>
    
<add key="Key" value="fdautoit"/>
    
<add key="IV" value="FDAUTOIT"/>
  
</appSettings>
同样在代码文件中获取其值
  编写解密方法:
 private string Decrypt(string p_strDecrypt)
        {
            
// Set the Key and the InitialVector for Decrypt
            byte[] key = Encoding.UTF8.GetBytes(Key);
            
byte[] iv = Encoding.UTF8.GetBytes(Iv);
            
//Covent the string to byte[] with the Encrypt Data
            
//byte[] EncrypData =Encoding.UTF8.GetBytes(p_strDecrypt);
            byte[] EncrypData=Convert.FromBase64String(p_strDecrypt);
            
// Set the Memory stream Space for save data
            MemoryStream memoryData = new MemoryStream();
            
// Create DES for Decrypt
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Key 
= key;
            des.IV 
= iv;
            des.Mode 
= CipherMode.CBC;
            
// Decrypt with the key and InitialVector
            ICryptoTransform transform = des.CreateDecryptor();
            
//Save to MemoryStream
            CryptoStream cryptostream = new CryptoStream(memoryData, transform, CryptoStreamMode.Write);
            
//output the data
            try
            {
                cryptostream.Write(EncrypData, 
0, EncrypData.Length);
            }
            
catch(Exception ex)
            {
                
throw new Exception("write to stream wrong!"+ex.Message);
            }
            cryptostream.FlushFinalBlock();
            cryptostream.Close();
            
//output data
            return Encoding.UTF8.GetString(memoryData.ToArray());
        }
 

Soap头:
 public class MySoapHeader : SoapHeader
    {
        
string _name;
        
string _passWord;

        
public string UserName
        {
            
get { return _name; }
            
set { _name = value; }
        }
        
public string PassWord
        {
            
get { return _passWord; }
            
set { _passWord = value; }
        }
    }

更改上篇中的方法:

 public bool ValiHeader(out string ReturnMsg)
        {
            MySoapHeader myheader=new MySoapHeader();
            
bool flag = false;
            string
UserName=Decrypt(myheader.UserName);
            string PassWord=Decrypt(myheader.PassWord);
            if (UserName == "admin" && PassWord == "admin")
            {
                flag 
= true;
                ReturnMsg 
= "You Are Successfully";
            }
            
else
            {
                ReturnMsg 
= "You Are Failted";
            }
            
return flag;
        }

[WebMethod]
[SoapHeader("header", Direction = SoapHeaderDirection.In)]
public
 string CheckHeader()
        {
            string ReturnMsg="";
            
bool IsTrue=ValiHeader(out  ReturnMsg);
            return ReturnMsg;
        }

如果方法:“ValiHeader”返回的是true 表示验证成功,如果返回的是false表示用户名和密码有误。


有关SoapHeader验证头密码核心代码就 是这样了。其中省略了很多代码。 

自定义身份验证Soap头 进行加密解密

自定义身份验证Soap头 进行加密解密     在上篇文章中我们了解了使用自定义SOAP头进行身份验证,使webService服务的身份验证变得灵活,简便。 但是是以明文的方式在网上传输,不能...
  • ycl295644
  • ycl295644
  • 2015年09月29日 10:52
  • 1301

使用Soap头自定义身份验证

使用Soap头自定义身份验证     在intranet场景下,Windows身份验证动作良好,并且开发人员可以在自身域中对用户进行身份验证。如果在Web.config文件中将WEB服务设置为W...
  • ycl295644
  • ycl295644
  • 2015年09月29日 10:49
  • 949

SOAP消息头的处理

SOAP消息头通常包含与消息体或SOAP处理(应用)方式相关的信息,比如消息路径、数字签名、认证信息,消息关联性信息、消息体的加密公匙等等。 下面我们以一个简单的权限认证的示例,来讲解如何添加和...
  • linjingj
  • linjingj
  • 2014年01月30日 10:10
  • 2980

Axis2用法——soap消息携带消息头

1、消息头定义 一般soap消息中,消息体是携带消息的核心内容;消息头中的字段,多数用于校验。定义消息头,就相当于定义一个bean对象。本例中,在上一篇的继承上,为消息增加消息头,其中消息头核心...
  • x6582026
  • x6582026
  • 2016年08月12日 15:46
  • 796

SOAP消息的格式

SOAP消息的格式
  • zmycoco2
  • zmycoco2
  • 2013年11月06日 16:19
  • 1881

[Python]webservice学习(2) --自己写soap消息请求服务

上文中webservice学习(1) ,使用soaplib建立了一个超简单的webservice服务,也是用suds调用成功了,那如果想使用http包自己组成一个soap消息来调用接口怎么办呢? 这...
  • lzz957748332
  • lzz957748332
  • 2014年05月17日 16:02
  • 4453

SOAP和WSDL的一些必要知识

http://www.cnblogs.com/JeffreySun/archive/2009/12/14/1623766.html SOAP和WSDL对Web Service、WCF进行深入了解...
  • hotdust
  • hotdust
  • 2016年06月19日 22:12
  • 1031

WCF笔记(3)发送和接收SOAP(消息)头

一、定义 消息头是附加信息,那有啥用呢?你可别说,有时候还真有不少用处。举个例子,WCF的身份验证是不是很麻烦?还要颁发什么证书的(当然不是荣誉证书),如果只是验证一个客户端的身份,如用户名什么的,...
  • ljf5566
  • ljf5566
  • 2013年03月14日 10:13
  • 3854

cxf添加身份认证

1、服务端配置,java部分 package com.huating.outinterface; import javax.xml.soap.SOAPException; import javax....
  • heqinghua217
  • heqinghua217
  • 2016年09月02日 16:41
  • 1229

XFire实现身份验证(基于Xfire SOAP Header的WebService安全验证)

[java] view plaincopy 一、创建web services 工程(XFire),和平时的一样。   二、加入身份验证功能   1、首先编写服务端验证...
  • z69183787
  • z69183787
  • 2014年05月06日 09:53
  • 917
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义身份验证Soap头 进行加密解密
举报原因:
原因补充:

(最多只允许输入30个字)