簡體   English   中英

在Java中為ws-security UsernameToken實現密碼摘要

[英]Implementing password digest for ws-security UsernameToken in Java

我試圖從服務器上調用ws-security安全的Web服務,不幸的是,該服務器本身不支持此服務。 我采用的方法是在添加帶有ws-security元素的過程中實現一個.jsp,它充當實際端點URL的反向代理。

這似乎工作得很好,並且我相信我已經使用正確的名稱空間等正確構建了XML。我已經通過將XML與SOAP-UI生成的XML進行比較來驗證了這一點。

問題在於實現密碼摘要生成器。 使用NOnce,xsd:dateTime和密碼以及以下代碼使用相同的輸入時,我得到的結果與SOAP-UI的結果不同。

StringBuffer passwordDigestStr_ = new StringBuffer();

// First append the NOnce from the SOAP header
passwordDigestStr_.append(Base64.decode("PzlbwtWRpmFWjG0JRIRn7A=="));

// Then append the xsd:dateTime in UTC timezone
passwordDigestStr_.append("2012-06-09T18:41:03.640Z");

// Finally append the password/secret
passwordDigestStr_.append("password");

System.out.println("Generated password digest: " + new String(com.bea.xbean.util.Base64.encode(org.apache.commons.codec.digest.DigestUtils.sha(passwordDigestStr_.toString())), "UTF-8"));

我認為問題在於實現前兩個元素的哈希,如http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf所述

請注意,隨機數使用其解碼值的八位位組序列進行哈希處理,而時間戳使用元素內容中指定的UTF8編碼的八位位組序列進行哈希處理。

如果有人可以幫助我解決這個問題,那將很棒,因為它開始使我發瘋! 如果您可以提供源代碼,那將是理想的選擇。

我將在沒有SOAP-UI的情況下對其進行破解。 哈希函數的輸入應該是字節,而不是字符串。 DigestUtils.sha()將允許您使用字符串,但是該字符串必須正確編碼。 當您編寫隨機數時,您正在調用StringBuffer.append(Object) ,最終該調用了byte[].toString() StringBuffer.append(Object) byte[].toString() 那會給您類似[B@3e25a5東西,絕對不是您想要的東西。 通過在各處使用字節,您應該避免此問題。 請注意,下面的示例使用org.apache.commons.codec.binary.Base64 ,而不是您使用的Base64類。 沒關系,那只是我方便的那個。

ByteBuffer buf = ByteBuffer.allocate(1000);
buf.put(Base64.decodeBase64("PzlbwtWRpmFWjG0JRIRn7A=="));
buf.put("2012-06-09T18:41:03.640Z".getBytes("UTF-8"));
buf.put("password".getBytes("UTF-8"));
byte[] toHash = new byte[buf.position()];
buf.rewind();
buf.get(toHash);
byte[] hash = DigestUtils.sha(toHash);
System.out.println("Generated password digest: " + Base64.encodeBase64String(hash));

抱歉延遲回復,尤其是考慮到您的初步快速回復。 現在,我已經能夠使用您的方法的本質使它起作用,從而避免了任何字符編碼問題。 但是, java.nio.ByteBuffer導致了我的問題,所以我修改了代碼以使用基本的byte[] ,這些基本的byte[]通過System.arrayCopy()組合在一起。 我在java.nio.ByteBuffer中遇到的問題是,盡管'buf.position()'返回了適當數量的字節, byte[] toHash通過buf.get(toHash)注入到byte[] toHash所有字節均為0s!

非常感謝您的協助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM