2

PHP バックエンドを Java バックエンドと統合しようとしています。Java バックエンドは、両端で一致するように正しくエンコードおよびハッシュ化する必要があるいくつかの資格情報を想定しています。

Java システムは文字列を一連のバイトに変換し (1)、そのシーケンスの HMAC/SHA256 キー付きハッシュを生成し (2)、base 64 でハッシュをエンコードします (3)。

private static final String HMAC_ALGORITHM = "HmacSHA256";
final SecretKey key = new SecretKeySpec('mysecret', HMAC_ALGORITHM);
final Mac hmac = Mac.getInstance(key.getAlgorithm());
hmac.init(key);
final String stringToHash = "blablabla";
final byte[] bytesToHash = stringToHash.getBytes("UTF8");
final byte[] hash = hmac.doFinal(bytesToHash);
return Base64.encodeBytes(hash);

(1) を実行し、PHP の文字列をバイト シーケンスに変換することができます。

$stringArray = unpack('C*', $string);

// これは機能し、この時点では Java システムとまったく同じです

ただし、2 番目の部分 (2) は一致していないようです。PHP で hmac にバイト配列を渡す方法はありますか

hash_hmac('sha256', $stringArray, $secret);

または、配列をループして魔法をかける必要がありますか?

ありがとう!

4

2 に答える 2

3

私はあなたがunpackphpでする必要があるとは思わない

ちょうど試して

hash_hmac('sha256', $string, $secret, TRUE);

注:実際の文字列を関数に渡し、最後のパラメーターraw_outputはに設定されていますTRUE

アップデート

あなたのJavaコードは間違ったドキュメントのようです

final SecretKey key = new SecretKeySpec('mysecret', HMAC_ALGORITHM);

これは次のようになります

byte[] keyBytes = mysecret.getBytes(); // say mysecret is a String var
final SecretKey key = new SecretKeySpec(keyBytes, HMAC_ALGORITHM);
于 2012-06-21T09:15:04.860 に答える
0

PHP で同じ Java 値を生成する必要があります。それが機能する唯一の方法はこれでした

<?php

$verb = hash_hmac("sha256", "POST" , "9mO6oBVSmb2QTSeN73mEGHHnD", FALSE);

$path = hash_hmac("sha256", '/1.0/benefits/registerBenefit', pack("H*",  $verb), FALSE);

$query = hash_hmac("sha256", "" , pack("H*",  $path), FALSE);

$body  = hash_hmac("sha256", '{"id":"a7d23226-bdfc-4d85-a30a-b2d7eccc36e6","phone_number":"5511973512530","sku":"com.movile.cubes.br.biweekly.homolog","origin":"trade_up_group","application_id":437}' , pack("H*",  $query), FALSE);

$rawSignature   = hash_hmac("sha256", "x-kiwi-signature", pack("H*",  $body), FALSE);

$signature  = base64_encode( pack("H*",  $rawSignature));

var_dump($signature);

そのため、pack("H*", $str) を使用して、Java が生成していたのと同じ値を取得する必要がありました。

于 2018-09-26T18:49:04.200 に答える