Per the oasis spec, the UsernamePassword is summarized by the algorithm:
   base64(sha-1(nonce+created+password))

But, n our scenario we don't store cleartext passwords - only the sha-1 hash
of them.  The oasis spec allows this via what they claim as "..password
equivalent".  The problem I'm running into is that our password equivalent
is sha-1(password) or ultimately this equivalent:
   base64(sha-1(nonce+created+sha-1(password)))

When the applicability of this approach was questioned to the oasis list,
they confirmed it:
http://lists.oasis-open.org/archives/wss-dev/201006/msg00003.html

But, when using the wss4j WSPasswordCallback mechanism, the call expects the
password to be a string but the binary output of the digest if converted to
a string, then back to the bytes (by UsernameToken.doPasswordDigest()) does
not result in the original byte array - causing any digest calculations to
fail.

Since I cannot change the framework, I was curious if there was a way to
supercede or register the UsernameToken class with my own so I can pass a
base64(sha-1(password)) through the current api's via the WSPasswordCallback
mechanism and have the custom UsernameToken class perform the base64 decode
to get the original binary bytes of the sha-1(password) we need to pass
through.

I'm also open to other suggestions and for additional context - I'm
attempting to use the spring-ws package as a client with a custom callback
handler like this:

    <bean id="securityClientInterceptor"
class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
        <property name="securementActions" value="UsernameToken"/>
        <property name="securementUsername" value="${username}"/>
        <property name="securementUsernameTokenElements" value="Nonce
Created"/>
        <property name="securementPasswordType" value="PasswordDigest"/>
        <property name="securementMustUnderstand" value="true"/>
        <property name="securementCallbackHandler">
            <!-- this will pre-hash the password with sha-1 before the
password is passed through wss4j -->
            <bean id="preHashedWSPasswordCallbackHandler"
class="xxx.xxx.xxx.PreHashedWSPasswordCallbackHandler">
                <property name="cleartextPassword" value="${password}"/>
            </bean>
        </property>
    </bean>

Thanks,

Jim

Reply via email to