如何安全地将数据传输到公共Web服务或从公共Web服务传输数据

如何安全地将数据传输到公共Web服务或从公共Web服务传输数据

问题描述:

我正在处理与在远程盒子上运行的现有应用程序的接口。与远程应用程序的通信通过其公共Web服务。我被要求构建一个增强功能,这将涉及一个客户端使用Web服务来处理需要安全传输的敏感数据。如何安全地将数据传输到公共Web服务或从公共Web服务传输数据

任何人都可以给我一些关于如何最好地继续下去的指针吗?

+2

什么样的Web服务的SOAP的? WCF?你只需要运输安全或认证? – 2010-11-18 10:20:34

+0

@Dirk - 我相信它是一个SOAPy的。我想我只需要运输安全,这些服务都是公开的。 – 5arx 2010-11-18 10:54:36

首先,您应该使用SSL并拒绝任何不使用它的请求。这将在数​​据通过互联网传输时加密数据。

如果您使用的是SOAP,则可以在服务中定义一个自定义标头,该标头需要用户名/密码。然后,对于每个公共方法的第一行,根据数据库验证用户名和密码。如果成功,请适当设置HttpContext.Current.User,并且您的服务将与内置的Asp.NET基础结构很好地配合。

添加:下面是SoapHeader示例,其中包含用于验证的用户名/密码。

// define the header 
public class AuthenticationHeader : SoapHeader 
{ 
    public String UserName { get; set; } 
    public String Password { get; set; } 
} 

// your service 
public class PublicWebService : WebService 
{ 
    // defines an instance of the header as part of the service 
    public AuthenticationHeader Authentication; 

    private void Authenticate() 
    { 
     // validate the username/password against a database 
     // set the HttpContext.Current.User if successful. 
     // Maybe throw a SoapException() if authentication fails 
    } 

    // Notice the SoapHeader("Authentication") attribute... 
    // This tells ASP.Net to look for the incoming header for this method... 
    [WebMethod] 
    [SoapHeader("Authentication")] 
    public void PublicMethod1() 
    { 
     Authenticate(); 

     // your code goes here 
    } 

    // Expose another method with the same authentication mechanism 
    [WebMethod] 
    [SoapHeader("Authentication")] 
    public void PublicMethod2() 
    { 
     Authenticate(); 

     // your code goes here 
    } 
} 

现在,如果你运行WSDL工具,生成的代理类将包括定义的认证头:

PublicWebService s = new PublicWebService(); 
s.Authentication = new AuthenticationHeader(); 
s.Authentication.UserName = "xxxxxxxx"; 
s.Authentication.Password = "yyyyyyyy"; 
s.PublicMethod1(); 
s.PublicMethod2(); 
+0

我想我会与你的建议去做:自定义标题 - 你能链接到请走过去? – 5arx 2010-11-22 12:19:57

+1

@ 5arx - 我添加了一些示例代码,用于将自定义SOAP标题添加到您的服务中。如果您有任何问题,请告诉我。 – dana 2010-11-22 17:21:21

DIY路线:

  1. 安全读了(在移动到技术性前开始“Secrets and Lies”等这样的一般图书)

  2. 进行风险分析和评估线程。了解你正在保护什么,从什么以及威胁将来自哪里。您不太可能需要“高安全性”。

  3. 使用TLS(又名SSL)。

  4. 在客户端中,验证服务器的证书是否正确。

更好的路线:雇用谁拥有的声誉,以帮助您的专家。


除非你真的正在建设一个核武器工厂或相似。

+0

除了3.也许4.你知道你的回应并不是非常有帮助。我是一名工作开发人员 - 在实施相对较小的功能之前,我没有时间阅读整本书;-) – 5arx 2010-11-18 10:59:16

+0

@ 5arx步骤1和步骤2是关于正确执行步骤3和步骤4(以及*为什么*您需要让他们正确)。脚注是关于没有过度安全的顶部。步骤1非常关键,因为只是将传输层安全性放在一边不太可能提供很高的网络安全性(拦截传输中的数据不太可能成为一个重大威胁:如果服务器本身并不安全,例如内部员工,那么您未能保护您的用户可能期望受到保护的数据)。 *如果你正在寻找尽可能安全的工作,请告诉我你的应用程序名称,这样我就可以避免它。* – Richard 2010-11-18 11:17:05

+0

我不禁想到你错过了像SO这样的网站要获得目标忠告关于其他开发者的具体问题。我猜测,我们这里的大多数人都有足够的智慧认识到,在理想的世界中,我们可能应该广泛阅读这个主题,或者更好的是,在这个领域的专家顾问中掏出数千美元。 但是,在现实世界中,我们有客户尖叫关于截止日期,只需要完成任务;陈腐的建议,如“读一本关于它”或“尝试谷歌搜索的答案”只是不会洗我恐怕;-) – 5arx 2010-11-18 13:20:35