我在堆栈溢出中看到了一些相同的问题,但它找不到答案。
Android Java:
UHWlHiPrOxxncJTagnlvVcln3xKZ1PKaojFeTMDLXws=
结果:
$str=base64_encode('1234');
$key='1234';
print(base64_encode(hash_hmac('sha256', $str, $key,true)));
在 PHP 代码中:
FBp7PnSG4MQNgcFWAjjlkxNdiqivrmNfnRZur1Dko2Q=
结果:
import turtle
smiles = turtle.Turtle()
smiles.penup()
smiles.goto(-75,150)
smiles.pendown()
smiles.circle(10) #eye one
#angry
smiles.penup()
smiles.goto(-55,170)
smiles.pendown()
smiles.goto(-85, 190)
smiles.penup()
smiles.goto(75, 150)
smiles.pendown()
smiles.circle(10) #eye two
#angry
smiles.penup()
smiles.goto(55, 170)
smiles.pendown()
smiles.goto(85, 190)
smiles.penup()
smiles.goto(0,50)
smiles.pendown()
smiles.circle(-100, 90) #right smile
smiles.penup()
smiles.setheading(180) # <-- look West
smiles.goto(0,50)
smiles.pendown()
smiles.circle(100, 90)
turtle.done()
如您所见,我有不同的结果。我做错了什么?
PS。正如我们所说,我编辑代码,但它没有帮助我。请解释一下为什么我会有不同的结果?
答案 0 :(得分:0)
您有2种方法可以解决它:
删除第1行中的base_encode
$ STR =&#39; eyJoYXNoIjoic29tZVJlcUhhc2hTdHIiLCJhbnN3ZXIiOnRydWV9&#39 ;;
删除print
中的base_encodeprint(hash_hmac(&#39; sha256&#39;,$ str,$ key,true));
答案 1 :(得分:0)
差异在于使用
$str
初始化的 PHPbase64_encode
,但在 JAVA 中,您没有编码在hash_mac
期间
您需要在 hash_mac
之前在base64中对 JAVA 中的str
进行编码
private String hash_hmac(String str, String secret) {
String ss = Base64.encodeToString(str.getBytes("UTF-8"));
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secretKey);
String hash1 = Base64.encodeToString(sha256_HMAC.doFinal(ss.getBytes("UTF-8")));
return hash1;
}
或者只需更改 PHP 代码即可删除
base64
初始化中的str
$str='eyJoYXNoIjoic29tZVJlcUhhc2hTdHIiLCJhbnN3ZXIiOnRydWV9';
答案 2 :(得分:0)
我解决了这个问题!小参数:Base64.NO_WRAP当我将base64字节编码为base64到hmac时。 Tha Android Java代码是:
private String hash_hmac_test(String base_string, String key) throws Exception {
try {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secret = new SecretKeySpec(key.getBytes("UTF-8"), mac.getAlgorithm());
mac.init(secret);
String base_string_base64 = Base64.encodeToString(base_string.getBytes(), Base64.NO_WRAP);
byte[] digest = mac.doFinal(base_string_base64.getBytes());
//android.util.Base64.encodeT
String retVal = Base64.encodeToString(digest,Base64.DEFAULT);
Log.v(TAG, "String: " + base_string);
Log.v(TAG, "String in Base64: " + base_string_base64);
Log.v(TAG, "key: " + key);
Log.v(TAG, "result: " + retVal);
} catch (Exception e) {
System.out.println(e.getMessage());
}
return "ok";
}
在PHP代码中是:
base64_encode(hash_hmac('sha256', base64_encode($str), $key,true))
两个结果都很好! 谢谢大家!