Hallo,
ich versuche gerade einen API-Client zu programmieren. Das erste Java-Programm seit ca. 8 Jahren.
Eigentlich ist das ganze gar nicht so wirklich schwer, aber leider bin ich jetzt an einem Punkt wo meine Java Kenntnisse am ende sind.
Das Problem ist das ich einen GET-Request an die API schicke, ohne einen GET Body.
Jetzt kann man aber leider den HMAC(SHA256) Hash nicht richtig erstellen weil man dazu ja einen SecretKey benötigt, dieser SecretKey kann aber leider nicht bei einem GET-Request mit übermittelt werden, zumindest nicht in Java(oder besser gesagt, ich nicht).
In PHP kann man die HASH_HMAC einfach ohne ein Secret-Key aufrufen und der Hmac Hash wird trotzdem erstellt. Auch könnte ich in PHP per cUrl einfache einen Customheader für GET erstellen und somit auch den Secret-Key an die API senden.
Hier mal der Code der für den API Aufruf zuständig ist.
Hier noch der Code der zuständig ist für die Erstellung des Hmac-Hash
Wenn ich den Hmac-Hash in PHP erstellen lasse und in dann in der Methode hinterlege liefert die API auch schon die Daten.
Vllt habt ihr ja eine Idee was ich machen könnte damit der Key ohne Secret-Key erstellt wird oder ich den Secret-Key auch bei einem GET-Request mitsenden kann.
Ich hoffe das Problem ist ersichtlich und genau beschrieben.
Vielen dank jetzt schon einmal für eure Hilfe und Zeit dir ihr euch nehmt.
ich versuche gerade einen API-Client zu programmieren. Das erste Java-Programm seit ca. 8 Jahren.
Eigentlich ist das ganze gar nicht so wirklich schwer, aber leider bin ich jetzt an einem Punkt wo meine Java Kenntnisse am ende sind.
Das Problem ist das ich einen GET-Request an die API schicke, ohne einen GET Body.
Jetzt kann man aber leider den HMAC(SHA256) Hash nicht richtig erstellen weil man dazu ja einen SecretKey benötigt, dieser SecretKey kann aber leider nicht bei einem GET-Request mit übermittelt werden, zumindest nicht in Java(oder besser gesagt, ich nicht).
In PHP kann man die HASH_HMAC einfach ohne ein Secret-Key aufrufen und der Hmac Hash wird trotzdem erstellt. Auch könnte ich in PHP per cUrl einfache einen Customheader für GET erstellen und somit auch den Secret-Key an die API senden.
Hier mal der Code der für den API Aufruf zuständig ist.
Java:
private String apiCall( String domain, String publicHash, String privateHash ) {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(domain);
String secret = "[]";
httpget.addHeader("Accept", "application/json");
httpget.addHeader("Content-Type", "application/json");
httpget.addHeader("Public", publicHash);
ApiSecurity privateKey = new ApiSecurity();
privateKey.setPrivateKey(privateHash, secret);
//System.out.println(privateKey.getPrivateKey());
httpget.addHeader("Hash", privateKey.getPrivateKey());
CloseableHttpResponse response = null;
try {
response = httpclient.execute(httpget);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader rd = null;
try {
rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
} catch (UnsupportedOperationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
StringBuffer result = new StringBuffer();
String line = "";
try {
while ((line = rd.readLine()) != null) {
result.append(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result.toString();
}
Hier noch der Code der zuständig ist für die Erstellung des Hmac-Hash
Java:
package API_Client;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class ApiSecurity {
String privateKey = null;
public void setPrivateKey( String key, String secret) {
Mac hashHmac = null;
String algorythmus = "HmacSHA256";
try {
hashHmac = Mac.getInstance(algorythmus);
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), algorythmus);
try {
hashHmac.init(secretKey);
this.toHexString(hashHmac, key);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getPrivateKey() {
return privateKey;
}
private void toHexString( Mac hashObj, String key ) {
String temp = "";
byte[] digest = hashObj.doFinal(key.getBytes());
for (byte b : digest) {
temp += String.format("%02x", b);
}
privateKey = temp;
}
}
Vllt habt ihr ja eine Idee was ich machen könnte damit der Key ohne Secret-Key erstellt wird oder ich den Secret-Key auch bei einem GET-Request mitsenden kann.
Ich hoffe das Problem ist ersichtlich und genau beschrieben.
Vielen dank jetzt schon einmal für eure Hilfe und Zeit dir ihr euch nehmt.