import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class CallbackVerifier {
public static void main(String[] args) throws Exception {
String body = "{\"status\":\"SUCCESS\",\"orderId\":\"ABC123\",\"amount\":100}";
String timestamp = "1699447297";
String signatureBase64 = "REQUEST_HEADER_SIGNATURE_VALUE";
String bodyHash = sha512Hex(body);
String stringToVerify = bodyHash + timestamp;
String publicKeyPem = "-----BEGIN PUBLIC KEY-----\nYOUR_FINIX_PUBLIC_KEY_HERE\n-----END PUBLIC KEY-----";
PublicKey publicKey = loadPublicKey(publicKeyPem);
boolean isValid = verifySignature(publicKey, stringToVerify, signatureBase64);
System.out.println("Signature valid: " + isValid);
}
public static String sha512Hex(String data) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : digest) sb.append(String.format("%02x", b));
return sb.toString();
}
public static PublicKey loadPublicKey(String pem) throws Exception {
pem = pem.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replaceAll("\\s+", "");
byte[] decoded = Base64.getDecoder().decode(pem);
X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded);
return KeyFactory.getInstance("RSA").generatePublic(spec);
}
public static boolean verifySignature(PublicKey publicKey, String data, String signatureBase64) throws Exception {
byte[] signatureBytes = Base64.getDecoder().decode(signatureBase64);
Signature verifier = Signature.getInstance("SHA512withRSA");
verifier.initVerify(publicKey);
verifier.update(data.getBytes(StandardCharsets.UTF_8));
return verifier.verify(signatureBytes);
}
}