AWS 签名 4:Java 和 Crypto-JS 不前进
AWS signature 4: Java and Crypto-JS does not march
我正在使用 java 使用 AWS 签名 header 做一些 post。签约流程如下
private String calculateSignature(String stringToSign) {
try {
byte[] signatureKey = getSignatureKey(secretAccessKey, currentDate, regionName, serviceName);
byte[] signature = HmacSHA256(stringToSign, signatureKey);
String strHexSignature = bytesToHex(signature);
return strHexSignature;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
private byte[] HmacSHA256(String data, byte[] key) throws Exception {
String algorithm = "HmacSHA256";
Mac mac = Mac.getInstance(algorithm);
mac.init(new SecretKeySpec(key, algorithm));
return mac.doFinal(data.getBytes("UTF8"));
}
private byte[] getSignatureKey(String key, String date, String regionName, String serviceName) throws Exception {
byte[] kSecret = ("AWS4" + key).getBytes("UTF8");
byte[] kDate = HmacSHA256(date, kSecret);
byte[] kRegion = HmacSHA256(regionName, kDate);
byte[] kService = HmacSHA256(serviceName, kRegion);
byte[] kSigning = HmacSHA256(aws4Request, kService);
return kSigning;
}
private String bytesToHex(byte[] bytes) {
final StringBuilder hexString = new StringBuilder();
for(byte b : bytes)
hexString.append(String.format("%02x", b));
return hexString.toString().toLowerCase().trim();
}
但是,当我使用这个签名发送时,它与服务器计算出的签名不匹配。服务端写成PHP,用Crypto-JS计算签名。我比较了 Java 和 PHP 之间的两个需要签名的字符串和 Canonical Request。他们很匹配。
我检查了space、命令和其他特性。但不知道为什么。 Java HmacSHA256 和 crypto-js HmacSHA256 不同吗?或者 bytesToHex 方法有问题?
Canonical Request
的Java输出
POST
/
content-length:667
content-type:application/json
host:host.name.com
x-amz-date:20171205T012629Z
x-amz-target:_20141201.XXXXXXX
content-length;content-type;host;x-amz-date;x-amz-target
c5b31b699700e6debe4548836a723f89b73ffcef6570e1bed4c534c0f247dc26
PHP returns:
POST
/
content-length:667
content-type:application/json
host:host.name.com
x-amz-date:20171205T012629Z
x-amz-target:_20141201.XXXXXXX
content-length;content-type;host;x-amz-date;x-amz-target
c5b31b699700e6debe4548836a723f89b73ffcef6570e1bed4c534c0f247dc26
任何帮助或任何想法将不胜感激。
发现问题。原因是密钥的算法被改变了,但我不知道那个改变
我正在使用 java 使用 AWS 签名 header 做一些 post。签约流程如下
private String calculateSignature(String stringToSign) {
try {
byte[] signatureKey = getSignatureKey(secretAccessKey, currentDate, regionName, serviceName);
byte[] signature = HmacSHA256(stringToSign, signatureKey);
String strHexSignature = bytesToHex(signature);
return strHexSignature;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
private byte[] HmacSHA256(String data, byte[] key) throws Exception {
String algorithm = "HmacSHA256";
Mac mac = Mac.getInstance(algorithm);
mac.init(new SecretKeySpec(key, algorithm));
return mac.doFinal(data.getBytes("UTF8"));
}
private byte[] getSignatureKey(String key, String date, String regionName, String serviceName) throws Exception {
byte[] kSecret = ("AWS4" + key).getBytes("UTF8");
byte[] kDate = HmacSHA256(date, kSecret);
byte[] kRegion = HmacSHA256(regionName, kDate);
byte[] kService = HmacSHA256(serviceName, kRegion);
byte[] kSigning = HmacSHA256(aws4Request, kService);
return kSigning;
}
private String bytesToHex(byte[] bytes) {
final StringBuilder hexString = new StringBuilder();
for(byte b : bytes)
hexString.append(String.format("%02x", b));
return hexString.toString().toLowerCase().trim();
}
但是,当我使用这个签名发送时,它与服务器计算出的签名不匹配。服务端写成PHP,用Crypto-JS计算签名。我比较了 Java 和 PHP 之间的两个需要签名的字符串和 Canonical Request。他们很匹配。
我检查了space、命令和其他特性。但不知道为什么。 Java HmacSHA256 和 crypto-js HmacSHA256 不同吗?或者 bytesToHex 方法有问题?
Canonical Request
的Java输出POST
/
content-length:667
content-type:application/json
host:host.name.com
x-amz-date:20171205T012629Z
x-amz-target:_20141201.XXXXXXX
content-length;content-type;host;x-amz-date;x-amz-target
c5b31b699700e6debe4548836a723f89b73ffcef6570e1bed4c534c0f247dc26
PHP returns:
POST
/
content-length:667
content-type:application/json
host:host.name.com
x-amz-date:20171205T012629Z
x-amz-target:_20141201.XXXXXXX
content-length;content-type;host;x-amz-date;x-amz-target
c5b31b699700e6debe4548836a723f89b73ffcef6570e1bed4c534c0f247dc26
任何帮助或任何想法将不胜感激。
发现问题。原因是密钥的算法被改变了,但我不知道那个改变