如果您使用RSA或椭圆曲线进行签名,不能直接使用Base64编码的密钥字节。取而代之的是,您应该使用signWith方法。例如,在Java中,您可以使用以下代码:
// 使用RSA私钥对消息进行签名 PrivateKey privateKey = ...; byte[] message = ...; Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(message); byte[] signatureBytes = signature.sign();
// 使用Base64编码的密钥字节对消息进行签名(错误的方法) byte[] keyBytes = Base64.getDecoder().decode("..."); Mac mac = Mac.getInstance("HmacSHA256"); SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256"); mac.init(keySpec); byte[] signatureBytes = mac.doFinal(message);
// 使用signWith方法对消息进行签名(正确的方法) byte[] keyBytes = Base64.getDecoder().decode("..."); PrivateKey privateKey = ...; byte[] message = ...; SignatureAlgorithm algorithm = SignatureAlgorithm.RS256; Key key = new SecretKeySpec(keyBytes, algorithm.getJcaName()); byte[] signatureBytes = new JsonWebSignature.Builder(key) .setPayload(message) .build() .getSignatureBytes();