Herr_M
Erfahrenes Mitglied
Hallo zusammen,
Ich versuche gerade ein Programm zu schreiben, dass auf einen Webservice zugreift und sich dort mittels eines public und eines Secret Keys authentifziert.
Der Aufbau der Verbindung etc klappt schon nur mit der Berechnung des Hashwertes für den Secret Key gibt es Probleme.
Laut Anbieter des Webservices ist der Key der dort ankommt zu kurz?!
In der API des Webservice ist angegeben, dass die Signatur (also der gehashte/geheime Teil wie folgt zu berechnen ist.
Wenn ich das richtig verstanden habe soll von "SignaturString + secret_key" ein Hashwert berechnet werden unter Verwendung des SHA1 Algorithmus und dieser Hashwert dann nochmals mit Base64 encodiert oder?
Habe das wie folg in JAVA gelöst... scheint aber das falsche Ergebnis zu liefern, da angeblich zu kurz?
Vom Prinzip her macht das Programm doch genau das was spezifiziert ist oder etwa nicht? Hab ich da irgendwo einen Prinzipiellen Fehler drin, der mir jetzt so nicht auffällt oder hab ich was vergessen?
Ich versuche gerade ein Programm zu schreiben, dass auf einen Webservice zugreift und sich dort mittels eines public und eines Secret Keys authentifziert.
Der Aufbau der Verbindung etc klappt schon nur mit der Berechnung des Hashwertes für den Secret Key gibt es Probleme.
Laut Anbieter des Webservices ist der Key der dort ankommt zu kurz?!
In der API des Webservice ist angegeben, dass die Signatur (also der gehashte/geheime Teil wie folgt zu berechnen ist.
Signatur = base64_encode(sha1(SignaturString + secret_key)
Wenn ich das richtig verstanden habe soll von "SignaturString + secret_key" ein Hashwert berechnet werden unter Verwendung des SHA1 Algorithmus und dieser Hashwert dann nochmals mit Base64 encodiert oder?
Habe das wie folg in JAVA gelöst... scheint aber das falsche Ergebnis zu liefern, da angeblich zu kurz?
Vom Prinzip her macht das Programm doch genau das was spezifiziert ist oder etwa nicht? Hab ich da irgendwo einen Prinzipiellen Fehler drin, der mir jetzt so nicht auffällt oder hab ich was vergessen?
Java:
package de.verratichnicht.pack;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
public class Utils {
public static final String TIMESTAMP_PATTERN = "EEE, dd MMM yyyy HH:mm:ss Z";
public static final String TIMEZONE = "Europe/Berlin";
public static final String UTF_8 = "UTF-8";
public static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
/**
* @param method
* @param resource
* @param datestring
* @param secretKey
* @return
*/
public static final String generateSignature(String method,
String resource,
String datestring,
String secretKey) {
Logger log = Logger.getLogger("de.avs.marktjagd.client.utilities.Utils");
log.debug("-------------------------------------------");
log.debug("method: " + method);
log.debug("resource: " + resource);
log.debug("datestring: " + datestring);
log.debug("secretKey: " + secretKey);
String signature = "";
// build the string to encode
final StringBuffer signatureString = new StringBuffer();
signatureString.append(method);
signatureString.append(resource);
signatureString.append(datestring);
final SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(),
HMAC_SHA1_ALGORITHM);
// Acquire the MAC instance and initialize with the signing key.
Mac mac = null;
try {
mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
}
catch( final NoSuchAlgorithmException e ) {
throw new RuntimeException("Could not find sha1 algorithm", e);
}
try {
mac.init(signingKey);
}
catch( final InvalidKeyException e ) {
throw new RuntimeException("Could not initialize the MAC algorithm", e);
}
// Compute the HMAC on the digest, and set it.
final String canonicalString = convertUTF8(signatureString.toString());
try {
signature = Base64.encodeBase64URLSafeString(mac.doFinal(canonicalString.getBytes(UTF_8)));
}
catch( final IllegalStateException e ) {
signature = null;
e.printStackTrace();
}
catch( final UnsupportedEncodingException e ) {
signature = null;
e.printStackTrace();
}
log.debug("Signature: " + signature);
log.debug("Signature length: " + signature.length());
log.debug("-------------------------------------------");
return signature;
}
/**
* Convert String to UTF-8
*
* @param string
* input string
* @return input string converted to UTF-8 encoding
*/
public static String convertUTF8(final String string) {
try {
return new String(string.getBytes(UTF_8), UTF_8);
}
catch( final UnsupportedEncodingException e ) {
e.printStackTrace();
return null;
}
}
/**
* Erstellen eines passenden Zeitstempels
*
* @return
*/
public static String createRestTimestamp() {
Logger log = Logger.getLogger("de.avs.marktjagd.client.utilities.Utils");
final SimpleDateFormat df = new SimpleDateFormat(TIMESTAMP_PATTERN, Locale.US);
df.setTimeZone(TimeZone.getTimeZone(TIMEZONE));
final String date = df.format(new Date());
return convertUTF8(date);
}
}