[英]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.