讓ksoap支持wsse加密的soap報文

fmms 12年前發布 | 30K 次閱讀 ksoap WEB服務/RPC/SOA

前言

最近,做基于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 算法實在簡單:

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

 

就這樣就可以完成了SHA算法的初始化,實在簡單呀,之前,我還到處去找包實現,實在對Java太不了解了

生成了這么一個SHA 對象,只是開始,我們需要填充相應的值進去即可.下面要了解請認真觀看

//從官方文檔可以知道我們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];

接下來就是根據文檔拼接我們的字符串

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

之前,花了好幾個小時,在這方面的資料,最后,發現原來可以這么簡單,也許是平時接觸的加密等級不高所造成的吧.
轉自:http://blog.csdn.net/youxiachai/article/details/7067192

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!