java - 如何根据网络服务器中的php部分在android java中进行WSSE身份验证实现?

标签 java php encryption ws-security wsse

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

问题实际上是关于我应该在 Java 中使用哪些确切的函数才能得到与 PHP 中相同的结果。

用于 header 生成的 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}\"";

用于 header 验证的 PHP 部分:

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

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

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)
        + "\"";

问题是:

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

最佳答案

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

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

关于java - 如何根据网络服务器中的php部分在android java中进行WSSE身份验证实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16782685/

相关文章:

java - 是否可以通过 Spring Boot 中的 application.properties 修改日志附加器参数?

PHP 将 ISO-8859-3 字符转换为 UTF-8

javascript - 当我在 codeigniter 中使用 jquery 发出警报时没有任何反应

javascript - 如何解密 node.js 中使用 Rijndael-256 加密的消息?

encryption - 如何找出使用哪种加密/散列方法

go - 将 os.Stdin 转换为 []byte

java - 在 Canvas 上绘制多种尺寸的多条线

java - 将 SSL 连接与 Akka 结合使用 - 无法使配置正常工作

java - 如何从预先确定的目录(按文件名)复制给定文件

php - 从 MySQL 迁移到 MySQLi 扩展