实现密码的Java消化的WS-Security的用户名令牌(Implementing passwor

2019-07-29 20:07发布

我试图做一个WS-Security的安全Web服务调用从遗憾的是并不支持这样的服务器。 我所采取的方法是实现其充当反向代理的实际终点的URL,在此过程中添加具有WS-安全元件的元件的.jsp。

这似乎是合作得非常好,我相信我已经构建正确的XML具有正确的命名空间等我通过比较与SOAP-UI产生XML的XML验证了这一点。

问题是,在实现密码摘要发生器。 我没有得到相同的结果是什么SOAP-UI也使用相同的输入进行的随机数,XSD:datetime和密码,然后将下面的代码。

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编码的八位位组序列散列。

如果有人可以帮助,因为它开始让我疯狂我解决这个问题,这将是伟大的! 这将是理想的,如果你能提供源代码。

Answer 1:

我要一条缝它没有SOAP-UI。 输入到散列函数应该是字节,而不是字符串。 DigestUtils.sha()将允许您使用一个字符串,但该字符串必须正确编码。 当你写的随机数,你打电话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));


Answer 2:

道歉在回答延迟,特别是考虑到您最初的快速反应。 现在我已经能够得到这个使用方法的精髓,以避免任何字符编码问题需要解决。 然而, java.nio.ByteBuffer引起了我发出所以我修改代码来使用基本byte[] S的我结合使用System.arrayCopy() 我面临的问题java.nio.ByteBuffer是,尽管“buf.position()返回字节适当数量的,所有的字节注入byte[] toHash通过buf.get(toHash)分别为0!

非常感谢您的帮助。



文章来源: Implementing password digest for ws-security UsernameToken in Java