我创建了一个使用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方案获得的最好的方式,但我倾向于知道是否有更好的替代方案......
谢谢!
微米。