我正在嘗試在 java (android) 中設置一個安全的哈希鍵。它沒有得到與 php 端相同的結果(我用作參考并且它有效)。我經(jīng)歷過很多類似的問題,但是(只有一個,我試過但沒有用)沒有一個沒有解決清楚。這是我測試過的代碼。// php code$secureHash = 'ABCD';$secret = '123AE45F';echo '<br> using pack--';echo hash_hmac('sha256', $secureHash, pack('H*', $secret));echo '<br> without using pack--';echo hash_hmac('sha256', $secureHash, $secret, false);帶包裝的f7a009f2c3e654fa48296917ab6372ecb7aa2a24c43fccb70af743f66b6dba55 結果:不帶包裝的結果:fc602f0f6faf2072be9c0b995ee3d603f61414c4beb027b678c90946db6903a2// Java codeprivate String getHashCode(String message, String secretKey) { Mac mac; String result = null; try { byte[] byteKey = secretKey.getBytes(StandardCharsets.UTF_8); final String hmacSHA256 = "HmacSHA256"; mac = Mac.getInstance(hmacSHA256); SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), hmacSHA256); sha256HMAC.init(keySpec); byte[] mac_data = sha256HMAC.doFinal(message.getBytes(StandardCharsets.UTF_8)); result = bytesToHex(mac_data); System.out.println("getHashCode: result " + result); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } return result;}在 Java 代碼中,我得到的輸出為 fc602f0f6faf2072be9c0b995ee3d603f61414c4beb027b678c90946db6903a2與沒有包的php代碼相同。如何獲得與 PHP 相同的輸出,即使用pack('H*', $secret)Java 代碼?
1 回答

拉莫斯之舞
TA貢獻1820條經(jīng)驗 獲得超10個贊
而不是密鑰上的string.getBytes java 函數(shù),我使用他的函數(shù)來獲取字節(jié),
public byte[] hexToString(String hex) {
// hexToString that works at a byte level, not at character level
byte[] output = new byte[(hex.length() + 1) / 2];
for (int i = hex.length() - 1; i >= 0; i -= 2) {
int from = i - 1;
if (from < 0) {
from = 0;
}
String str = hex.substring(from, i + 1);
output[i/2] = (byte)Integer.parseInt(str, 16);
}
return output;
}
現(xiàn)在我得到與 php 端相同的十六進制密鑰。
- 1 回答
- 0 關注
- 309 瀏覽
添加回答
舉報
0/150
提交
取消