To summarize my problem, I want to adapt an encryption algorithm written in Javascript to the Java side. The content produced here is used in the header of the service I am calling. But even though I have tried many ways, I have not been able to find the real algorithm yet.
The algorithm written in Javascript is as follows:
function doFunction() {
apiSecret = "ZDhhODhlOTI2ZjFmNGQ5MDlhMzg5Y2JhZTQyOGUzNDY=";
date = (new Date()).toUTCString();
signatureContentString = 'date: ' date;
signatureString = CryptoJS.HmacSHA1(signatureContentString, apiSecret).toString(CryptoJS.enc.Base64);
authHeader = encodeURIComponent(signatureString);
alert(authHeader);
}
The algorithm I tried on the Java side is as follows:
public String createCredential(){
Date currentDate = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constants.RFC1123_PATTERN);
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
String date = simpleDateFormat.format(currentDate);
String signatureContentString = "date: " date;
byte[] bytes = HmacUtils.hmacSha1(Constants.apiSecret, signatureContentString);
byte[] encode = Base64.getEncoder().encode(bytes);
String encoded = URLEncoder.encode(encode.toString(), StandardCharsets.UTF_8);
return encoded;
}
Example output when I try it on the javascript side:
rJxRUgl1+xj5UZSC9rZAHxSl7fw=
Example output when I try it on the Java side:
[B@79c7ad7f
The formats do not match each other. By the way, if you need the RFC1123_PATTERN constant;
public static final String RFC1123_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z";
CodePudding user response:
encode.toString()
returns a String representing the byte[]
, s. e.g. here, but not, as you probably assume, an ASCII or UTF8 decoding.
For the latter use in the Java code:
byte[] encode = Base64.getEncoder().encode(bytes);
String encoded = URLEncoder.encode(new String(encode, StandardCharsets.UTF_8), StandardCharsets.UTF_8);
or alternatively:
String encode = Base64.getEncoder().encodeToString(bytes);
String encoded = URLEncoder.encode(encode, StandardCharsets.UTF_8);
Test:
For the date string Sat, 18 Jun 2022 17:07:55 GMT
both codes return the value rSQNB1HOmHEPH982kd9ix0//58A=
.