webservice的安全问题
webservice的安全问题
1 身份校验
1 在需要进行验证的接口中加入拦截器 2 对拦截器进行配置,对调用接口的身份进行拦截 3 usernameToken |
2 信息加密
Wssj=webservice security for java
Wss4j安全策略
安全令牌Cxf-usernameToken
usernameToken用户调用ws接口时候,携带的安全令牌
原理:用户在发送请求的时候,在Soap head中加入自己的用户名以及密码,接受请求的Service通过之前与Client建立的共享密码来验证密码的合法性从而实现鉴别用户的功能。
公钥与私钥
Cxf往期jar包截图
Cxf版本问题
•Cxf2.0可以直接使用wss4j写ws的usernametoken安全令牌程序
•Cxf3.0以后去掉了wss4j的集成
•Cxf3.0以后需要单独引入 Cxf-rt-ws-security
•Cxf目前目前最流行版本是3.0.5
接口安全:客户端ws-callback
接口安全:服务器ws-callback
soap请求消息格式
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myus="http://myUserWebService/"><soapenv:Header/><soapenv:Body><myus:login><!--Optional:--><arg0><!--Optional:--><email>?</email><id>?</id><!--Optional:--><name>?</name><!--Optional:--><password>?</password><!--Optional:--><telphone>?</telphone><!--Optional:--><user_name>?</user_name></arg0></myus:login></soapenv:Body>
</soapenv:Envelope>
•Soap的 head标签中Type的类型
明文密码
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myus="http://myUserWebService/"><soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken >
<wsse:Username>cxf</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">123</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header><soapenv:Body><myus:SelectDemo/></soapenv:Body>
</soapenv:Envelope>
非明文密码
<wsse:UsernameToken> <wsse:Username>NNK</wsse:Username> <wsse:Password Type="...#PasswordDigest"> weYI3nXd8LjMNVksCKFV8t3rgHh3Rw== </wsse:Password> <wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce> <wsu:Created>2003-07-16T01:24:32Z</wsu:Created>
</wsse:UsernameToken>
PasswordText
PasswordDigest
使用了PasswordDigest类型的Password不使用明文密码
wsse:Nonce和wsu:Created两个元素:
这样做是为了避免重放(Replay)攻击
Digest计算公式如下
Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )
接口安全:服务器安全拦截
三个参数是什么
•验证方式:usernameToken
WS-Security目前所支持的Security Token
•密码类型:
passwordType/ PasswordDigest
明文密码/密码加密算法
•回调验证函数
passwordCallbackRef
demo展示
服务端的配置
pom的依赖
<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-ws-security</artifactId><version>3.0.5</version></dependency><dependency><groupId>org.apache.ws.security</groupId><artifactId>wss4j</artifactId><version>1.5.2</version></dependency>
TestServerInf.java
package com.atguigu.server;import javax.jws.WebService;@WebService
public interface TestServerInf {public String ping(String hello);
}
TestServerImp.java
package com.atguigu.server;public class TestServerImp implements TestServerInf {@Overridepublic String ping(String hello) {System.out.println("cxf接口调用:" + hello);return "pong";}}
applicationContext.xml
<bean id="myCallback" class="com.atguigu.util.MyCallback"></bean><bean id="in" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"><constructor-arg><map key-type="java.lang.String"><entry key="action" value="UsernameToken"></entry><entry key="passwordType" value="PasswordText"></entry><entry key="passwordCallbackRef" value-ref="myCallback" ></entry></map></constructor-arg></bean><jaxws:endpoint address="/ws" implementorClass="com.atguigu.server.TestServerInf"><jaxws:inInterceptors><ref bean="in"/></jaxws:inInterceptors><jaxws:implementor><bean class="com.atguigu.server.TestServerImp"></bean></jaxws:implementor></jaxws:endpoint>
MyCallback.java
package com.atguigu.util;import java.io.IOException;import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;import org.apache.wss4j.common.ext.WSPasswordCallback;
import org.apache.wss4j.dom.handler.WSHandlerConstants;public class MyCallback implements CallbackHandler {@Overridepublic void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {// 配置username/password的代码WSPasswordCallback wsc = (WSPasswordCallback) callbacks[0];String user = wsc.getIdentifier();String password = "";// 查询数据库或者配置文件// 配置私人的加密协议if (user.equals("cxf")) {password = "123";}wsc.setPassword(password);}}
客户端的配置
ws.properties
login_url=http://localhost:8888/mall_user/login?wsdl
test_url=http://localhost:8888/mall_user/ws?wsdl
applicationContext.xml
<bean id="testServerInf" class="com.atguigu.util.MyWsFactoryBean"><property name="url" value="${test_url}"></property><property name="t" value="com.atguigu.server.TestServerInf"></property>
</bean>
TestServerInf.java
package com.atguigu.server;import javax.jws.WebService;@WebService
public interface TestServerInf {public String ping(String hello);
}
MyFactoryBean.java
package com.atguigu.util;import java.util.HashMap;import org.apache.commons.collections.map.HashedMap;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.wss4j.dom.handler.WSHandlerConstants;
import org.springframework.beans.factory.FactoryBean;import com.atguigu.server.LoginServerInf;
import com.mchange.v2.codegen.bean.ClassInfo;public class MyFactoryBean<T> implements FactoryBean<T> {private String url;private Class<T> t;public static <T> T getMyWs(String url, Class<T> t){JaxWsProxyFactoryBean jwfb = new JaxWsProxyFactoryBean();jwfb.setAddress(url);jwfb.setServiceClass(t);//加入安全协议if(t.getSimpleName().equals("TestServerInf")) {HashMap<String, Object> hashMap = new HashMap<String, Object>();hashMap.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);hashMap.put(WSHandlerConstants.PASSWORD_TYPE, "PasswordText");hashMap.put("user", "username");hashMap.put(WSHandlerConstants.PW_CALLBACK_CLASS, MyCallback.class.getName());WSS4JOutInterceptor wss4jOutInterceptor = new WSS4JOutInterceptor(hashMap);jwfb.getOutFaultInterceptors().add(wss4jOutInterceptor);}T bean = (T)jwfb.create();return bean;}@Overridepublic T getObject() throws Exception {// TODO Auto-generated method stubreturn getMyWs(url, this.t);}@Overridepublic Class<?> getObjectType() {// TODO Auto-generated method stubreturn this.t;}@Overridepublic boolean isSingleton() {// TODO Auto-generated method stubreturn false;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Class<T> getT() {return t;}public void setT(Class<T> t) {this.t = t;}}
MyCallback.java
package com.atguigu.util;import java.io.IOException;import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;import org.apache.wss4j.common.ext.WSPasswordCallback;
import org.apache.wss4j.dom.handler.WSHandlerConstants;public class MyCallback implements CallbackHandler {@Overridepublic void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {// 配置username/password的代码WSPasswordCallback wsc = (WSPasswordCallback) callbacks[0];wsc.setIdentifier("cxf");String password = "123";// 查询数据库或者配置文件wsc.setPassword(password);}}
Controller类
@Autowired
TestServerInf testServerInf;@RequestMapping("sayHello")
public String sayHello(String hello){testServerInf.ping(hello);
}
webservice的安全问题相关推荐
- webservice 安全性 对外_WebService安全性的几种实现方法【身份识别】
相信很多开发者都用过WebService来实现程序的面向服务,本文主要介绍WebService的身份识别实现方式,当然本文会提供一个不是很完善的例子,权当抱砖引玉了. 首先我们来介绍webservic ...
- java webservice认证_WebService 之 身份验证
在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑到了WebService是安全问题,很容易想到通过一组用户名与密码来防止非法用户的调用 . 一.Networ ...
- C#调用Web Service时的身份验证
在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑以下问题:怎么防止别人访问我的 WebService?从哪里引用我的WebService?对于第一个问题,就 ...
- Delphi实现WebService带身份认证的数据传输
WebService使得不同开发工具开发出来的程序可以在网络连通的环境下相互通信,它最大的特点就是标准化(基于XML的一系列标准)带来的跨平台.跨开发工具的通用性,基于HTTP带来的畅通无阻的能力(跨 ...
- pox 中 openflow.webservice 组建的学习与使用
Openflow的一个简单JSON-RPC-ish web service交互式接口,由of_service信息服务派生而来,依赖于webcore组件.可以使用HTTP POST方式发送JSON进行访 ...
- WebService的事务处理 (转)
因为这个问题讨论起来内容比较多一些,所以另开一个话题. 如果你只是要解决两个系统之间的事务同步问题,可以采用判断服务是否成功的办法来解决,即: * A系统开始自己的事务,处 ...
- WebService与使用风格RPC/SOA/REST
WebService与使用风格RPC/SOA/REST 一 webservice Web Services 可使您的应用程序成为 Web 应用程序.Web Services 通过 Web 进行发布.查 ...
- Web API 安全问题
目录 Web API 安全概览 安全隐患 1. 注入(Injection) 2. 无效认证和Session管理方式(Broken Authentication and Session Manageme ...
- Java2017面试宝典--XML部分、 流行的框架与新技术、软件工程与设计模式、 j2ee部分、EBJ部分、 webservice部分...
1.xml有哪些解析技术?区别是什么? 答:有DOM,SAX,STAX等 DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文 ...
最新文章
- 从粒子到宇宙的旅行指南
- Python学习—函数
- 31全志r58平台Android4.4.2下打开USB摄像头
- Android插件化原理解析——概要
- SpringBoot启动流程分析(四):IoC容器的初始化过程
- 初学Phreeze 3
- Extjs中引入JSP页面
- PHP中的数组(指针)
- WinForm窗体内嵌浏览器实现方式
- Linux/Android之perf追内存泄漏工具(api级别)(一百)
- C/C++ 语言中.h文件和.c文件详细解析 引用 .c和.h文件的区别
- ARFoundation入门1.0 什么是AR
- matlab如何画动态圆弧,几何画板动态演示转弧成球的过程
- Windows批量修改文件名
- bam文件转fq.gz文件
- 如何查询网站服务器供应商,查询网站服务器提供商
- P4117 [Ynoi2018] 五彩斑斓的世界
- 车路协同路侧全息感知解决方案
- 微信小程序wepy框架编译生成dist目录
- 计算机网页加载失败如何解决方法,如何解决“当前页面脚本发生错误”的问题...
热门文章
- Mac OS中隐藏和显示文件的操作
- ChatGPT 如何获取API Key
- pom文件配置阿里云仓库 转
- STL库:vector
- 7周入门数据分析:(2)分析界的No.1——Excel
- 关于计算机系调查问卷表,计算机系统调查问卷.xls
- 2022软件测试自学全套教程-基于python自动化软件测试-2022新版软件测试中级程序员学习路线
- define _WINSOCK_DEPRECATED_NO_WARNINGS
- 伤害世界稳定服务器,伤害世界哪个服务器好_伤害世界怎么选服务器_牛游戏网...
- 基于SpringBoot的分销商城的设计与实现(论文+源码)_kaic