2017-12-05 6 views
0

私はAWSシグネチャヘッダーでポストを行うためにjavaを使用しています。署名プロセスは以下のとおりですAWSシグネチャ4:JavaとCrypto-JSはマーチしません

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です。私は、2つの文字列とJavaとPHP間のCanonical Requestに署名する必要があることを比較しました。彼らは一致しています。

私はスペース、コマンド、およびその他の特徴をチェックしました。理由を理解することはできません。 Java HmacSHA256とcrypto-js HmacSHA256は異なるのですか?またはbytesToHexメソッドに何か問題がありますか?

Canonicalのリクエストの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は返す:

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 

任意のヘルプまたは任意のアイデアが理解されるであろう。

+0

両方のプラットフォームで中間鍵(秘密、日付、地域、サービス、署名)キーを16進数でエンコードするのが最善の策です中間値を比較する。不一致がある場合は、問題がフローの早期であることを意味します。渡すものは表示されませんが、日付の値は8バイトの 'yyyymmdd'です。 –

答えて

0

問題が見つかりました。理由は秘密鍵のアルゴリズムが変更されたが、私はその変更を認識していなかった

関連する問題