HMAC-SHA256 - 怎么样?

问题描述 投票:0回答:1

我在Android中做HMAC-SHA256。这是以下代码:

String baseString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI2NjU0MjA5MGE2NGJhYWU0MzI4NGFiYTY0MmNkNWJmNmFlNzdkNjFhIiwiYXVkIjoiaHR0cHM6Ly9hcHAuaWZvcm1idWlsZGVyLmNvbS9leHphY3QvYXBpL29hdXRoL3Rva2VuIiwiZXhwIjoxNTEwNDMyMzcyLCJpYXQiOjE1MTA0MzE3NzJ9";

String clientSecret = "167edb4d9c3e603131619ae4a92c76307e3f9631";
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new 
SecretKeySpec(clientSecret.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
String jwtSignature = 
Base64.encodeToString(sha256_HMAC.doFinal(baseString.getBytes("UTF-8")), Base64.NO_WRAP);
Log.d("JWT-SIGNATURE", jwtSignature);

我得到JWT-SIGNATURE值为2nFaU / 7jcc99jTWCO0VLriN / fiLwqi / ap7eeuVhhal4 =

相反,正确的JWT-SIGNATURE值应为2nFaU_7jcc99jTWCO0VLriN_fiLwqi_ap7eeuVhhal4

很少有字符不正确,即“/”和最后的“=”。有人可以帮助我。

java android character-encoding hmac
1个回答
0
投票

您需要使用的编码是Base64编码的变体,称为base64url。

来自维基百科:

在URL中使用标准Base64需要将'+','/'和'='字符编码为特殊的百分比编码十六进制序列('+'变为'%2B','/'变为'%2F'并且'='变为'%3D'),这使得字符串不必要地更长。

出于这个原因,存在针对URL变体的修改后的Base64,其中标准Base64的'+'和'/'字符分别被' - '和'_'替换,因此不再需要使用URL编码器/解码器而且没有对编码值的长度的影响,保留相同的编码形式,以便在关系数据库,Web表单和对象标识符中使用。某些变体允许或要求省略填充'='符号以避免它们与字段分隔符混淆,或要求任何此类填充都是百分比编码。有些库会将'='编码为'。'。

© www.soinside.com 2019 - 2024. All rights reserved.