如何根据webserver中的php部分在android java中实现WSSE认证



我使用symfony2作为web服务器,并使用带有x-wsse头的wsse身份验证。

这个问题实际上是关于我应该在Java中使用哪些确切的函数来给出与PHP相同的结果。

PHP头文件生成部分:

$nonce = substr( md5( uniqid( 'nonce_', true ) ), 0, 16 );
$nonceHigh = base64_encode( $nonce );
$passwordDigest = base64_encode( sha1( $nonce . $created . $password . "{" . $user->getSalt() . "}", true ) );
$header = "UsernameToken Username="{$username}", PasswordDigest="{$passwordDigest}", Nonce="{$nonceHigh}", Created="{$created}"";

PHP header部分验证:

$expected = base64_encode( sha1( base64_decode( $nonce ) . $created . $secret, true ) );

我不知道为什么它使用nonceHigh而不是直接使用nonce ?我相信这是导致java出现问题的原因。我也不知道应该生成nonce还是使用从服务器生成的。为了进行比较,我重用了来自服务器的nonce来生成摘要。

byte [] nonceLow = Base64.decode(nonceHigh, Base64.DEFAULT); // nonceHigh is from above
String nonce = String.valueOf(nonceLow); // this give strange result. is it wrong?
String temp = nonce + format(now) + password;
try {
    MessageDigest md = MessageDigest.getInstance("SHA1");
    //new String(Base64.encodeBase64(md.digest(temp.getBytes())));
    digest = Base64.encodeToString(md.digest(temp.getBytes("UTF-8")), Base64.DEFAULT);
} catch (Exception e) {
    throw new AuthenticationException(e.getMessage(), e);
}
String wsse =
    "UsernameToken Username="" + username
        + "", "
        + "PasswordDigest=""
        + digest
        + "", "
        + "Nonce=""
        + nonceHIGH
        + "", "
        + "Created=""
        + format(now)
        + """;

问题是:

    为什么PHP使用 nonceight 而不是nonce? android java Base64.encodeToString() == php base64_encode() ? android java Base64.decode() == php base64_decode()

无人接听。好的,我把我的发现放在这里,以防有人遇到同样的问题。这就解决了问题。

Base64.encodeToString(temp.getBytes("ISO-8859-1"), Base64.NO_WRAP);

相关内容

  • 没有找到相关文章

最新更新