大家通常验证用户做法:
1. BASIC验证模式: 把用户名和密码采用Base64编码之后,放在HTTP HEADER里,发到服务器的。
2. FORM验证模式: 就什么都不处理,直接发到服务器。
3. 还有其他证书验证,摘要验证等,这些不在这篇文章讨论范围。
由于是明文传输,密码很容易被截获,从而造成密码的丢失。今天和老大讨论RESTful的模式时,想到了认证的问题,因为REST提倡无状态,我们老大提到了WSSE的问题,于是我就搜索一下。
密码传输的问题通常是用HTTPS来解决,当然这个很完美,但有些限制。有些情况下不能用HTTPS来解决,例如多个应用使用一个单独IP地址来访问时,由于服务器证书里的信息和域名是必须匹配的,所以一个应用使用了HTTPS, 而另一个就不能用了。还有一个办法就是用摘要验证,当然也可以解决这个问题,但是需要在服务器上配置相应的功能模块。如果服务器不可控(例如临时借用别人的服务器)也没有办法做到。
而WSSE的验证模式可以解决以上问题。不需在服务器做额外配置。具体过程如下:
1. 开始于两个信息: 用户名和密码。
2. 创建一个随机的nonce(不知道应该译成什么,反正就是随机的一个只能用一次的字符串),这个产生算法要够强健,不能让人猜出下一个产生的是什么。
3.创建一个"产生时间戳", 并转换成W3DTF格式
4.创建一个密码摘要:
PasswordDigest = Base64 \ (SHA1 (Nonce + CreationTimestamp + Password))
举例说明:
1.用户发一个请求:
POST /atom.cgi HTTP/1.1
Host: bob.example.com
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://purl.org/atom/ns#">
<title>My Entry Title</title>
<created>2003-12-15T14:43:07Z</created>
<content type="application/xhtml+xml" xml:lang="en">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Hello, <em>weblog</em> world!</p>
<p>This is my third post <strong>ever</strong>!</p>
</div>
</content>
</entry>
2. 由于没有验证信息,服务器以401来响应:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: WSSE realm="foo", profile="UsernameToken"
注:还有的文章讲这里服务器生成一个nonce, 然后在下一步附加到Request里,一块参与摘要生成。这个server nonce本身好像没有什么用途,但由于客户端nonce没有生成规则和长度限制(甚至如果服务器不保存以前使用过的,都无法判断是不是每次都一样的),而生成一个server nonce参与生成摘要可以保证摘要的变化性,就是每次都不一致。由于这个nonce是临时生成,一次有效,中间被人截获也无所谓。在验证时,由于是摘要验证,服务器必须保存这个nonce到验证结束,然后再及时清除。不过加了server nonce的限制,必然会使访问服务的客户端访问两次服务器才能真正访问服务,就是不能直接把身份信息附加上,直接访问服务。感觉这个就是标准的摘要验证差不多了,就变成了"请求-响应"模式了。
3. 用户输入用户名和密码,并且生成摘要,以UserToken形式发送到服务器:
POST /atom.cgi HTTP/1.1
Host: bob.example.com
Content-Type: application/atom+xml
Authorization: WSSE profile="UsernameToken"
X-WSSE: UsernameToken Username="bob", PasswordDigest="quR/EWLAV4xLf9Zqyw4pDmfV9OY=", Nonce="d36e316282959a9ed4c89851497a717f", Created="2003-12-15T14:43:07Z"
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://purl.org/atom/ns#">
<title>My Entry Title</title>
<created>2003-12-15T14:43:07Z</created>
<content type="application/xhtml+xml" xml:lang="en">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Hello, <em>weblog</em> world!</p>
<p>This is my third post <strong>ever</strong>!</p>
</div>
</content>
</entry>
4.服务器通过时间戳和Nonce以及服务器保存的密码进行生成摘要,如果通过验证就可以允许用户访问资源。
这样一个过程,我觉得能解决一些问题,但是还有一些疑问:
1.由于客户要生成摘要和client nonce,客户端必须具有生成它们的能力,或者浏览器支持这种协议。
现在客户端的能力都比较强大,javascript就可以实现摘要的生成。具体程序参考:http://pajhome.org.uk/crypt/md5/,目前为止好像不没有哪个浏览器支持这种协议的。
2.由于只发送摘要,并没有真正发送密码,解决中间攻击的担忧。
这个不错,就要的这种效果。
3.由于nonce是只用一次,下次就随机产生另一个,由于这个是在客户端产生的,如果产生暴力猜测密码的情况怎么办?
这里的nonce只用一次就失效,可以防止黑客的replay攻击。但这过程中没有防止暴力攻击,不过有一个时间戳应该可以利用,如在服务器判断3或者1,2秒之内不能重试登录, 这个虽然不能完全避免,但至少可以减少一些攻击次数。其实最好的解决办法就是强口令,一个强口令就把这个问题解决的比较彻底了。如果不能强制用户使用强口令的话,我们可以加入通常采用的验证码的机制。还有就是上面提到的server nonce应该也可以直到一些作用。
4.如果服务器不保存真正的密码,而是只保存摘要的话,那用这种方法岂不是不能验证用户的合法性了?
如果服务器不保存真正的密码,而是摘要。如LDAP里一般就不保存明文密码,一般数据库里也不会保存真正明文密码,这个问题我还真想不到什么办法。如果服务器的摘要算法和客户端完全一致的话,可以用以下方法生成客户端摘要:
PasswordDigest = Base64 \ (SHA1 (Nonce + CreationTimestamp + DIGEST(Password)))。
就是把Password生成摘要,然后再用组合生成新的摘要。这样在服务器端也能顺利的验证用户的合法性。
我觉得这个方法可以和其他方法结合使用,应该效果不错。至少多了一层防护。
本文的思想主要来自:
http://www.xml.com/pub/a/2003/12/17/dive.html, 也引用他的测试的HTTP数据。加上我自己的理解。
如有不妥,希望能够得到指正。最后感谢“Atom Authentication”文章作者Mark。但是这里面的Atom和WSSE有什么关系,并没有搞清楚,可能Atom只是WSSE的一种实现? 望知道的哥们姐妹给一些提示。
分享到:
相关推荐
X-WSSE(Web Services Security Username Token Profile)是一种用于Web服务安全的身份验证机制,它允许客户端通过在HTTP请求中包含特定的安全令牌来证明自己的身份。这款插件对于开发人员或IT专业人员来说非常实用...
标签中的"wsse"代表WS-Security,这是一种Web服务安全标准,它定义了如何在SOAP消息中添加安全信息,如用户名/密码、数字签名和加密等。"Usernametoken"是WS-Security中的一种认证机制,允许使用用户名和密码进行...
5. **Digest鉴权**: Digest鉴权是一种比基本鉴权更安全的身份验证方式,它避免了密码在网络中的明文传输。在ONVIF中,客户端使用用户名和密码的哈希值进行鉴权,服务器通过验证这个哈希值来确认身份。 在进行ONVIF...
- **Java代码配置**:使用`javax.xml.ws.BindingProvider`的`setEndpointAddress`和`setOutboundProperties`方法,设置安全相关的属性,如`wsse.username`和`wsse.password`。 - **Spring XML配置**:在Spring配置...
对于"简单易懂"的描述,这可能意味着我们将探讨一种相对基础的验证方法,如HTTP Basic Authentication或Digest Authentication。在SOAP Header中实现这些方法,可以通过添加相应的XML元素来完成。例如,...
WS-Security是一种标准,用于在Web服务中提供安全功能,包括消息认证、加密、签名等。在XFire中,我们可以利用WSS4J库来实现这些功能。WSS4J提供了API来设置安全策略,如添加用户名令牌、数字签名或消息加密。 为了...
在Web服务领域,SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于交换结构化和类型化的信息。当涉及到Web Service客户端与服务器之间的交互时,有时需要在SOAP消息中添加额外的信息,例如身份验证或...
在IT行业中,Web服务是一种允许不同应用程序之间进行通信的技术,而`xfire`是一个流行的Java框架,用于构建和消费Web服务。本示例将详细解释如何利用xfire框架搭建一个包含SOAP Header身份验证和WS-Security身份验证...
RFID是一种非接触式的自动识别技术,广泛应用于物流、零售、医疗等多个领域,但其无线传输特性也带来了诸多安全挑战。 首先,RFID通信通常基于HTTP或JMS等协议,而WS-Security标准为这些协议提供了安全增强。它将...
Base64是一种将二进制数据编码为ASCII字符串的方法,以便在网络传输或存储时不会因为特殊字符而出现问题。在Java 8及以上版本,JDK已经内置了`java.util.Base64`类,可以直接使用。 2. **HTTP请求库**: 示例代码...
这是一种基于用户名和密码的身份验证机制,定义在OASIS WSS(Web Services Security)规范中。在SOAP头中,包含`<wsse:UsernameToken>`元素,用于传递用户名和密码(明文或加密),确保只有授权用户可以访问服务。 ...
在Web服务领域,SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于交换结构化和类型化的信息。SOAP Header是SOAP消息的一个重要组成部分,它允许传递与SOAP消息处理相关的元数据,例如安全性、事务...
ONVIF(Open Network Video Interface Forum)是一种开放标准,用于提高基于IP的安防产品的互操作性。该标准支持视频监控和安全硬件设备之间的通信,如网络摄像头、视频管理软件等。 #### 二、ONVIF开发环境搭建 ...
介绍httplib2是一个全面的HTTP客户端... 消化基本的WSSE快取该模块可以选择与可理解Cache-Control:标头并使用ETag和Last-Modified缓存验证器的专用缓存一起运行。所有方法该模块可以处理任何HTTP请求方法,而不仅仅是
在IT行业中,Web服务是一种广泛采用的技术,用于不同系统之间的数据交换和功能调用。Axis是Apache软件基金会开发的一个开源工具,主要用于创建和部署Web服务。本文将详细讲解使用Axis部署Web服务时涉及的关键资源库...
Onvif(Open Network Video Interface Forum)是一种开放的国际标准,用于定义网络视频监控设备的接口,使得不同厂商的产品能够互相兼容。它基于SOAP(Simple Object Access Protocol)和WS-* Web服务规范,允许设备...