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=");
}
}
}
ポインタありがとう。代わりに、各getPasswordメソッドの呼び出しごとにMessageDigestの新しいインスタンスを作成するよう書き直しました。 MessageDigest.getInstance()を使用してMessageDigestを毎回インスタンス化すると、clone()は速くなりますか?もちろん、より速いために – Marcin
:)。 "クローンはそのような場合を対象としています。" ...しかし、まあ、あなたは決して/あなたの右の自分の違いを見つけることはありません。次のコード: 'SHA1.update(beforeEncryption.getBytes());'は悪いですが、UTF-8や8859_1などを使用するか、システム全体のエンコーディングに依存しません。 – bestsss