WS Security 认证方式详解

本文参考文档如下:

MSDN 官方详解 : http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/HowASP.NETWebServicesWork.mspx?mfr=true

WS安全规范说明 : https://www.oasis-open.org/committees/download.php/16782/wss-v1.1-spec-os-UsernameTokenProfile.pdf

WS Security 一些历史信息 : http://zh.wikipedia.org/wiki/WS-Security

如有不理解,请参考上面三个资源。

 

WS-Security 所涉及的三个方面:身份验证、签名和加密

1.身份验证

常用的的三种认证方法:

 

1.1用户名/密码

在Apache CXF中,可以使用如下定义来使用用户名密码认证:

客户端:

<jaxws:client id="xxx" serviceClass="xxxy"
        address="xxx">
        
        <jaxws:outInterceptors>
            <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
                <constructor-arg>
                    <map>
                        <entry key="action" value="UsernameToken"/>
                        <entry key="user" value="xxx"/>
                        <!-- Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )  -->
                        <entry key="passwordType" value="PasswordDigest"/>
                        <entry key="passwordCallbackRef" value-ref="myPasswordCallback"/>
                    </map>
                </constructor-arg>
            </bean>
        </jaxws:outInterceptors>
        
    </jaxws:client>

  以上的passwordType值为PasswordText时,则密码使用明文传输;为PasswordDigest时,则Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )

比如传输的SOAP报文为:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <wsse:Security
            xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
            xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
            soap:mustUnderstand="1">
            <wsse:UsernameToken wsu:Id="UsernameToken-1">
                <wsse:Username>xxx</wsse:Username>
                <wsse:Password
                    Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">4t7Q2C0DnV21ie6ngsv6CwZ3vVw=</wsse:Password>
                <wsse:Nonce
                    EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">R+6n+Z5L6FaG8IqeDrLGXw==</wsse:Nonce>
                <wsu:Created>2014-04-21T09:56:51.361Z</wsu:Created>
            </wsse:UsernameToken>
        </wsse:Security>
    </soap:Header>
    <soap:Body>
        ......
    </soap:Body>
</soap:Envelope>

 

  则上面计算的Password_Digest的参数则来源于wsse:Security下面的各个节点参数值。

使用加密的密码传输,则客户端与服务端都需要指定一个passwordCallbackRef,该实现类继承CallbackHandler,下面做个示例

public class ClientMyPasswordCallback implements CallbackHandler {
    
    private static final Log log = LogFactory.getLog(MyPasswordCallback.class);
    
    /* (non-Javadoc)
     * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
     */
    public void handle(Callback[] callbacks) throws IOException,
            UnsupportedCallbackException {

        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        
        pc.setPassword("xxx");
        
        
    }
    
}

 

  服务端则使用:

public class ServerMyPasswordCallback implements CallbackHandler {
    
    private static final Log log = LogFactory.getLog(MyPasswordCallback.class);
    
    /* (non-Javadoc)
     * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
     */
    public void handle(Callback[] callbacks) throws IOException,
            UnsupportedCallbackException {

        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        
    //通过数据库得到该用户名的密码,这里略去该过程
String password = getPwdByUname(pc.getIdentifier());
  

        pc.setPassword(password );//直接设置从数据库得到的密码,WSS4J自动匹配该值与客户端传入的值,不需要调用pc.getPassword();因为它总是返回null
        
        
    }
    
}

  服务端的拦截器中匹配密码方式是自动的,不需要从pc.getPassword()得到密码自己匹配,由于加密算法比较麻烦,所以省去这一步应该是比较好的设计

 

X.509 证书与Kerberos则参考:

http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/HowASP.NETWebServicesWork.mspx?mfr=true

文章里说明很清楚,不再重复。

 

2.签名

签名可以防止消息在传输中被篡改进行重复攻击等,可使用私钥对需要的部分进行签名,比如在上节的<身份认证>中,如果消息被截获,可导致重复攻击,

需要对请求设置过期时间(wsu:Timestamp->wsu:Expires)并签名。

 

3.消息包数据加密

若传输的消息属于高安全级别,则需要使用X.509 证书对消息加密,即客户端使用服务端的公钥加密,服务端通过私钥解包,消息包只能在知道服务端私钥情况下才能解开。

要对全部SOAP包加密,可启用SSL(通常为HTTPS)。

 

转载于:https://www.cnblogs.com/mikevictor07/p/3678535.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SPI WS2812驱动程序是一种用于控制WS2812灯带的驱动程序。WS2812灯带是一种智能彩色灯带,它由一组可编程的RGB LED组成,并通过单独的数据线进行控制。 SPI(Serial Peripheral Interface)是一种串行外设接口,它允许主控制器与其他外设进行通信。SPI WS2812驱动程序利用SPI接口与WS2812灯带进行通信,在主控制器发送数据时,驱动程序会将数据解析并转化为控制WS2812灯带的指令。 驱动程序详解如下: 1. 初始化:驱动程序需要在使用之前进行初始化,包括配置SPI接口的参数和引脚的初始化。这些参数包括时钟频率、数据格式和传输模式等。初始化完成后,驱动程序可以准备发送数据。 2. 数据传输:驱动程序通过SPI接口将控制指令发送给WS2812灯带。这些指令包括灯光的颜色、亮度和模式等。驱动程序将这些指令转化为特定的数据格式,并通过SPI接口将数据发送给WS2812灯带。 3. 数据解析:WS2812灯带接收到数据后,驱动程序需要对数据进行解析。驱动程序会将接收到的数据按照约定的格式进行解析,并将解析后的数据转化为相应的控制信号。这些控制信号可以控制WS2812灯带的亮度、颜色和模式等。 4. 控制输出:解析后的数据将被传输到WS2812灯带的控制引脚上,以控制灯带的亮度和显示效果。驱动程序将数据发送到灯带时要考虑时序和数据传输的速率,以确保数据正常传输。 SPI WS2812驱动程序的详解主要涉及初始化、数据传输、数据解析和控制输出等方面。通过驱动程序的控制,可以实现精确的灯光控制和多种灯光效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值