我正在嘗試為 sha256 創建一個 base64 hmac。我有兩個相同的代碼,一個在 JS 中,另一個在 Java 中,雖然我是在 android 中做的,而一個 kotlin 也可以幫助我。我主要只使用其他 SO 答案中的代碼。node js 中的那個似乎給出了正確的結果并與后端匹配,但在 java 中卻沒有。這是代碼
const crypto = require('crypto')
const base64urlm = require('base64url')
console.log('hello')
var yourMessage = 'Pritish8-s9';
var sharedSecret = 'Nilesh/ev12/';
//generate hmac sha256 hash
var hmacSignature = crypto.createHmac('SHA256', new Buffer(sharedSecret, 'base64')).update(yourMessage).digest('base64');
hmacSignature = base64urlm.fromBase64(hmacSignature)
console.log(hmacSignature)
它給出的輸出為
_eiq1peyHuPx8yQwzORwoT7wcNdzv2Y0LUp_E70aIvM
以上是正確的值。下面是java代碼。
package com.drivertest.hmactest;
import android.util.Log;
import org.apache.commons.codec.binary.Hex;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class HMAC {
public static String cal() {
try {
String secret = "Nilesh/ev12/";
String message = "Pritish8-s9";
byte[] secretByteArray = new byte[0];
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
secretByteArray = Base64.getEncoder().encode(secret.getBytes());
}
//byte[] secretByteArray = Base64.encodeBase64(secret.getBytes("utf-8"), true);
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secretByteArray, "HmacSHA256");
sha256_HMAC.init(secret_key);
String hash = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
}
System.out.println("hash " hash);
Log.d(" ",hash);
return hash;
}
catch (Exception e){
System.out.println("Error");
}
return "";
}
public static String encode(String key, String data) {
try {
String secret = "Nilesh/ev12/";
String message = "Pritish8-s9";
key=secret;
data=message;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
sha256_HMAC.init(secret_key);
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secretKey);
String hash = android.util.Base64.encodeToString(sha256_HMAC.doFinal(message.getBytes()), android.util.Base64.DEFAULT);
Log.d(" ",hash);
return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8)));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return null;
}
}
在這門課上,我試圖用不同的方式與其他 SO 答案一起做。不幸的是,我得到了一個像
8i/ce0u0GZ JhL3yblsGhaMnFC0UKkUwJSQSXZ3536s=
或者
f22fdc7b4bb4199f8984bdf26e5b0685a327142d142a45302524125d9df9dfab
那么任何人都可以幫助我撰寫相同的 java/kotlin 代碼并在 nodejs 中獲得與上述相同的值嗎?
PS:我已經在隨機站點上驗證了 java 結果,它們似乎匹配,但是我的 api 失敗了這個值,并且只有當它可以與那個 os nodejs 匹配時才會起作用,所以在這個意義上它是不正確的。
謝謝 :)
uj5u.com熱心網友回復:
您的 nodejs 和 Java 實作之間有兩個區別。
首先也是最重要的:在 nodejs 中,您使用 base64解碼您的秘密,而在 Java 中您對其進行編碼:
Base64.getEncoder().encode(secret.getBytes())
將其替換為:
Base64.getDecoder().decode(secret.getBytes())
其次,在 nodejs 中,您base64urlm在對最終結果進行編碼時使用 base64 ( ) 的 URL 變體。在 Java 中,您使用常規的 base64。將其替換為:
Base64.getUrlEncoder().encodeToString(...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/467946.html
標籤:javascript 爪哇 安卓 科特林 hmacsha256
