I am very new to JSON Web Signing and wanted to know how JSW Signing is done in Java. I searched for it but didnt really understood what it needs. I tried using signature algorithm as below: For signing:
Signature signature = Signature.getInstance("SHA256withECDSA");
SecureRandom secureRandom = new SecureRandom();
keyPair = new KeyPair(getPublicKey("path"), getPrivateKey("path"));
signature.initSign((ECPrivateKey)keyPair.getPrivate() ,secureRandom);
byte[] data = securedInput.getBytes(StandardCharsets.UTF_8);
signature.update(data);
digitalSignature = signature.sign();
jswSign = Base64.getUrlEncoder().encodeToString(digitalSignature.toString().getBytes(StandardCharsets.UTF_8));
For verification:
private boolean verifySignature(String decodedSecuredInput,byte[] signature) throws Exception
{
Signature sign;
boolean verified = false;
try {
sign= Signature.getInstance("SHA256withECDSA", BouncyCastleProvider.PROVIDER_NAME);
sign.initVerify(getPublicKey());
byte[] data2 = decodedSecuredInput.getBytes("UTF-8");
sign.update(data2);
verified = sign.verify(signature);
}
Retrieving Public Key like this:
private PublicKey getPublicKey()
{
File file = new File("src\\keyData\\CNserver1571409007.cer");
try
{
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = loadCertificate(certificateFactory, file);
return certificate.getPublicKey();
}
Signature is given by Third Party using SHA256withECDSA algorithm.
It gives Invalid Encoding for signature error when trying to verify. Error: java.security.SignatureException: error decoding signature bytes. at org.bouncycastle.jcajce.provider.asymmetric.util.DSABase.engineVerify(Unknown Source) at java.security.Signature$Delegate.engineVerify(Unknown Source) at java.security.Signature.verify(Unknown Source)