HMAC-SHA256 - 怎么样?

时间:2017-11-11 20:33:40

标签: java android character-encoding hmac

我在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

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

1 个答案:

答案 0 :(得分:0)

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

来自维基百科:

  

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

     

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