代码改变世界

让ksoap支持wsse加密的soap报文

  youxiachai  阅读(1976)  评论(0编辑  收藏  举报

前言

最近,做基于soap服务的项目,获得的一些经验性技巧,分享给大家

WSSE是什么?

传送门

http://ws.apache.org/wss4j/

支持6种不同的加密方式,不过我这里只介绍Username Token Profile 1.1

开始动手

  阅读Username Token Profile 1.1 后你会知道,我们需要在soap报文头加上什么XML结点,这里就不对XML结点进行介绍,官方文档已经介绍的很详细了.

  你已经知道了XML结点的含义以后,就继续看下去,怎么构造符合要求的password

构造password

  其实,WSSE最核心就是我们如何构造生成这个密钥,从官方文档中我们知道密钥的读取是:

Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) ) 

整个密钥关键是由:随机字符串,创建时间,和真实密码构成,知道这点以后就是如何利用java 按照这个步骤生成密钥

生成算法

  这部分对于懂的人很简单,但是对于不知道的很困难,之前,我就一直死在了这块,还好有个朋友帮了我一把终于搞明白,原来在jjava下是这么简单的.

首先,要处理SHA-1算法:

在java 下实现 sha-a 算法实在简单:

1
2
MessageDigest md;
md = MessageDigest.getInstance("SHA-1");

 

就这样就可以完成了SHA算法的初始化,实在简单呀,之前,我还到处去找包实现,实在对Java太不了解了

生成了这么一个SHA 对象,只是开始,我们需要填充相应的值进去即可.下面要了解请认真观看

1
2
3
4
5
6
7
8
//从官方文档可以知道我们nonce还需要用这里用的是Koap自带的Base64解码一次
byte[] b1 = nonce != null ? Base64.decode(nonce) : new byte[0];
//生成字符字节流
byte[] b2 = created != null ? created.getBytes("UTF-8")
                : new byte[0];
byte[] b3 = password;
//根据我们传得值的长度生成流的长度
byte[] b4 = new byte[b1.length + b2.length + b3.length];

接下来就是根据文档拼接我们的字符串

1
2
3
4
5
//利用sha-1加密字符
md.update(b1, 0, b1.length);
md.update(b2,0,b2.length);
md.update(b3,0,b3.length);
//生成sha-1加密后的流
1
2
3
b4 = md.digest();
//生成最终的加密字符串       
String result = new String(Base64.encode(b4));

之前,花了好几个小时,在这方面的资料,最后,发现原来可以这么简单,也许是平时接触的加密等级不高所造成的吧.

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示