我创建了一个使用 WS-Security 保护的 WS 端点。客户端身份验证基于具有 PasswordDigest 密码类型的 UsernameToken(遗憾的是,基于证书的身份验证不是一个选项,我们有一些旧客户端)。
这是示例 SOAP 请求:
<soapenv:Envelope>
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>XXX</wsse:Username>
<wsse:Password>vCsshCTkiz07lpCZXVYgwXPU7n4=</wsse:Password>
<wsse:Nonce>fsf9Vc2YNErZy4Cc2wcYjw==</wsse:Nonce>
<wsu:Created>2013-06-06T09:31:16.757Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<rem:start>
<xxx>111</xxx>
</rem:start>
</soapenv:Body>
</soapenv:Envelope>
据我了解,密码生成为 Base64(SHA(Nonce+Created+ClearTextPassword))。
我正在实现一个 CXF PasswordCallback 为 CXF 框架提供正确的明文密码,因此它可以计算其摘要值并与提供的值进行比较。
public class PasswordCallbackHandler implements CallbackHandler {
@Override
public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
final WSPasswordCallback passwordCallback = (WSPasswordCallback) callbacks[0];
passwordCallback.setPassword("cleartextpassword");
}
}
我担心的是我必须将密码值设置为纯文本,因此我必须以明文形式存储它们(我的用例:在数据库中)。
我觉得这是我在 PasswordDigest 场景中所能得到的最好的,但我倾向于知道是否有更好的选择......
谢谢!
M。