0

phpで記述され、HMAC_SHA1アルゴリズムでエンコードされたサーバー側(コードを変更できません)にメッセージをハッシュしようとしています。私はJavaでコードを書いています。phpコードは次のとおりです。

$utf8Str = mb_convert_encoding($strToSign, "UTF-8");
$hmac_sha1_str = base64_encode(hash_hmac("sha1", $utf8Str, KEY));
$signature = urlencode($hmac_sha1_str);

私のJavaコードは次のとおりです。

private static String HashStringSign(String toHash){
try {
    String afterUTF = new String(toHash.getBytes(), "UTF-8");
    String res = hmac_sha1(afterUTF, SecretAccessKey);
    String signature = new String(Base64.encode(res.getBytes()));
    String result = URLEncoder.encode(signature);
        return result;
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e);
    }
}

private static String hmac_sha1(String value, String key) {
    try {
        // Get an hmac_sha1 key from the raw key bytes
        byte[] keyBytes = key.getBytes();           
        SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");

        // Get an hmac_sha1 Mac instance and initialize with the signing key
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(signingKey);

        // Compute the hmac on input data bytes
        byte[] rawHmac = mac.doFinal(value.getBytes());

        // Convert raw bytes to Hex
        byte[] hexBytes = new Hex().encode(rawHmac);
        return new String(hexBytes, "UTF-8");
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

私は、phpコードで使用されている各ハッシュメソッドを、ご覧のとおり同じ順序で実行しました。おそらく、PHPでは動作が異なるJavaの関数がありますか?

私が使用しているのは--com.sun.org.apache.xml.internal.security.utils.Base64java.net.URLEncoder、javax.crypto、org.apache.commons.codec.binary

ありがとう!

4

1 に答える 1

0

hash_hmac関数では、4番目のパラメーターをtrueに設定する必要があります。

PHPコードは責任を負わず、Javaのみ:

つまり、PHP側を変更することはできないと言うので、Javaコードに対して次のことを行うことができます。

Javaコードの最後のステップで、生のバイト配列を16進数に変換しました。ただし、PHPは、単なるヘキサデミカルではなく、base64でエンコードされたヘキサデミカルを生成します。

Javaステップの最後に、ヘキサデミカルをbase64でエンコードするだけで、同じ値が得られます。https://stackoverflow.com/questions/9845767/base64-encoder-java#

于 2012-08-19T09:49:30.683 に答える