2013-05-28 3 views
0

Я использую symfony2 для веб-сервера и использую wsse-аутентификацию с заголовком x-wsse.Как выполнить реализацию аутентификации WSSE в javascript в соответствии с php-частью в веб-сервере?

Вопрос в том, какие именно функции я должен использовать в 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 часть для заголовка проверить:

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

Я не знаю, почему он использует nonceHigh вместо одноразового номера напрямую? Я считаю, что это вызывает проблему в 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) 
     + "\""; 

Вопрос:

  1. Почему PHP использует nonceHight вместо нонса?
  2. android java Base64.encodeToString() == php base64_encode()?
  3. android java Base64.decode() == php base64_decode()?
+0

Можете ли вы рассказать мне, как вы создали метку времени? Каков формат метода? У меня есть эта проблема: http://stackoverflow.com/questions/22629847/wsse-timestamp-generation-in-android, вы можете мне помочь? Спасибо!! – NewRehtse

ответ

2

Никто не отвечает. Хорошо, я положил свою информацию здесь, если кто-то встретит ту же проблему. Это решает проблему.

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

Привет, Я, у меня такая же проблема. Но я не понимаю, как вы исправили проблему. Можете ли вы разместить здесь весь свой код? – ChristopheCVB