【发布时间】:2014-06-26 11:49:22
【问题描述】:
在 PHP 中我有以下功能:
base64_encode(hash_hmac('sha256', $data, $secret, false));
我正在尝试在 Java 中创建一个函数,该函数将为相同的“数据”和“秘密”参数提供相同的结果。
我尝试使用这个功能:
public static String base64sha256(String data, String secret) {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] res = sha256_HMAC.doFinal(data.getBytes());
return Base64.encodeToString(res, Base64.NO_WRAP);
}
但是对于相同的输入,我得到不同的结果
更新:此功能有效。享受吧。
public static String base64sha256(String data, String secret) {
String hash = null;
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] res = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
hash = getHex(res);
hash = Base64.encodeToString(hash.getBytes("UTF-8"), Base64.NO_WRAP);
} catch (Exception e){}
return hash;
}
static final String HEXES = "0123456789abcdef";
public static String getHex( byte [] raw ) {
if ( raw == null ) {
return null;
}
final StringBuilder hex = new StringBuilder( 2 * raw.length );
for ( final byte b : raw ) {
hex.append(HEXES.charAt((b & 0xF0) >> 4))
.append(HEXES.charAt((b & 0x0F)));
}
return hex.toString();
}
【问题讨论】:
-
数据编码可能吗?例如 ANSI 与 UTF-8?
-
我尝试在两个参数上使用 getBytes("UTF-8") ,结果仍然与 PHP 版本不同
-
查看此问答stackoverflow.com/q/4680661,他们在其中谈论
String.getBytes(),而此stackoverflow.com/q/23066005 位于“相关”下。 -
我查看了这些链接,似乎没有一个示例使用密钥......不过,我根据我在那里阅读的内容创建了一个新的更新版本的代码(你可以看到它在上面)但仍然没有得到我从 php 代码中得到的结果。
-
这行得通!。需要这个来为 Facebook Graph API 生成
appsecret_proof。这会生成与 PHP 中相同的哈希。