2011-01-26 6 views
3

Webサービス呼び出しのためにJavaでutilクラスを作成しました。私のutilクラスは、Webサービス呼び出しに必要なパスワードダイジェストを作成します。このダイジェストパスワードは、次のアルゴリズムで生成されたダイジェストパスワードです。base64Encode(sha1Hash(<Nonce><TimeStamp><Secret>))java utilクラスのBASE64でSHA1が正しいパスワードを生成しない

私の生成したパスワードは、同じアルゴリズムを使用しているベンダーのツールから生成されたパスワードと同じではありませんコードなので、どのように実装されているのかわかりません)。私が何か間違っていたかどうかは分かりません。誰かが私のコードを見て、SHA1暗号化やBase64エンコーディングで何か問題があったかどうか確認できますか?ご協力いただきありがとうございます!以下は、私のコードは次のとおりです。

import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.TimeZone; 
import java.util.UUID; 

import javax.xml.bind.DatatypeConverter; 
import org.apache.commons.codec.binary.Base64; 

public class OminitureWSUtil { 

private static MessageDigest SHA1; 

static { 
    try { 
     SHA1 = MessageDigest.getInstance("SHA1"); 

    } catch(NoSuchAlgorithmException nae) { 
     throw new RuntimeException(nae); 
    } 
} 

static class OmniturePasswordDigest { 
    private final String timestamp; 
    private final String nonce; 
    private final String secret; 

    private String password; 

    public OmniturePasswordDigest(String secret) { 
     Calendar c = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT+0")); 
     c.setTime(new Date()); 

     //timestamp = DatatypeConverter.printDateTime(c); 
     //nonce = UUID.randomUUID().toString().replace("-", ""); 

     timestamp = "2011-01-26T20:10:56Z"; 
     nonce = "MTkyMTYwZWMzMjIzZGJmYzNiYmE5M2E5"; 

     this.secret = secret; 
    } 

    public String getTimestamp() { 
     return timestamp; 
    } 

    public String getNonce() { 
     return nonce; 
    } 

    public String generatePassword() { 
     if(password == null) { 
      String beforeEncryption = nonce+timestamp+secret; 
      System.out.println("before encryption, encoding: " + beforeEncryption); 

      try { 
       SHA1.reset(); 
       byte[] toEncrypt = beforeEncryption.getBytes("UTF-8"); 
       //SHA1.update(toEncrypt, 0, toEncrypt.length); 
       SHA1.update(beforeEncryption.getBytes()); 
      } catch (UnsupportedEncodingException uee) { 
       throw new RuntimeException(uee); 
      } 

      byte[] encryptedRaw = SHA1.digest(); 
      byte[] encoded = Base64.encodeBase64(encryptedRaw); 

      try { 
       password = new String(encoded, "UTF-8"); 
      } catch (UnsupportedEncodingException uee) { 
       throw new RuntimeException(uee); 
      } 
     } 

     return password; 
    } 
} 


public static OmniturePasswordDigest generatePasswordDigest(String secret) { 
    return new OmniturePasswordDigest(secret); 
} 

public static void main(String[] args) { 
    OmniturePasswordDigest opd = generatePasswordDigest("1779ab07fb93a01e3d4a6ee174124b91"); 
    System.out.println("nonce: " + opd.getNonce()); 
    System.out.println("timestamp: " + opd.getTimestamp()); 
    System.out.println("password: " + opd.generatePassword()); 

    if("Lr+m+/6y3XUxvjd8Rtn75gqn/b4=".equals(opd.generatePassword())) { 
     System.out.println("all good"); 
    } else { 
     System.out.println("generated password is not the same, it should be: " + 
       "Lr+m+/6y3XUxvjd8Rtn75gqn/b4="); 
    } 

} 

}

答えて

2

マイル離れてから見ることができるSHA1のレース。そのようなコードを変更し :

-SHA1.reset(); 
+MessageDigest SHA1= (MessageDigest) OminitureWSUtil.SHA1.clone(); 

リセットは、あなたが必要なものだけではありません。クローンはそのような場合を意図しています。

btwクラスinit(static {})に例外をスローすると、そのクラスを参照する他のクラス(つまり、[web]アプリケーション全体)が破棄されます。例外(java.lang.ExceptionInInitializerError)がどこかに閉じ込められる可能性があるので、悪い習慣です。

+0

ポインタありがとう。代わりに、各getPasswordメソッドの呼び出しごとにMessageDigestの新しいインスタンスを作成するよう書き直しました。 MessageDigest.getInstance()を使用してMessageDigestを毎回インスタンス化すると、clone()は速くなりますか?もちろん、より速いために – Marcin

+0

:)。 "クローンはそのような場合を対象としています。" ...しかし、まあ、あなたは決して/あなたの右の自分の違いを見つけることはありません。次のコード: 'SHA1.update(beforeEncryption.getBytes());'は悪いですが、UTF-8や8859_1などを使用するか、システム全体のエンコーディングに依存しません。 – bestsss

0

私は、これがOmnitureのためのREST APIのある推測していますか?そこには実例があります。しかし、あなたのコードは一目瞭然です。

https://developer.omniture.com/java_rest_api

はまた、私はあなたがこのクラスを使用しようとしているのか分からないけどSHA1はスレッドセーフではなく、複数のものがのGeneratePasswordを呼び出す場合()あなたは、いくつかの予期しない動作を取得します。

+0

ありがとうございます!私は実際にこれを理解することができました。彼らはxmlメッセージのNonceをエンコードしているようですが、それは私のノンスをメッセージにコード化したことがないので私を捨てていたものです。 – Marcin

関連する問題