2017-09-07 3 views
0

Ich versuche eine webhook from starling bank auf einem PHP 7.0.22 (Apache/2.4.6 (Red Hat Enterprise Linux)) Server zu authentifizieren.Java Digest Hash und PHP Hash sind unterschiedlich

Ich habe durch die Unterstützung gesagt, dass die folgenden Java-Code verwendet wird, um die

private String calculateSignature(String sharedSecret, String requestJson) { 
    try { 
    String contentToDigest = sharedSecret + requestJson; 
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-512"); 
    byte[] digest = messageDigest.digest(contentToDigest.getBytes()); 
    return Base64.getEncoder().encodeToString(digest); 
    } catch (NoSuchAlgorithmException e) { 
    throw new RuntimeException("Error calculating digest for payload [" + requestJson + "]", e); 
    } 
} 

Die Sharedsecret zu erzeugen verdauen ich bereits habe und die requestJson ich von der Webhook POST nehmen mit:

$requestJson=file_get_contents('php://input') ; 

mein pHP-Code den Hash zu erzeugen, ist wie folgt:

$concatenated_string=$sharedSecret . json_encode($requestJson) ; 
$generated_hash=base64_encode(hash('sha512', $concatenated_string)); 

Dies ergibt nicht den gleichen Hash. Während Hacking eine Antwort zu versuchen und zu finden, habe ich versucht, auch die folgenden:

$concatenated_string=$sharedSecret . $requestJson ; 

und verschiedenen Hash-Typen und Optionen:

$generated_hash=base64_encode(hash('sha512', $concatenated_string, true)) 
$generated_hash=base64_encode(openssl_digest($concatenated_string, 'sha512')) ; 

Antwort

1

base64_encode und hash effektiv die gleiche Sache in diesem Fall zu tun :

https://stackoverflow.com/a/11195855/3323777

Sie sollten drittes Argument als TRUE bei Ihrer pHP angeben Code der Java-Version entsprechen:

raw_output - auf TRUE wird als Ausgangsausgabedaten zurückbringen, andernfalls ist der Rückgabewert binhex codiert.

http://php.net/manual/ru/function.openssl-digest.php

Ich habe lief Ihre beiden Schnipsel auf Java und PHP und nicht die Differenz gefunden, wenn eine Zeichenfolge „test“ kodiert. Ich rate Ihnen, die Json-Nutzdaten in zwei Dateien in beiden Umgebungen auszugeben und diff zu verwenden, um sie zu vergleichen.